commit 1ac27152e58c3e41fd60de0a4d43491b6bd07e3d Author: yoga-agoy Date: Mon Jun 15 18:18:35 2026 +0530 first commit with latest changes diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..557d8f8 --- /dev/null +++ b/.classpath @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..e84ad9e --- /dev/null +++ b/.project @@ -0,0 +1,31 @@ + + + ContractManagementSystem + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..76c2d63 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..d4540a5 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,10 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..3be8ba0 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..fee60f8 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.name b/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/build/classes/com/cont_mgmt/dbconnection/DbCon.class b/build/classes/com/cont_mgmt/dbconnection/DbCon.class new file mode 100644 index 0000000..23dfbb1 Binary files /dev/null and b/build/classes/com/cont_mgmt/dbconnection/DbCon.class differ diff --git a/build/classes/com/cont_mgmt/dto/Bill.class b/build/classes/com/cont_mgmt/dto/Bill.class new file mode 100644 index 0000000..37eb9b2 Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/Bill.class differ diff --git a/build/classes/com/cont_mgmt/dto/BillStat.class b/build/classes/com/cont_mgmt/dto/BillStat.class new file mode 100644 index 0000000..4b3f447 Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/BillStat.class differ diff --git a/build/classes/com/cont_mgmt/dto/Contract.class b/build/classes/com/cont_mgmt/dto/Contract.class new file mode 100644 index 0000000..74f2b83 Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/Contract.class differ diff --git a/build/classes/com/cont_mgmt/dto/InvoiceBillType.class b/build/classes/com/cont_mgmt/dto/InvoiceBillType.class new file mode 100644 index 0000000..e9b3b2e Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/InvoiceBillType.class differ diff --git a/build/classes/com/cont_mgmt/dto/ProdCat.class b/build/classes/com/cont_mgmt/dto/ProdCat.class new file mode 100644 index 0000000..f6b383c Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/ProdCat.class differ diff --git a/build/classes/com/cont_mgmt/dto/User.class b/build/classes/com/cont_mgmt/dto/User.class new file mode 100644 index 0000000..3b76f50 Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/User.class differ diff --git a/build/classes/com/cont_mgmt/dto/Vendor.class b/build/classes/com/cont_mgmt/dto/Vendor.class new file mode 100644 index 0000000..98ba0bf Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/Vendor.class differ diff --git a/build/classes/com/cont_mgmt/dto/WhatsAppMessage.class b/build/classes/com/cont_mgmt/dto/WhatsAppMessage.class new file mode 100644 index 0000000..fd3def3 Binary files /dev/null and b/build/classes/com/cont_mgmt/dto/WhatsAppMessage.class differ diff --git a/build/classes/com/cont_mgmt/listener/WhatsAppMessageSenderListener$1.class b/build/classes/com/cont_mgmt/listener/WhatsAppMessageSenderListener$1.class new file mode 100644 index 0000000..8bed8d8 Binary files /dev/null and b/build/classes/com/cont_mgmt/listener/WhatsAppMessageSenderListener$1.class differ diff --git a/build/classes/com/cont_mgmt/listener/WhatsAppMessageSenderListener.class b/build/classes/com/cont_mgmt/listener/WhatsAppMessageSenderListener.class new file mode 100644 index 0000000..0efdb63 Binary files /dev/null and b/build/classes/com/cont_mgmt/listener/WhatsAppMessageSenderListener.class differ diff --git a/build/classes/com/cont_mgmt/repository/ClosureContDet.class b/build/classes/com/cont_mgmt/repository/ClosureContDet.class new file mode 100644 index 0000000..a54f14e Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/ClosureContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/ClosureExtContDet.class b/build/classes/com/cont_mgmt/repository/ClosureExtContDet.class new file mode 100644 index 0000000..583decd Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/ClosureExtContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/DeleteBillDet.class b/build/classes/com/cont_mgmt/repository/DeleteBillDet.class new file mode 100644 index 0000000..2e544fd Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/DeleteBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/DeleteContDet.class b/build/classes/com/cont_mgmt/repository/DeleteContDet.class new file mode 100644 index 0000000..a7d8e08 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/DeleteContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/DeleteExtBillDet.class b/build/classes/com/cont_mgmt/repository/DeleteExtBillDet.class new file mode 100644 index 0000000..ef626be Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/DeleteExtBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/DeleteExtContDet.class b/build/classes/com/cont_mgmt/repository/DeleteExtContDet.class new file mode 100644 index 0000000..2e950d2 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/DeleteExtContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/DeleteVendDet.class b/build/classes/com/cont_mgmt/repository/DeleteVendDet.class new file mode 100644 index 0000000..0236d26 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/DeleteVendDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchAllContDet.class b/build/classes/com/cont_mgmt/repository/FetchAllContDet.class new file mode 100644 index 0000000..14278db Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchAllContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchAllVendDet.class b/build/classes/com/cont_mgmt/repository/FetchAllVendDet.class new file mode 100644 index 0000000..ea72c86 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchAllVendDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchAmtDueByContNum.class b/build/classes/com/cont_mgmt/repository/FetchAmtDueByContNum.class new file mode 100644 index 0000000..dc338d8 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchAmtDueByContNum.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchAmtDueByExtContNum.class b/build/classes/com/cont_mgmt/repository/FetchAmtDueByExtContNum.class new file mode 100644 index 0000000..1471e00 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchAmtDueByExtContNum.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchBillDet.class b/build/classes/com/cont_mgmt/repository/FetchBillDet.class new file mode 100644 index 0000000..df00b5e Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchBillStatDet.class b/build/classes/com/cont_mgmt/repository/FetchBillStatDet.class new file mode 100644 index 0000000..2729f74 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchBillStatDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchContDet.class b/build/classes/com/cont_mgmt/repository/FetchContDet.class new file mode 100644 index 0000000..994ed69 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchContDetByDates.class b/build/classes/com/cont_mgmt/repository/FetchContDetByDates.class new file mode 100644 index 0000000..ee49482 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchContDetByDates.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExistBillDet.class b/build/classes/com/cont_mgmt/repository/FetchExistBillDet.class new file mode 100644 index 0000000..fc58ffd Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExistBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExistContDet.class b/build/classes/com/cont_mgmt/repository/FetchExistContDet.class new file mode 100644 index 0000000..6153950 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExistContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExistExtBillDet.class b/build/classes/com/cont_mgmt/repository/FetchExistExtBillDet.class new file mode 100644 index 0000000..b5fbc1b Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExistExtBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExistExtContDet.class b/build/classes/com/cont_mgmt/repository/FetchExistExtContDet.class new file mode 100644 index 0000000..52dcbc9 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExistExtContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExistVendDet.class b/build/classes/com/cont_mgmt/repository/FetchExistVendDet.class new file mode 100644 index 0000000..20b1f83 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExistVendDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExtBillDet.class b/build/classes/com/cont_mgmt/repository/FetchExtBillDet.class new file mode 100644 index 0000000..4026a89 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExtBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExtContDet.class b/build/classes/com/cont_mgmt/repository/FetchExtContDet.class new file mode 100644 index 0000000..900929b Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExtContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchExtInvoiceBillDateDet.class b/build/classes/com/cont_mgmt/repository/FetchExtInvoiceBillDateDet.class new file mode 100644 index 0000000..a0f048d Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchExtInvoiceBillDateDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchInvoiceBillDateDet.class b/build/classes/com/cont_mgmt/repository/FetchInvoiceBillDateDet.class new file mode 100644 index 0000000..f9280c8 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchInvoiceBillDateDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchInvoiceBillTypeDet.class b/build/classes/com/cont_mgmt/repository/FetchInvoiceBillTypeDet.class new file mode 100644 index 0000000..9cedf31 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchInvoiceBillTypeDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchProdCatDet.class b/build/classes/com/cont_mgmt/repository/FetchProdCatDet.class new file mode 100644 index 0000000..fbb0d3a Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchProdCatDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchStats.class b/build/classes/com/cont_mgmt/repository/FetchStats.class new file mode 100644 index 0000000..f36036c Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchStats.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchTotAmtDueByContNum.class b/build/classes/com/cont_mgmt/repository/FetchTotAmtDueByContNum.class new file mode 100644 index 0000000..dea1b86 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchTotAmtDueByContNum.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchTotAmtDueByExtContNum.class b/build/classes/com/cont_mgmt/repository/FetchTotAmtDueByExtContNum.class new file mode 100644 index 0000000..79a98b4 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchTotAmtDueByExtContNum.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchUserLoginDet.class b/build/classes/com/cont_mgmt/repository/FetchUserLoginDet.class new file mode 100644 index 0000000..2e23f79 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchUserLoginDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchVendDet.class b/build/classes/com/cont_mgmt/repository/FetchVendDet.class new file mode 100644 index 0000000..5a826ee Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchVendDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/FetchWorkTypeSuggestions.class b/build/classes/com/cont_mgmt/repository/FetchWorkTypeSuggestions.class new file mode 100644 index 0000000..123e8a0 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/FetchWorkTypeSuggestions.class differ diff --git a/build/classes/com/cont_mgmt/repository/InsertBillDet.class b/build/classes/com/cont_mgmt/repository/InsertBillDet.class new file mode 100644 index 0000000..8a261bf Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/InsertBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/InsertContDet.class b/build/classes/com/cont_mgmt/repository/InsertContDet.class new file mode 100644 index 0000000..5e6da52 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/InsertContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/InsertExtBillDet.class b/build/classes/com/cont_mgmt/repository/InsertExtBillDet.class new file mode 100644 index 0000000..847b3bf Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/InsertExtBillDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/InsertExtContDet.class b/build/classes/com/cont_mgmt/repository/InsertExtContDet.class new file mode 100644 index 0000000..93233be Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/InsertExtContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/InsertLogDet.class b/build/classes/com/cont_mgmt/repository/InsertLogDet.class new file mode 100644 index 0000000..961a67f Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/InsertLogDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/InsertVendDet.class b/build/classes/com/cont_mgmt/repository/InsertVendDet.class new file mode 100644 index 0000000..2ac1ffd Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/InsertVendDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/ModifyBillStat.class b/build/classes/com/cont_mgmt/repository/ModifyBillStat.class new file mode 100644 index 0000000..9f5bcb7 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/ModifyBillStat.class differ diff --git a/build/classes/com/cont_mgmt/repository/ModifyExtBillStat.class b/build/classes/com/cont_mgmt/repository/ModifyExtBillStat.class new file mode 100644 index 0000000..74ca529 Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/ModifyExtBillStat.class differ diff --git a/build/classes/com/cont_mgmt/repository/UpdateContDet.class b/build/classes/com/cont_mgmt/repository/UpdateContDet.class new file mode 100644 index 0000000..c64118a Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/UpdateContDet.class differ diff --git a/build/classes/com/cont_mgmt/repository/UpdateContRmrk.class b/build/classes/com/cont_mgmt/repository/UpdateContRmrk.class new file mode 100644 index 0000000..5da59dc Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/UpdateContRmrk.class differ diff --git a/build/classes/com/cont_mgmt/repository/UpdateExtContDet.class b/build/classes/com/cont_mgmt/repository/UpdateExtContDet.class new file mode 100644 index 0000000..9e3022e Binary files /dev/null and b/build/classes/com/cont_mgmt/repository/UpdateExtContDet.class differ diff --git a/build/classes/com/cont_mgmt/service/CloseContDetService.class b/build/classes/com/cont_mgmt/service/CloseContDetService.class new file mode 100644 index 0000000..ada905e Binary files /dev/null and b/build/classes/com/cont_mgmt/service/CloseContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/CloseExtContDetService.class b/build/classes/com/cont_mgmt/service/CloseExtContDetService.class new file mode 100644 index 0000000..c3c795d Binary files /dev/null and b/build/classes/com/cont_mgmt/service/CloseExtContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/CustRepDetService.class b/build/classes/com/cont_mgmt/service/CustRepDetService.class new file mode 100644 index 0000000..a1132e5 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/CustRepDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistBillDetService.class b/build/classes/com/cont_mgmt/service/ExistBillDetService.class new file mode 100644 index 0000000..4371f19 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistBillDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistBillStatDetService.class b/build/classes/com/cont_mgmt/service/ExistBillStatDetService.class new file mode 100644 index 0000000..0a2ad33 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistBillStatDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistContDetService.class b/build/classes/com/cont_mgmt/service/ExistContDetService.class new file mode 100644 index 0000000..5013a37 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistExtBillDetService.class b/build/classes/com/cont_mgmt/service/ExistExtBillDetService.class new file mode 100644 index 0000000..91041b5 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistExtBillDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistExtContDetService.class b/build/classes/com/cont_mgmt/service/ExistExtContDetService.class new file mode 100644 index 0000000..9dbfa8d Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistExtContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistExtInvoiceBillDateService.class b/build/classes/com/cont_mgmt/service/ExistExtInvoiceBillDateService.class new file mode 100644 index 0000000..2fb8882 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistExtInvoiceBillDateService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistInvoiceBillDateService.class b/build/classes/com/cont_mgmt/service/ExistInvoiceBillDateService.class new file mode 100644 index 0000000..e71ef8e Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistInvoiceBillDateService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistInvoiceBillTypeDetService.class b/build/classes/com/cont_mgmt/service/ExistInvoiceBillTypeDetService.class new file mode 100644 index 0000000..a1d4aac Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistInvoiceBillTypeDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistProdCatDetService.class b/build/classes/com/cont_mgmt/service/ExistProdCatDetService.class new file mode 100644 index 0000000..7725ada Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistProdCatDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExistVendDetService.class b/build/classes/com/cont_mgmt/service/ExistVendDetService.class new file mode 100644 index 0000000..9c2e08a Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExistVendDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExtBillDetService.class b/build/classes/com/cont_mgmt/service/ExtBillDetService.class new file mode 100644 index 0000000..e453a36 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExtBillDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ExtContDetService.class b/build/classes/com/cont_mgmt/service/ExtContDetService.class new file mode 100644 index 0000000..3febfdc Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ExtContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/FileService.class b/build/classes/com/cont_mgmt/service/FileService.class new file mode 100644 index 0000000..99bf21e Binary files /dev/null and b/build/classes/com/cont_mgmt/service/FileService.class differ diff --git a/build/classes/com/cont_mgmt/service/LogDetService.class b/build/classes/com/cont_mgmt/service/LogDetService.class new file mode 100644 index 0000000..a68c37b Binary files /dev/null and b/build/classes/com/cont_mgmt/service/LogDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/ModifyBillStatService.class b/build/classes/com/cont_mgmt/service/ModifyBillStatService.class new file mode 100644 index 0000000..4fc94fd Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ModifyBillStatService.class differ diff --git a/build/classes/com/cont_mgmt/service/ModifyExtBillStatService.class b/build/classes/com/cont_mgmt/service/ModifyExtBillStatService.class new file mode 100644 index 0000000..0dafcd8 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/ModifyExtBillStatService.class differ diff --git a/build/classes/com/cont_mgmt/service/NewBillDetService.class b/build/classes/com/cont_mgmt/service/NewBillDetService.class new file mode 100644 index 0000000..a63840d Binary files /dev/null and b/build/classes/com/cont_mgmt/service/NewBillDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/NewContDetService.class b/build/classes/com/cont_mgmt/service/NewContDetService.class new file mode 100644 index 0000000..4759c83 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/NewContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/NewVendDetService.class b/build/classes/com/cont_mgmt/service/NewVendDetService.class new file mode 100644 index 0000000..1116982 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/NewVendDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/StatsService.class b/build/classes/com/cont_mgmt/service/StatsService.class new file mode 100644 index 0000000..fa81b36 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/StatsService.class differ diff --git a/build/classes/com/cont_mgmt/service/UpdContDetService.class b/build/classes/com/cont_mgmt/service/UpdContDetService.class new file mode 100644 index 0000000..18bd25c Binary files /dev/null and b/build/classes/com/cont_mgmt/service/UpdContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/UpdContRmrkService.class b/build/classes/com/cont_mgmt/service/UpdContRmrkService.class new file mode 100644 index 0000000..f61d9a4 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/UpdContRmrkService.class differ diff --git a/build/classes/com/cont_mgmt/service/UpdExtContDetService.class b/build/classes/com/cont_mgmt/service/UpdExtContDetService.class new file mode 100644 index 0000000..c60b028 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/UpdExtContDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/UserLoginDetService.class b/build/classes/com/cont_mgmt/service/UserLoginDetService.class new file mode 100644 index 0000000..7024944 Binary files /dev/null and b/build/classes/com/cont_mgmt/service/UserLoginDetService.class differ diff --git a/build/classes/com/cont_mgmt/service/WhatsAppMessageSenderService.class b/build/classes/com/cont_mgmt/service/WhatsAppMessageSenderService.class new file mode 100644 index 0000000..269494f Binary files /dev/null and b/build/classes/com/cont_mgmt/service/WhatsAppMessageSenderService.class differ diff --git a/build/classes/com/cont_mgmt/service/WorkTypeSearchService.class b/build/classes/com/cont_mgmt/service/WorkTypeSearchService.class new file mode 100644 index 0000000..33e9f0b Binary files /dev/null and b/build/classes/com/cont_mgmt/service/WorkTypeSearchService.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ActContDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ActContDetMsgServlet.class new file mode 100644 index 0000000..481c9cc Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ActContDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/CloseContDetServlet.class b/build/classes/com/cont_mgmt/servlet/CloseContDetServlet.class new file mode 100644 index 0000000..b453c2a Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/CloseContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/CloseExtContDetServlet.class b/build/classes/com/cont_mgmt/servlet/CloseExtContDetServlet.class new file mode 100644 index 0000000..4ae434f Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/CloseExtContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/CustRepDetServlet.class b/build/classes/com/cont_mgmt/servlet/CustRepDetServlet.class new file mode 100644 index 0000000..55341d2 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/CustRepDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistActBillDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExistActBillDetMsgServlet.class new file mode 100644 index 0000000..b23f4e9 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistActBillDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistActExtBillDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExistActExtBillDetMsgServlet.class new file mode 100644 index 0000000..d7d9d03 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistActExtBillDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistBillDetServlet.class b/build/classes/com/cont_mgmt/servlet/ExistBillDetServlet.class new file mode 100644 index 0000000..8296706 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistBillDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistContDetServlet.class b/build/classes/com/cont_mgmt/servlet/ExistContDetServlet.class new file mode 100644 index 0000000..b4493cc Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistExpBillDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExistExpBillDetMsgServlet.class new file mode 100644 index 0000000..3072467 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistExpBillDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistExpExtBillDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExistExpExtBillDetMsgServlet.class new file mode 100644 index 0000000..1ada486 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistExpExtBillDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistExpdBillDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExistExpdBillDetMsgServlet.class new file mode 100644 index 0000000..d2ddb43 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistExpdBillDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistExpdExtBillDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExistExpdExtBillDetMsgServlet.class new file mode 100644 index 0000000..4c49f24 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistExpdExtBillDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistExtBillDetServlet.class b/build/classes/com/cont_mgmt/servlet/ExistExtBillDetServlet.class new file mode 100644 index 0000000..6082dd0 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistExtBillDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExistVendDetServlet.class b/build/classes/com/cont_mgmt/servlet/ExistVendDetServlet.class new file mode 100644 index 0000000..4579f78 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExistVendDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExpContDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExpContDetMsgServlet.class new file mode 100644 index 0000000..048e17a Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExpContDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExpContDetServlet.class b/build/classes/com/cont_mgmt/servlet/ExpContDetServlet.class new file mode 100644 index 0000000..a60e990 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExpContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExpdContDetMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ExpdContDetMsgServlet.class new file mode 100644 index 0000000..64ed99f Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExpdContDetMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExtBillDetServlet.class b/build/classes/com/cont_mgmt/servlet/ExtBillDetServlet.class new file mode 100644 index 0000000..264d83a Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExtBillDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ExtContDetServlet.class b/build/classes/com/cont_mgmt/servlet/ExtContDetServlet.class new file mode 100644 index 0000000..3c97bce Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ExtContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ModifyBillStatServlet.class b/build/classes/com/cont_mgmt/servlet/ModifyBillStatServlet.class new file mode 100644 index 0000000..c151460 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ModifyBillStatServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ModifyExtBillStatServlet.class b/build/classes/com/cont_mgmt/servlet/ModifyExtBillStatServlet.class new file mode 100644 index 0000000..8209a26 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ModifyExtBillStatServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/NewBillDetServlet.class b/build/classes/com/cont_mgmt/servlet/NewBillDetServlet.class new file mode 100644 index 0000000..806d76b Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/NewBillDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/NewContDetServlet.class b/build/classes/com/cont_mgmt/servlet/NewContDetServlet.class new file mode 100644 index 0000000..82f31e4 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/NewContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/NewVendDetServlet.class b/build/classes/com/cont_mgmt/servlet/NewVendDetServlet.class new file mode 100644 index 0000000..c0e2711 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/NewVendDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/UpdContDetServlet.class b/build/classes/com/cont_mgmt/servlet/UpdContDetServlet.class new file mode 100644 index 0000000..b6e6f3c Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/UpdContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/UpdContRmrkServlet.class b/build/classes/com/cont_mgmt/servlet/UpdContRmrkServlet.class new file mode 100644 index 0000000..fc9b9f0 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/UpdContRmrkServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/UpdExtContDetServlet.class b/build/classes/com/cont_mgmt/servlet/UpdExtContDetServlet.class new file mode 100644 index 0000000..4fd0f86 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/UpdExtContDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/UserLoginDetServlet.class b/build/classes/com/cont_mgmt/servlet/UserLoginDetServlet.class new file mode 100644 index 0000000..6c01383 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/UserLoginDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/UserLogoutDetServlet.class b/build/classes/com/cont_mgmt/servlet/UserLogoutDetServlet.class new file mode 100644 index 0000000..89523fe Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/UserLogoutDetServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ViewActFileMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ViewActFileMsgServlet.class new file mode 100644 index 0000000..ce0098b Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ViewActFileMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ViewExpFileMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ViewExpFileMsgServlet.class new file mode 100644 index 0000000..f0ed5ca Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ViewExpFileMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ViewExpdFileMsgServlet.class b/build/classes/com/cont_mgmt/servlet/ViewExpdFileMsgServlet.class new file mode 100644 index 0000000..e0bd131 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ViewExpdFileMsgServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/ViewFileServlet.class b/build/classes/com/cont_mgmt/servlet/ViewFileServlet.class new file mode 100644 index 0000000..31d0695 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/ViewFileServlet.class differ diff --git a/build/classes/com/cont_mgmt/servlet/WorkTypeSearchServlet.class b/build/classes/com/cont_mgmt/servlet/WorkTypeSearchServlet.class new file mode 100644 index 0000000..baf6c04 Binary files /dev/null and b/build/classes/com/cont_mgmt/servlet/WorkTypeSearchServlet.class differ diff --git a/build/classes/com/cont_mgmt/util/NetworkUtils.class b/build/classes/com/cont_mgmt/util/NetworkUtils.class new file mode 100644 index 0000000..8ea5e49 Binary files /dev/null and b/build/classes/com/cont_mgmt/util/NetworkUtils.class differ diff --git a/build/classes/com/cont_mgmt/util/ServletUtils.class b/build/classes/com/cont_mgmt/util/ServletUtils.class new file mode 100644 index 0000000..1ef5448 Binary files /dev/null and b/build/classes/com/cont_mgmt/util/ServletUtils.class differ diff --git a/build/classes/com/cont_mgmt/util/StringUtils.class b/build/classes/com/cont_mgmt/util/StringUtils.class new file mode 100644 index 0000000..54aa80c Binary files /dev/null and b/build/classes/com/cont_mgmt/util/StringUtils.class differ diff --git a/build/classes/com/cont_mgmt/util/TimeUtils.class b/build/classes/com/cont_mgmt/util/TimeUtils.class new file mode 100644 index 0000000..dcff6ad Binary files /dev/null and b/build/classes/com/cont_mgmt/util/TimeUtils.class differ diff --git a/build/classes/com/cont_mgmt/util/WhatsAppMessageSender.class b/build/classes/com/cont_mgmt/util/WhatsAppMessageSender.class new file mode 100644 index 0000000..602b265 Binary files /dev/null and b/build/classes/com/cont_mgmt/util/WhatsAppMessageSender.class differ diff --git a/build/classes/com/cont_mgmt/wrapper/BillDetListWrapper.class b/build/classes/com/cont_mgmt/wrapper/BillDetListWrapper.class new file mode 100644 index 0000000..68604d3 Binary files /dev/null and b/build/classes/com/cont_mgmt/wrapper/BillDetListWrapper.class differ diff --git a/build/classes/com/cont_mgmt/wrapper/BillStatDetListWrapper.class b/build/classes/com/cont_mgmt/wrapper/BillStatDetListWrapper.class new file mode 100644 index 0000000..1bfa442 Binary files /dev/null and b/build/classes/com/cont_mgmt/wrapper/BillStatDetListWrapper.class differ diff --git a/build/classes/com/cont_mgmt/wrapper/ContDetListWrapper.class b/build/classes/com/cont_mgmt/wrapper/ContDetListWrapper.class new file mode 100644 index 0000000..3eebf1b Binary files /dev/null and b/build/classes/com/cont_mgmt/wrapper/ContDetListWrapper.class differ diff --git a/build/classes/com/cont_mgmt/wrapper/InvoiceBillTypeDetListWrapper.class b/build/classes/com/cont_mgmt/wrapper/InvoiceBillTypeDetListWrapper.class new file mode 100644 index 0000000..f5fbd64 Binary files /dev/null and b/build/classes/com/cont_mgmt/wrapper/InvoiceBillTypeDetListWrapper.class differ diff --git a/build/classes/com/cont_mgmt/wrapper/ProdCatDetListWrapper.class b/build/classes/com/cont_mgmt/wrapper/ProdCatDetListWrapper.class new file mode 100644 index 0000000..bae564d Binary files /dev/null and b/build/classes/com/cont_mgmt/wrapper/ProdCatDetListWrapper.class differ diff --git a/build/classes/com/cont_mgmt/wrapper/VendDetListWrapper.class b/build/classes/com/cont_mgmt/wrapper/VendDetListWrapper.class new file mode 100644 index 0000000..da1f9f2 Binary files /dev/null and b/build/classes/com/cont_mgmt/wrapper/VendDetListWrapper.class differ diff --git a/src/main/java/com/cont_mgmt/dbconnection/DbCon.java b/src/main/java/com/cont_mgmt/dbconnection/DbCon.java new file mode 100644 index 0000000..5ab9243 --- /dev/null +++ b/src/main/java/com/cont_mgmt/dbconnection/DbCon.java @@ -0,0 +1,42 @@ +package com.cont_mgmt.dbconnection; + +import java.sql.Connection; +import java.sql.SQLException; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.sql.DataSource; + +/** + * DbCon - Provides database connections via WAR-local JNDI DataSource. + */ +public class DbCon { + + private final DataSource dataSource; + + /** + * Constructor looks up the JNDI DataSource defined in META-INF/context.xml + */ + public DbCon() { + try { + // --- Lookup local environment entries from context.xml --- + Context initContext = new InitialContext(); + // Lookup must include "java:comp/env/" prefix + dataSource = (DataSource) initContext.lookup("java:comp/env/jdbc/ContractDB"); + } catch (Exception e) { + throw new RuntimeException("Failed to lookup JNDI DataSource 'jdbc/ContractDB': " + e.getMessage()); + } + } + + /** + * Returns a pooled database connection. + * + * @return java.sql.Connection from Tomcat-managed pool + * @throws SQLException if unable to get a connection + */ + public Connection oracleCon() throws ClassNotFoundException, SQLException { + return dataSource.getConnection(); + /* Class.forName(oracleDriver); */ + /*return DriverManager.getConnection(oracleDbUrl, oracleUsername, oraclePassword);*/ + } +} diff --git a/src/main/java/com/cont_mgmt/dto/Bill.java b/src/main/java/com/cont_mgmt/dto/Bill.java new file mode 100644 index 0000000..6922a73 --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/Bill.java @@ -0,0 +1,218 @@ +package com.cont_mgmt.dto; + +public class Bill { + + private String invoiceBillingPeriod; + private String invoiceStartDate; + private String invoiceEndDate; + private double contAmt; + private double amtPaid; + private double amtDue; + private double amtExclTax; + private double cgstAmt; + private double sgstAmt; + private double igstAmt; + private double totAmt; + private String billStatName; + private String billFilePath; + private String invoiceBillDate; + private String invoiceFilePath; + private String rtgsFilePath; + private double itTaxAmt; + private double percentApplied; + private double snaRetAmt; + + public double getSnaRetAmt() { + return snaRetAmt; + } + + public void setSnaRetAmt(double snaRetAmt) { + this.snaRetAmt = snaRetAmt; + } + + public double getPercentApplied() { + return percentApplied; + } + + public void setPercentApplied(double percentApplied) { + this.percentApplied = percentApplied; + } + + public double getItTaxAmt() { + return itTaxAmt; + } + + public void setItTaxAmt(double itTaxAmt) { + this.itTaxAmt = itTaxAmt; + } + + public String getInvoiceFilePath() { + return invoiceFilePath; + } + + public void setInvoiceFilePath(String invoiceFilePath) { + this.invoiceFilePath = invoiceFilePath; + } + + public String getInvoiceBillDate() { + return invoiceBillDate; + } + + public void setInvoiceBillDate(String invoiceBillDate) { + this.invoiceBillDate = invoiceBillDate; + } + + public Bill() { + super(); + } + + public String getInvoiceBillingPeriod() { + return invoiceBillingPeriod; + } + + public void setInvoiceBillingPeriod(String invoiceBillingPeriod) { + this.invoiceBillingPeriod = invoiceBillingPeriod; + } + + public String getInvoiceStartDate() { + return invoiceStartDate; + } + + public void setInvoiceStartDate(String invoiceStartDate) { + this.invoiceStartDate = invoiceStartDate; + } + + public String getInvoiceEndDate() { + return invoiceEndDate; + } + + public void setInvoiceEndDate(String invoiceEndDate) { + this.invoiceEndDate = invoiceEndDate; + } + + public double getContAmt() { + return contAmt; + } + + public void setContAmt(double contAmt) { + this.contAmt = contAmt; + } + + public double getAmtPaid() { + return amtPaid; + } + + public void setAmtPaid(double amtPaid) { + this.amtPaid = amtPaid; + } + + public double getAmtDue() { + return amtDue; + } + + public void setAmtDue(double amtDue) { + this.amtDue = amtDue; + } + + public double getAmtExclTax() { + return amtExclTax; + } + + public void setAmtExclTax(double amtExclTax) { + this.amtExclTax = amtExclTax; + } + + public double getCgstAmt() { + return cgstAmt; + } + + public void setCgstAmt(double cgstAmt) { + this.cgstAmt = cgstAmt; + } + + public double getSgstAmt() { + return sgstAmt; + } + + public void setSgstAmt(double sgstAmt) { + this.sgstAmt = sgstAmt; + } + + public double getIgstAmt() { + return igstAmt; + } + + public void setIgstAmt(double igstAmt) { + this.igstAmt = igstAmt; + } + + public double getTotAmt() { + return totAmt; + } + + public void setTotAmt(double totAmt) { + this.totAmt = totAmt; + } + + public String getBillStatName() { + return billStatName; + } + + public void setBillStatName(String billStatName) { + this.billStatName = billStatName; + } + + public String getBillFilePath() { + return billFilePath; + } + + public void setBillFilePath(String billFilePath) { + this.billFilePath = billFilePath; + } + + public String getRtgsFilePath() { + return rtgsFilePath; + } + + public void setRtgsFilePath(String rtgsFilePath) { + this.rtgsFilePath = rtgsFilePath; + } + + @Override + public String toString() { + return "Bill [invoiceBillingPeriod=" + invoiceBillingPeriod + ", invoiceStartDate=" + invoiceStartDate + + ", invoiceEndDate=" + invoiceEndDate + ", contAmt=" + contAmt + ", amtPaid=" + amtPaid + ", amtDue=" + + amtDue + ", amtExclTax=" + amtExclTax + ", cgstAmt=" + cgstAmt + ", sgstAmt=" + sgstAmt + ", igstAmt=" + + igstAmt + ", totAmt=" + totAmt + ", billStatName=" + billStatName + ", billFilePath=" + billFilePath + + ", invoiceBillDate=" + invoiceBillDate + ", invoiceFilePath=" + invoiceFilePath + ", rtgsFilePath=" + + rtgsFilePath + ", itTaxAmt=" + itTaxAmt + ", percentApplied=" + percentApplied + ", snaRetAmt=" + + snaRetAmt + "]"; + } + + public Bill(String invoiceBillingPeriod, String invoiceStartDate, String invoiceEndDate, double contAmt, + double amtPaid, double amtDue, double amtExclTax, double cgstAmt, double sgstAmt, double igstAmt, + double totAmt, String billStatName, String billFilePath, String invoiceBillDate, String invoiceFilePath, + String rtgsFilePath, double itTaxAmt, double percentApplied, double snaRetAmt) { + super(); + this.invoiceBillingPeriod = invoiceBillingPeriod; + this.invoiceStartDate = invoiceStartDate; + this.invoiceEndDate = invoiceEndDate; + this.contAmt = contAmt; + this.amtPaid = amtPaid; + this.amtDue = amtDue; + this.amtExclTax = amtExclTax; + this.cgstAmt = cgstAmt; + this.sgstAmt = sgstAmt; + this.igstAmt = igstAmt; + this.totAmt = totAmt; + this.billStatName = billStatName; + this.billFilePath = billFilePath; + this.invoiceBillDate = invoiceBillDate; + this.invoiceFilePath = invoiceFilePath; + this.rtgsFilePath = rtgsFilePath; + this.itTaxAmt = itTaxAmt; + this.percentApplied = percentApplied; + this.snaRetAmt = snaRetAmt; + } + +} diff --git a/src/main/java/com/cont_mgmt/dto/BillStat.java b/src/main/java/com/cont_mgmt/dto/BillStat.java new file mode 100644 index 0000000..fe3abab --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/BillStat.java @@ -0,0 +1,39 @@ +package com.cont_mgmt.dto; + +public class BillStat { + + private int billStatTypeId; + private String billStatTypeName; + + public int getBillStatTypeId() { + return billStatTypeId; + } + + public void setBillStatTypeId(int billStatTypeId) { + this.billStatTypeId = billStatTypeId; + } + + public String getBillStatTypeName() { + return billStatTypeName; + } + + public void setBillStatTypeName(String billStatTypeName) { + this.billStatTypeName = billStatTypeName; + } + + @Override + public String toString() { + return "BillStat [billStatTypeId=" + billStatTypeId + ", billStatTypeName=" + billStatTypeName + "]"; + } + + public BillStat(int billStatTypeId, String billStatTypeName) { + super(); + this.billStatTypeId = billStatTypeId; + this.billStatTypeName = billStatTypeName; + } + + public BillStat() { + super(); + } + +} diff --git a/src/main/java/com/cont_mgmt/dto/Contract.java b/src/main/java/com/cont_mgmt/dto/Contract.java new file mode 100644 index 0000000..6a6c3c8 --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/Contract.java @@ -0,0 +1,219 @@ +package com.cont_mgmt.dto; + +public class Contract { + + private String contNum; + private int vendId; + private String contStartDate; + private String contEndDate; + private String invoiceBillTypeName; + private double contAmt; + private String workDesc; + private String contLOAFilePath; + private String contWOFilePath; + private String contASFilePath; + private String contEMDFilePath; + private String contSDFilePath; + private String contASDFilePath; + private String contRmrk; + + public String getContRmrk() { + return contRmrk; + } + + public void setContRmrk(String contRmrk) { + this.contRmrk = contRmrk; + } + + public Contract(String contNum, int vendId, String contStartDate, String contEndDate, String invoiceBillTypeName, + double contAmt, String workDesc, String contLOAFilePath, String contWOFilePath, String contASFilePath, + String contEMDFilePath, String contSDFilePath, String contASDFilePath, String contRmrk, int isExtended, + String contAgreeFilePath, double emdAmt, double sdAmt, double asdAmt) { + super(); + this.contNum = contNum; + this.vendId = vendId; + this.contStartDate = contStartDate; + this.contEndDate = contEndDate; + this.invoiceBillTypeName = invoiceBillTypeName; + this.contAmt = contAmt; + this.workDesc = workDesc; + this.contLOAFilePath = contLOAFilePath; + this.contWOFilePath = contWOFilePath; + this.contASFilePath = contASFilePath; + this.contEMDFilePath = contEMDFilePath; + this.contSDFilePath = contSDFilePath; + this.contASDFilePath = contASDFilePath; + this.contRmrk = contRmrk; + this.isExtended = isExtended; + this.contAgreeFilePath = contAgreeFilePath; + this.emdAmt = emdAmt; + this.sdAmt = sdAmt; + this.asdAmt = asdAmt; + } + + @Override + public String toString() { + return "Contract [contNum=" + contNum + ", vendId=" + vendId + ", contStartDate=" + contStartDate + + ", contEndDate=" + contEndDate + ", invoiceBillTypeName=" + invoiceBillTypeName + ", contAmt=" + + contAmt + ", workDesc=" + workDesc + ", contLOAFilePath=" + contLOAFilePath + ", contWOFilePath=" + + contWOFilePath + ", contASFilePath=" + contASFilePath + ", contEMDFilePath=" + contEMDFilePath + + ", contSDFilePath=" + contSDFilePath + ", contASDFilePath=" + contASDFilePath + ", contRmrk=" + + contRmrk + ", isExtended=" + isExtended + ", contAgreeFilePath=" + contAgreeFilePath + ", emdAmt=" + + emdAmt + ", sdAmt=" + sdAmt + ", asdAmt=" + asdAmt + "]"; + } + + public String getContEMDFilePath() { + return contEMDFilePath; + } + + public void setContEMDFilePath(String contEMDFilePath) { + this.contEMDFilePath = contEMDFilePath; + } + + public String getContSDFilePath() { + return contSDFilePath; + } + + public void setContSDFilePath(String contSDFilePath) { + this.contSDFilePath = contSDFilePath; + } + + public String getContASDFilePath() { + return contASDFilePath; + } + + public void setContASDFilePath(String contASDFilePath) { + this.contASDFilePath = contASDFilePath; + } + + private int isExtended; + private String contAgreeFilePath; + private double emdAmt; + private double sdAmt; + private double asdAmt; + + public double getSdAmt() { + return sdAmt; + } + + public void setSdAmt(double sdAmt) { + this.sdAmt = sdAmt; + } + + public double getAsdAmt() { + return asdAmt; + } + + public void setAsdAmt(double asdAmt) { + this.asdAmt = asdAmt; + } + + public double getEmdAmt() { + return emdAmt; + } + + public void setEmdAmt(double emdAmt) { + this.emdAmt = emdAmt; + } + + public int getIsExtended() { + return isExtended; + } + + public void setIsExtended(int isExtended) { + this.isExtended = isExtended; + } + + public Contract() { + super(); + } + + public int getVendId() { + return vendId; + } + + public void setVendId(int vendId) { + this.vendId = vendId; + } + + public String getContNum() { + return contNum; + } + + public void setContNum(String contNum) { + this.contNum = contNum; + } + + public String getContStartDate() { + return contStartDate; + } + + public void setContStartDate(String contStartDate) { + this.contStartDate = contStartDate; + } + + public String getContEndDate() { + return contEndDate; + } + + public void setContEndDate(String contEndDate) { + this.contEndDate = contEndDate; + } + + public String getInvoiceBillTypeName() { + return invoiceBillTypeName; + } + + public void setInvoiceBillTypeName(String invoiceBillTypeName) { + this.invoiceBillTypeName = invoiceBillTypeName; + } + + public double getContAmt() { + return contAmt; + } + + public void setContAmt(double contAmt) { + this.contAmt = contAmt; + } + + public String getWorkDesc() { + return workDesc; + } + + public void setWorkDesc(String workDesc) { + this.workDesc = workDesc; + } + + public String getContLOAFilePath() { + return contLOAFilePath; + } + + public void setContLOAFilePath(String contLOAFilePath) { + this.contLOAFilePath = contLOAFilePath; + } + + public String getContWOFilePath() { + return contWOFilePath; + } + + public void setContWOFilePath(String contWOFilePath) { + this.contWOFilePath = contWOFilePath; + } + + public String getContASFilePath() { + return contASFilePath; + } + + public void setContASFilePath(String contASFilePath) { + this.contASFilePath = contASFilePath; + } + + public String getContAgreeFilePath() { + return contAgreeFilePath; + } + + public void setContAgreeFilePath(String contAgreeFilePath) { + this.contAgreeFilePath = contAgreeFilePath; + } + +} diff --git a/src/main/java/com/cont_mgmt/dto/InvoiceBillType.java b/src/main/java/com/cont_mgmt/dto/InvoiceBillType.java new file mode 100644 index 0000000..fc362cf --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/InvoiceBillType.java @@ -0,0 +1,40 @@ +package com.cont_mgmt.dto; + +public class InvoiceBillType { + + private String invoiceBillTypeName; + private int invoiceBillTypeId; + + public String getInvoiceBillTypeName() { + return invoiceBillTypeName; + } + + public void setInvoiceBillTypeName(String invoiceBillTypeName) { + this.invoiceBillTypeName = invoiceBillTypeName; + } + + public int getInvoiceBillTypeId() { + return invoiceBillTypeId; + } + + public void setInvoiceBillTypeId(int invoiceBillTypeId) { + this.invoiceBillTypeId = invoiceBillTypeId; + } + + @Override + public String toString() { + return "InvoiceBillType [invoiceBillTypeName=" + invoiceBillTypeName + ", invoiceillTypeId=" + invoiceBillTypeId + + "]"; + } + + public InvoiceBillType(String invoiceBillTypeName, int invoiceillTypeId) { + super(); + this.invoiceBillTypeName = invoiceBillTypeName; + this.invoiceBillTypeId = invoiceillTypeId; + } + + public InvoiceBillType() { + super(); + } + +} diff --git a/src/main/java/com/cont_mgmt/dto/ProdCat.java b/src/main/java/com/cont_mgmt/dto/ProdCat.java new file mode 100644 index 0000000..560ebda --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/ProdCat.java @@ -0,0 +1,39 @@ +package com.cont_mgmt.dto; + +public class ProdCat { + + private int prodCatId; + private String prodCatName; + + public int getProdCatId() { + return prodCatId; + } + + public void setProdCatId(int prodCatId) { + this.prodCatId = prodCatId; + } + + public String getProdCatName() { + return prodCatName; + } + + public void setProdCatName(String prodCatName) { + this.prodCatName = prodCatName; + } + + @Override + public String toString() { + return "ProductCategory [prodCatId=" + prodCatId + ", prodCatName=" + prodCatName + "]"; + } + + public ProdCat(int prodCatId, String prodCatName) { + super(); + this.prodCatId = prodCatId; + this.prodCatName = prodCatName; + } + + public ProdCat() { + super(); + } + +} diff --git a/src/main/java/com/cont_mgmt/dto/User.java b/src/main/java/com/cont_mgmt/dto/User.java new file mode 100644 index 0000000..bfe8fc6 --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/User.java @@ -0,0 +1,39 @@ +package com.cont_mgmt.dto; + +public class User { + + private int userId; + private String userName; + + @Override + public String toString() { + return "User [userId=" + userId + ", userName=" + userName + "]"; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public User(int userId, String userName) { + super(); + this.userId = userId; + this.userName = userName; + } + + public User() { + super(); + } + +} diff --git a/src/main/java/com/cont_mgmt/dto/Vendor.java b/src/main/java/com/cont_mgmt/dto/Vendor.java new file mode 100644 index 0000000..389b1f7 --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/Vendor.java @@ -0,0 +1,136 @@ +package com.cont_mgmt.dto; + +public class Vendor { + + private int vendId; + private String vendName; + private String vendAddr; + private String gstNum; + private String panNum; + private String telNum1; + private String telNum2; + private String emailId; + private String prodCatName; + private Integer contCount; + + public Vendor(int vendId, String vendName, String vendAddr, String gstNum, String panNum, String telNum1, + String telNum2, String emailId, String prodCatName, Integer contCount) { + super(); + this.vendId = vendId; + this.vendName = vendName; + this.vendAddr = vendAddr; + this.gstNum = gstNum; + this.panNum = panNum; + this.telNum1 = telNum1; + this.telNum2 = telNum2; + this.emailId = emailId; + this.prodCatName = prodCatName; + this.contCount = contCount; + } + + public Integer getContCount() { + return contCount; + } + + public void setContCount(Integer contCount) { + this.contCount = contCount; + } + + public int getVendId() { + return vendId; + } + + public void setVendId(int vendId) { + this.vendId = vendId; + } + + public String getVendName() { + return vendName; + } + + public void setVendName(String vendName) { + this.vendName = vendName; + } + + public String getVendAddr() { + return vendAddr; + } + + public void setVendAddr(String vendAddr) { + this.vendAddr = vendAddr; + } + + public String getGstNum() { + return gstNum; + } + + public void setGstNum(String gstNum) { + this.gstNum = gstNum; + } + + public String getPanNum() { + return panNum; + } + + public void setPanNum(String panNum) { + this.panNum = panNum; + } + + public String getTelNum1() { + return telNum1; + } + + public void setTelNum1(String telNum1) { + this.telNum1 = telNum1; + } + + public String getTelNum2() { + return telNum2; + } + + public void setTelNum2(String telNum2) { + this.telNum2 = telNum2; + } + + public String getEmailId() { + return emailId; + } + + public void setEmailId(String emailId) { + this.emailId = emailId; + } + + public String getProdCatName() { + return prodCatName; + } + + public void setProdCatName(String prodCatName) { + this.prodCatName = prodCatName; + } + + public Vendor(int vendId, String vendName, String vendAddr, String gstNum, String panNum, String telNum1, + String telNum2, String emailId, String prodCatName) { + super(); + this.vendId = vendId; + this.vendName = vendName; + this.vendAddr = vendAddr; + this.gstNum = gstNum; + this.panNum = panNum; + this.telNum1 = telNum1; + this.telNum2 = telNum2; + this.emailId = emailId; + this.prodCatName = prodCatName; + } + + @Override + public String toString() { + return "Vendor [vendId=" + vendId + ", vendName=" + vendName + ", vendAddr=" + vendAddr + ", gstNum=" + gstNum + + ", panNum=" + panNum + ", telNum1=" + telNum1 + ", telNum2=" + telNum2 + ", emailId=" + emailId + + ", prodCatName=" + prodCatName + ", contCount=" + contCount + "]"; + } + + public Vendor() { + super(); + } + +} diff --git a/src/main/java/com/cont_mgmt/dto/WhatsAppMessage.java b/src/main/java/com/cont_mgmt/dto/WhatsAppMessage.java new file mode 100644 index 0000000..ead8ded --- /dev/null +++ b/src/main/java/com/cont_mgmt/dto/WhatsAppMessage.java @@ -0,0 +1,41 @@ +package com.cont_mgmt.dto; + +import java.util.Set; + +public class WhatsAppMessage { + + private Set phone; + private String msg; + + @Override + public String toString() { + return "WhatsAppMessage [phone=" + phone + ", msg=" + msg + "]"; + } + + public Set getPhone() { + return phone; + } + + public void setPhone(Set phone) { + this.phone = phone; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public WhatsAppMessage(Set phone, String msg) { + super(); + this.phone = phone; + this.msg = msg; + } + + public WhatsAppMessage() { + super(); + } + +} diff --git a/src/main/java/com/cont_mgmt/listener/WhatsAppMessageSenderListener.java b/src/main/java/com/cont_mgmt/listener/WhatsAppMessageSenderListener.java new file mode 100644 index 0000000..d3bacff --- /dev/null +++ b/src/main/java/com/cont_mgmt/listener/WhatsAppMessageSenderListener.java @@ -0,0 +1,133 @@ +package com.cont_mgmt.listener; + +import java.net.InetAddress; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.naming.Context; +import javax.naming.InitialContext; + +import com.cont_mgmt.dto.WhatsAppMessage; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.WhatsAppMessageSenderService; +import com.cont_mgmt.util.TimeUtils; +import com.cont_mgmt.util.WhatsAppMessageSender; + +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; +import jakarta.servlet.annotation.WebListener; + +/** + * Application Lifecycle Listener implementation class + * WhatsAppMessageSenderListener + * + */ +@WebListener +public class WhatsAppMessageSenderListener implements ServletContextListener { + + // Call the WhatsAppMessageSenderService + private WhatsAppMessageSenderService whatsAppMessageSenderService = new WhatsAppMessageSenderService(); + + // Call the TimeUtils + private TimeUtils timeUtils = new TimeUtils(); + + private ScheduledExecutorService whatsAppMessageSenderScheduler; + + // Call the LogDetService + private LogDetService logDetService = new LogDetService(); + + private String serverIp; + + // WhatsApp credentials + private String idInstance; + private String apiTokenInstance; + + /** + * @see ServletContextListener#contextInitialized(ServletContextEvent) + */ + @Override + public void contextInitialized(ServletContextEvent sec) { + // TODO Auto-generated method stub + try { + serverIp = InetAddress.getLocalHost().getHostAddress(); + whatsAppMessageSenderScheduler = Executors.newSingleThreadScheduledExecutor(); + // --- Lookup local environment entries from context.xml --- + Context initContext = (Context) new InitialContext().lookup("java:comp/env"); + idInstance = (String) initContext.lookup("whatsapp.id.instance"); + apiTokenInstance = (String) initContext.lookup("whatsapp.api.token"); + + Runnable whatsAppMessageSenderTask = new Runnable() { + public void run() { + // Sending Whatsapp Message + try { + // Set up credentials and message + WhatsAppMessageSender whatsAppMessageSender = new WhatsAppMessageSender(idInstance, + apiTokenInstance); + + // Set up recipient and message content + Set phones = new HashSet(); + // phones.add("919445783752"); + phones.add("919499933066"); + phones.add("919445208964"); + phones.add("919940579997"); + + // Generate message + String messageProducer = whatsAppMessageSenderService.generateMessage(); + WhatsAppMessage whatsAppMessage = new WhatsAppMessage(phones, messageProducer); + + // Send the message + whatsAppMessageSender.sendMsg(whatsAppMessage, serverIp); + System.out.println("WhatsApp message sent at " + new Date()); + + logDetService.addLogDet(-2, serverIp, "WhatsApp message sent successfully."); + } catch (Exception e) { + e.printStackTrace(); + logDetService.addLogDet(-2, serverIp, "Error in WhatsApp scheduler run: " + e.getMessage()); + } + + // Schedule the next run strictly for tomorrow/next day at 11:00 IST + try { + Long nextDelay = timeUtils.getDelayUntilNextDay(11, 0); // 11:00 IST + whatsAppMessageSenderScheduler.schedule(this, nextDelay, TimeUnit.MILLISECONDS); + System.out.println( + "Next WhatsApp Scheduler run scheduled after " + nextDelay / 1000 + " seconds."); + logDetService.addLogDet(-2, serverIp, + "Next WhatsApp Scheduler run scheduled after " + nextDelay / 1000 + " seconds."); + } catch (Exception e) { + e.printStackTrace(); + logDetService.addLogDet(-2, serverIp, "Error in WhatsApp scheduler run: " + e.getMessage()); + } + } + }; + + // First schedule (today if not passed, else tomorrow) + long initDelay = timeUtils.getDelayUntil(11, 0); // Use 24 hour format (or) Railway format + whatsAppMessageSenderScheduler.schedule(whatsAppMessageSenderTask, initDelay, TimeUnit.MILLISECONDS); + + System.out.println("Daily WhatsApp Scheduler initialized successfully."); + logDetService.addLogDet(-2, serverIp, "Daily WhatsApp Scheduler initialized successfully."); + } catch (Exception e) { + System.out.println( + "Exception occurred in WhatsAppMessageSenderListener contextInitialized: " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, + "Exception occurred in WhatsAppMessageSenderListener contextInitialized: " + e.getMessage()); + } + } + + /** + * @see ServletContextListener#contextDestroyed(ServletContextEvent) + */ + @Override + public void contextDestroyed(ServletContextEvent sec) { + // TODO Auto-generated method stub + if (whatsAppMessageSenderScheduler != null && !whatsAppMessageSenderScheduler.isShutdown()) { + whatsAppMessageSenderScheduler.shutdownNow(); + System.out.println("WhatsApp Scheduler shutdown."); + } + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/ClosureContDet.java b/src/main/java/com/cont_mgmt/repository/ClosureContDet.java new file mode 100644 index 0000000..ccae7e8 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/ClosureContDet.java @@ -0,0 +1,77 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class ClosureContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public boolean update(String contNum, Double sdAmt, Double asdAmt, String asdFilePath, String sdFilePath, + Integer usrId) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + PreparedStatement ps = null; + boolean flag = false; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Start building the base query + query = "UPDATE tbl_cont_det SET sd_amt = ?, asd_amt = ?, sd_file_path = ?, asd_file_path = ?, " + + "db_updated_timestamp = SYSTIMESTAMP, usr_opr_updated_timestamp = CURRENT_TIMESTAMP, " + + "opr_upd_user_id = ? WHERE cont_num = ?"; + ps = con.prepareStatement(query); + ps.setDouble(1, sdAmt); + ps.setDouble(2, asdAmt); + ps.setString(3, sdFilePath); + ps.setString(4, asdFilePath); + ps.setInt(5, usrId); + ps.setString(6, contNum); + + int rowsAffected = ps.executeUpdate(); // Execute the query + + if (rowsAffected > 0) { + // Commit the transaction + flag = true; + } + + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return flag; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/ClosureExtContDet.java b/src/main/java/com/cont_mgmt/repository/ClosureExtContDet.java new file mode 100644 index 0000000..e85a02b --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/ClosureExtContDet.java @@ -0,0 +1,77 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class ClosureExtContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public boolean update(String contNum, Double sdAmt, Double asdAmt, String asdFilePath, String sdFilePath, + Integer usrId) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + PreparedStatement ps = null; + boolean flag = false; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Start building the base query + query = "UPDATE tbl_ext_cont_det SET ext_sd_amt = ?, ext_asd_amt = ?, ext_sd_file_path = ?, ext_asd_file_path = ?, " + + "db_updated_timestamp = SYSTIMESTAMP, usr_opr_updated_timestamp = CURRENT_TIMESTAMP, opr_upd_user_id = ? " + + "WHERE ext_cont_num = ?"; + ps = con.prepareStatement(query); + ps.setDouble(1, sdAmt); + ps.setDouble(2, asdAmt); + ps.setString(3, sdFilePath); + ps.setString(4, asdFilePath); + ps.setInt(5, usrId); + ps.setString(6, contNum); + + int rowsAffected = ps.executeUpdate(); // Execute the query + + if (rowsAffected > 0) { + // Commit the transaction + flag = true; + } + + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return flag; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/DeleteBillDet.java b/src/main/java/com/cont_mgmt/repository/DeleteBillDet.java new file mode 100644 index 0000000..405b23c --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/DeleteBillDet.java @@ -0,0 +1,63 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class DeleteBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public void delete(int invoiceId) { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + PreparedStatement ps = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Delete Vendor Details based on vendId + query = "delete from tbl_invoice_det where invoice_id = ?"; + ps = con.prepareStatement(query); + ps.setInt(1, invoiceId); + ps.executeUpdate(); // Execute the update + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/DeleteContDet.java b/src/main/java/com/cont_mgmt/repository/DeleteContDet.java new file mode 100644 index 0000000..fad0af5 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/DeleteContDet.java @@ -0,0 +1,63 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class DeleteContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public void delete(String contNum) { + + Connection con = null; + String query = null; + PreparedStatement ps = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Delete Contract Details based on vendId + query = "delete from tbl_cont_det where cont_num = ?"; + ps = con.prepareStatement(query); + ps.setString(1, contNum); + ps.executeUpdate(); // Execute the update + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/DeleteExtBillDet.java b/src/main/java/com/cont_mgmt/repository/DeleteExtBillDet.java new file mode 100644 index 0000000..cbe0685 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/DeleteExtBillDet.java @@ -0,0 +1,63 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class DeleteExtBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public void delete(int extInvoiceId) { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + PreparedStatement ps = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Delete Vendor Details based on vendId + query = "delete from tbl_ext_invoice_det where ext_invoice_id = ?"; + ps = con.prepareStatement(query); + ps.setInt(1, extInvoiceId); + ps.executeUpdate(); // Execute the update + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/DeleteExtContDet.java b/src/main/java/com/cont_mgmt/repository/DeleteExtContDet.java new file mode 100644 index 0000000..31f330d --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/DeleteExtContDet.java @@ -0,0 +1,59 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class DeleteExtContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public void delete(String existContNum) { + + Connection con = null; + String query = null; + PreparedStatement ps = null; + + try { + con = conn.oracleCon(); + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + query = "delete from tbl_ext_cont_det where ext_cont_num = ?"; + ps = con.prepareStatement(query); + ps.setString(1, existContNum); + ps.executeUpdate(); + + con.commit(); + + } catch (ClassNotFoundException | SQLException e) { + if (con != null) { + try { + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + + e.printStackTrace(); + } finally { + try { + if (ps != null) { + ps.close(); + } + + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/DeleteVendDet.java b/src/main/java/com/cont_mgmt/repository/DeleteVendDet.java new file mode 100644 index 0000000..40cd446 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/DeleteVendDet.java @@ -0,0 +1,62 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class DeleteVendDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public void delete(int vendId) { + + Connection con = null; + String query = null; + PreparedStatement ps = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Delete Vendor Details based on vendId + query = "delete from tbl_vend_det where vend_id = ?"; + ps = con.prepareStatement(query); + ps.setInt(1, vendId); + ps.executeUpdate(); // Execute the update + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + + } +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchAllContDet.java b/src/main/java/com/cont_mgmt/repository/FetchAllContDet.java new file mode 100644 index 0000000..0906a12 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchAllContDet.java @@ -0,0 +1,99 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Contract; + +public class FetchAllContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch() throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List contList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch contract details based on vend_id + query = "select c.cont_num, c.cont_start_date, c.cont_end_date, c.cont_amt, i.invoice_bill_type_name, " + + "c.loa_file_path, c.wo_file_path, c.as_file_path, c.work_desc, c.vend_id, c.is_ext " + + "from tbl_cont_det c inner join tbl_invoice_bill_type_det i on " + + "c.invoice_bill_type_id = i.invoice_bill_type_id " + + "order by to_date(c.cont_start_date,'DD-MM-YYYY'), to_date(c.cont_end_date,'DD-MM-YYYY')"; + + ps = con.prepareStatement(query); + + // Execute the query + rs = ps.executeQuery(); + + // Initialize the list + contList = new ArrayList(); + + while (rs.next()) { + + Contract contract = new Contract(); + contract.setContNum(rs.getString("cont_num")); + contract.setContStartDate(rs.getString("cont_start_date")); + contract.setContEndDate(rs.getString("cont_end_date")); + contract.setContAmt(rs.getDouble("cont_amt")); + contract.setInvoiceBillTypeName(rs.getString("invoice_bill_type_name")); + contract.setContASFilePath(rs.getString("as_file_path")); + contract.setContWOFilePath(rs.getString("wo_file_path")); + contract.setContLOAFilePath(rs.getString("loa_file_path")); + contract.setWorkDesc(rs.getString("work_desc")); + contract.setVendId(rs.getInt("vend_id")); + contract.setIsExtended(rs.getInt("is_ext")); + + contList.add(contract); + + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return contList; + } +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchAllVendDet.java b/src/main/java/com/cont_mgmt/repository/FetchAllVendDet.java new file mode 100644 index 0000000..6609452 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchAllVendDet.java @@ -0,0 +1,94 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Vendor; + +public class FetchAllVendDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch() throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + List vendList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Prepare the query + query = "select v.vend_id, v.vend_name, v.vend_addr, v.gst_num, v.pan_num, v.tel_num_1, " + + "v.tel_num_2, v.email_id, p.prod_cat_name from tbl_vend_det v " + + "inner join tbl_prod_cat_det p on p.prod_cat_id = v.prod_cat_id order by v.vend_id"; + + ps = con.prepareStatement(query); + + // Execute the query + rs = ps.executeQuery(); + + // Initialize the list + vendList = new ArrayList(); + + while (rs.next()) { + // Populate Vendor object + Vendor vendor = new Vendor(); + vendor.setEmailId(rs.getString("email_id")); + vendor.setGstNum(rs.getString("gst_num")); + vendor.setPanNum(rs.getString("pan_num")); + vendor.setProdCatName(rs.getString("prod_cat_name")); + vendor.setTelNum1(rs.getString("tel_num_1")); + vendor.setTelNum2(rs.getString("tel_num_2")); + vendor.setVendAddr(rs.getString("vend_addr")); + vendor.setVendName(rs.getString("vend_name")); + vendor.setVendId(rs.getInt("vend_id")); + vendList.add(vendor); + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return vendList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchAmtDueByContNum.java b/src/main/java/com/cont_mgmt/repository/FetchAmtDueByContNum.java new file mode 100644 index 0000000..5f20bf8 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchAmtDueByContNum.java @@ -0,0 +1,81 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchAmtDueByContNum { + + // Call the driver class + private DbCon conn = new DbCon(); + + public Double fetch(String contNum) throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + Double amtDue = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select amt_due, cont_num from (select * from tbl_invoice_det where cont_num = ? " + + "order by to_date(invoice_billing_date, 'DD-MM-YYYY') desc) where rownum = 1"; + + ps = con.prepareStatement(query); + ps.setString(1, contNum); + + // Execute the query + rs = ps.executeQuery(); + + if (rs.next()) { + if (contNum.equals(rs.getString("cont_num"))) { + amtDue = rs.getDouble("amt_due"); + } + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return amtDue; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchAmtDueByExtContNum.java b/src/main/java/com/cont_mgmt/repository/FetchAmtDueByExtContNum.java new file mode 100644 index 0000000..061d182 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchAmtDueByExtContNum.java @@ -0,0 +1,81 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchAmtDueByExtContNum { + + // Call the driver class + private DbCon conn = new DbCon(); + + public Double fetch(String extContNum) throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + Double amtDue = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select ext_amt_due, ext_cont_num from (select * from tbl_ext_invoice_det where ext_cont_num = ? " + + "order by to_date(ext_invoice_billing_date, 'DD-MM-YYYY') desc) where rownum = 1"; + + ps = con.prepareStatement(query); + ps.setString(1, extContNum); + + // Execute the query + rs = ps.executeQuery(); + + if (rs.next()) { + if (extContNum.equals(rs.getString("ext_cont_num"))) { + amtDue = rs.getDouble("ext_amt_due"); + } + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return amtDue; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchBillDet.java b/src/main/java/com/cont_mgmt/repository/FetchBillDet.java new file mode 100644 index 0000000..f12b5fd --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchBillDet.java @@ -0,0 +1,103 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Bill; + +public class FetchBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public Bill fetch(int invoiceId) throws SQLException, ClassNotFoundException { + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + Bill bill; + + // TODO Auto-generated method stub + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select i.invoice_id, i.invoice_billing_period, i.amt_paid, i.amt_excl_tax, i.cgst_amt, i.sgst_amt, " + + "i.igst_amt, i.tot_amt, i.amt_due, i.invoice_start_date, i.invoice_end_date, c.cont_amt," + + " i.invoice_billing_date, i.it_tax_amt, i.sna_ret_amt from tbl_invoice_det i " + + "inner join tbl_cont_det c on i.cont_num = c.cont_num where i.invoice_id = ?"; + + ps = con.prepareStatement(query); + ps.setInt(1, invoiceId); + + // Execute the query + rs = ps.executeQuery(); + + if (rs.next()) { + + int storedInvoiceId = rs.getInt("invoice_id"); + + if (storedInvoiceId == invoiceId) { + // Populate Bill Object + bill = new Bill(); + bill.setAmtDue(rs.getDouble("amt_due")); + bill.setAmtExclTax(rs.getDouble("amt_excl_tax")); + bill.setAmtPaid(rs.getDouble("amt_paid")); + bill.setCgstAmt(rs.getDouble("cgst_amt")); + bill.setContAmt(rs.getDouble("cont_amt")); + bill.setIgstAmt(rs.getDouble("igst_amt")); + bill.setInvoiceBillingPeriod(rs.getString("invoice_billing_period")); + bill.setInvoiceEndDate(rs.getString("invoice_end_date")); + bill.setInvoiceStartDate(rs.getString("invoice_start_date")); + bill.setSgstAmt(rs.getDouble("sgst_amt")); + bill.setTotAmt(rs.getDouble("tot_amt")); + bill.setInvoiceBillDate(rs.getString("invoice_billing_date")); + bill.setItTaxAmt(rs.getDouble("it_tax_amt")); + bill.setSnaRetAmt(rs.getDouble("sna_ret_amt")); + // Commit the transaction + con.commit(); + return bill; + } + + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return null; + } +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchBillStatDet.java b/src/main/java/com/cont_mgmt/repository/FetchBillStatDet.java new file mode 100644 index 0000000..21ff2db --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchBillStatDet.java @@ -0,0 +1,83 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.BillStat; + +public class FetchBillStatDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch() { + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List billStatDetList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Query to fetch invoice bill type + query = "select bill_stat_type_id, bill_stat_type_name from tbl_bill_stat_type_det " + + "order by bill_stat_type_id"; + ps = con.prepareStatement(query); + rs = ps.executeQuery(); + + // Initialize the list + billStatDetList = new ArrayList(); + + while (rs.next()) { + + BillStat billStat = new BillStat(); + billStat.setBillStatTypeId(rs.getInt("bill_stat_type_id")); + billStat.setBillStatTypeName(rs.getString("bill_stat_type_name")); + billStatDetList.add(billStat); + + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return billStatDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchContDet.java b/src/main/java/com/cont_mgmt/repository/FetchContDet.java new file mode 100644 index 0000000..e727558 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchContDet.java @@ -0,0 +1,99 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Contract; + +public class FetchContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public Contract fetch(String contNum) throws SQLException, ClassNotFoundException { + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + Contract contract = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch contract details based on contract id + query = "select c.cont_num, c.cont_start_date, c.cont_end_date, c.cont_amt, i.invoice_bill_type_name, " + + "c.work_desc, c.is_ext, c.emd_amt, c.sd_amt, c.asd_amt, c.loa_file_path, c.wo_file_path, " + + "c.as_file_path, c.agree_file_path, c.emd_file_path, c.sd_file_path, c.asd_file_path, " + + "c.cont_rmrk from tbl_cont_det c inner join tbl_invoice_bill_type_det i " + + "on c.invoice_bill_type_id = i.invoice_bill_type_id where c.cont_num = ?"; + ps = con.prepareStatement(query); + ps.setString(1, contNum); + rs = ps.executeQuery(); // Execute the query + if (rs.next()) { + String storedContNum = rs.getString("cont_num"); + + if (storedContNum.equals(contNum)) { + // Populate Contract object + contract = new Contract(); + contract.setContAmt(rs.getDouble("cont_amt")); + contract.setContEndDate(rs.getString("cont_end_date")); + contract.setContNum(rs.getString("cont_num")); + contract.setContStartDate(rs.getString("cont_start_date")); + contract.setInvoiceBillTypeName(rs.getString("invoice_bill_type_name")); + contract.setWorkDesc(rs.getString("work_desc")); + contract.setIsExtended(rs.getInt("is_ext")); + contract.setEmdAmt(rs.getDouble("emd_amt")); + contract.setSdAmt(rs.getDouble("sd_amt")); + contract.setAsdAmt(rs.getDouble("asd_amt")); + contract.setContEMDFilePath(rs.getString("emd_file_path")); + contract.setContASFilePath(rs.getString("as_file_path")); + contract.setContAgreeFilePath(rs.getString("agree_file_path")); + contract.setContWOFilePath(rs.getString("wo_file_path")); + contract.setContLOAFilePath(rs.getString("loa_file_path")); + contract.setContSDFilePath(rs.getString("sd_file_path")); + contract.setContASDFilePath(rs.getString("asd_file_path")); + contract.setContRmrk(rs.getString("cont_rmrk")); + // Commit the transaction + con.commit(); + return contract; + } + } + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return null; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchContDetByDates.java b/src/main/java/com/cont_mgmt/repository/FetchContDetByDates.java new file mode 100644 index 0000000..c4a6a3b --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchContDetByDates.java @@ -0,0 +1,96 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchContDetByDates { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List> fetch(String fromDate, String toDate) throws SQLException, ClassNotFoundException { + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + List> custRepList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch contract details based on from date and to date + query = "select v.vend_name, c.cont_num, c.work_desc, c.cont_start_date, c.cont_end_date, i.invoice_bill_type_name, " + + "c.emd_amt, c.sd_amt, c.asd_amt, c.cont_amt, c.is_ext, c.cont_rmrk, v.vend_id, p.prod_cat_name " + + "from tbl_cont_det c inner join tbl_vend_det v on c.vend_id = v.vend_id inner join tbl_prod_cat_det p " + + "on p.prod_cat_id = v.prod_cat_id inner join tbl_invoice_bill_type_det i " + + "on c.invoice_bill_type_id = i.invoice_bill_type_id where " + + "to_date(c.cont_start_date, 'dd-mm-yyyy') <= to_date(?, 'dd-mm-yyyy') and " + + "to_date(c.cont_end_date, 'dd-mm-yyyy') >= to_date(?, 'dd-mm-yyyy')"; + ps = con.prepareStatement(query); + ps.setString(1, toDate); + ps.setString(2, fromDate); + rs = ps.executeQuery(); // Execute the query + + custRepList = new ArrayList>(); + while (rs.next()) { + Map custRep = new HashMap(); + custRep.put("vendName", rs.getString("vend_name")); + custRep.put("vendId", rs.getInt("vend_id")); + custRep.put("prodCatName", rs.getString("prod_cat_name")); + custRep.put("contNum", rs.getString("cont_num")); + custRep.put("workDesc", rs.getString("work_desc")); + custRep.put("contStartDate", rs.getString("cont_start_date")); + custRep.put("contEndDate", rs.getString("cont_end_date")); + custRep.put("invoiceBillType", rs.getString("invoice_bill_type_name")); + custRep.put("emdAmt", rs.getDouble("emd_amt")); + custRep.put("sdAmt", rs.getDouble("sd_amt")); + custRep.put("asdAmt", rs.getDouble("asd_amt")); + custRep.put("contAmt", rs.getDouble("cont_amt")); + custRep.put("isExt", rs.getInt("is_ext")); + custRep.put("contRmrk", rs.getString("cont_rmrk")); + custRepList.add(custRep); + } + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return custRepList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExistBillDet.java b/src/main/java/com/cont_mgmt/repository/FetchExistBillDet.java new file mode 100644 index 0000000..9d15253 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExistBillDet.java @@ -0,0 +1,111 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Bill; + +public class FetchExistBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(String contNum) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List billDetList = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select i.invoice_billing_period, i.amt_paid, i.amt_excl_tax, i.cgst_amt, i.sgst_amt, i.igst_amt, " + + "i.tot_amt, i.amt_due, i.invoice_start_date, i.invoice_end_date, c.cont_amt, i.it_tax_amt, " + + "b.bill_stat_type_name, i.invoice_billing_date, i.bill_file_path, i.invoice_file_path, " + + "i.rtgs_file_path, i.percent_applied, i.sna_ret_amt from tbl_invoice_det i " + + "inner join tbl_bill_stat_type_det b on i.bill_stat_type_id = b.bill_stat_type_id " + + "inner join tbl_cont_det c on i.cont_num = c.cont_num where c.cont_num = ? " + + "order by i.invoice_billing_period, i.invoice_start_date"; + + ps = con.prepareStatement(query); + ps.setString(1, contNum); + + // Execute the query + rs = ps.executeQuery(); + + // Initialize the list + billDetList = new ArrayList(); + + while (rs.next()) { + + Bill bill = new Bill(); + bill.setAmtDue(rs.getDouble("amt_due")); + bill.setAmtExclTax(rs.getDouble("amt_excl_tax")); + bill.setAmtPaid(rs.getDouble("amt_paid")); + bill.setCgstAmt(rs.getDouble("cgst_amt")); + bill.setContAmt(rs.getDouble("cont_amt")); + bill.setIgstAmt(rs.getDouble("igst_amt")); + bill.setInvoiceBillingPeriod(rs.getString("invoice_billing_period")); + bill.setInvoiceEndDate(rs.getString("invoice_end_date")); + bill.setInvoiceStartDate(rs.getString("invoice_start_date")); + bill.setSgstAmt(rs.getDouble("sgst_amt")); + bill.setTotAmt(rs.getDouble("tot_amt")); + bill.setBillStatName(rs.getString("bill_stat_type_name")); + bill.setBillFilePath(rs.getString("bill_file_path")); + bill.setInvoiceFilePath(rs.getString("invoice_file_path")); + bill.setInvoiceBillDate(rs.getString("invoice_billing_date")); + bill.setItTaxAmt(rs.getDouble("it_tax_amt")); + bill.setRtgsFilePath(rs.getString("rtgs_file_path")); + bill.setPercentApplied(rs.getDouble("percent_applied")); + bill.setSnaRetAmt(rs.getDouble("sna_ret_amt")); + + billDetList.add(bill); + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return billDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExistContDet.java b/src/main/java/com/cont_mgmt/repository/FetchExistContDet.java new file mode 100644 index 0000000..2d77aae --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExistContDet.java @@ -0,0 +1,153 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Contract; + +public class FetchExistContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(int vendId, String contNum) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List contList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch contract details based on vend_id and cont_num + query = "select c.cont_num, c.cont_start_date, c.cont_end_date, c.cont_amt, i.invoice_bill_type_name, " + + "c.loa_file_path, c.wo_file_path, c.as_file_path, c.work_desc, c.vend_id, c.is_ext, " + + "c.emd_amt, c.sd_amt, c.asd_amt, c.agree_file_path, c.emd_file_path, c.cont_rmrk, " + + "c.sd_file_path, c.asd_file_path from tbl_cont_det c inner join tbl_invoice_bill_type_det i " + + "on c.invoice_bill_type_id = i.invoice_bill_type_id where "; + + boolean hasWhereClause = false; + + // If both parameters are provided + if (contNum != null && !contNum.trim().isEmpty() && vendId >= 1) { + query += "c.cont_num = ? and c.vend_id = ?"; + hasWhereClause = true; + } else { + // If only contNum is provided + if (contNum != null && !contNum.trim().isEmpty()) { + query += "c.cont_num = ?"; + hasWhereClause = true; + } + // If only vendId is provided + if (vendId >= 1) { + if (hasWhereClause) { + query += " and c.vend_id = ?"; + } else { + query += "c.vend_id = ?"; + hasWhereClause = true; + } + } + } + + query += " order by to_date(c.cont_start_date,'DD-MM-YYYY'), " + "to_date(c.cont_end_date,'DD-MM-YYYY')"; + + // Prepare statement after constructing the query + ps = con.prepareStatement(query); + int paramIndex = 1; + + // Bind parameters + if (contNum != null && !contNum.trim().isEmpty() && vendId >= 1) { + ps.setString(paramIndex++, contNum); // Set contNum + ps.setInt(paramIndex++, vendId); // Set vendId + } else { + if (contNum != null && !contNum.trim().isEmpty()) { + ps.setString(paramIndex++, contNum); // Set contNum + } + if (vendId >= 1) { + ps.setInt(paramIndex++, vendId); // Set vendId + } + } + + // Execute the query + rs = ps.executeQuery(); + + // Initialize the list + contList = new ArrayList(); + + while (rs.next()) { + + int storedVendId = rs.getInt("vend_id"); + String storedContNum = rs.getString("cont_num"); + + if (storedVendId == vendId || storedContNum.equals(contNum)) { + + Contract contract = new Contract(); + contract.setContNum(rs.getString("cont_num")); + contract.setContStartDate(rs.getString("cont_start_date")); + contract.setContEndDate(rs.getString("cont_end_date")); + contract.setContAmt(rs.getDouble("cont_amt")); + contract.setInvoiceBillTypeName(rs.getString("invoice_bill_type_name")); + contract.setContASFilePath(rs.getString("as_file_path")); + contract.setContWOFilePath(rs.getString("wo_file_path")); + contract.setContLOAFilePath(rs.getString("loa_file_path")); + contract.setWorkDesc(rs.getString("work_desc")); + contract.setVendId(rs.getInt("vend_id")); + contract.setContAgreeFilePath(rs.getString("agree_file_path")); + contract.setIsExtended(rs.getInt("is_ext")); + contract.setEmdAmt(rs.getDouble("emd_amt")); + contract.setSdAmt(rs.getDouble("sd_amt")); + contract.setAsdAmt(rs.getDouble("asd_amt")); + contract.setContEMDFilePath(rs.getString("emd_file_path")); + contract.setContASDFilePath(rs.getString("asd_file_path")); + contract.setContSDFilePath(rs.getString("sd_file_path")); + contract.setContRmrk(rs.getString("cont_rmrk")); + + contList.add(contract); + } + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return contList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExistExtBillDet.java b/src/main/java/com/cont_mgmt/repository/FetchExistExtBillDet.java new file mode 100644 index 0000000..e10c852 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExistExtBillDet.java @@ -0,0 +1,112 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Bill; + +public class FetchExistExtBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(String contNum) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List billDetList = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select i.ext_invoice_billing_period, i.ext_amt_paid, i.ext_amt_excl_tax, i.ext_cgst_amt, i.ext_sgst_amt, " + + "i.ext_igst_amt, i.ext_tot_amt, i.ext_amt_due, i.ext_invoice_start_date, i.ext_invoice_end_date, " + + "c.ext_cont_amt, i.ext_it_tax_amt, b.bill_stat_type_name, i.ext_invoice_billing_date, " + + "i.ext_bill_file_path, i.ext_invoice_file_path, i.ext_rtgs_file_path, i.ext_percent_applied, " + + "i.ext_sna_ret_amt from tbl_ext_invoice_det i inner join tbl_bill_stat_type_det b " + + "on i.ext_bill_stat_type_id = b.bill_stat_type_id inner join tbl_ext_cont_det c " + + "on i.ext_cont_num = c.ext_cont_num where c.ext_cont_num = ? order by i.ext_invoice_billing_period, " + + "i.ext_invoice_start_date"; + + ps = con.prepareStatement(query); + ps.setString(1, contNum); + + // Execute the query + rs = ps.executeQuery(); + + // Initialize the list + billDetList = new ArrayList(); + + while (rs.next()) { + + Bill bill = new Bill(); + bill.setAmtDue(rs.getDouble("ext_amt_due")); + bill.setAmtExclTax(rs.getDouble("ext_amt_excl_tax")); + bill.setAmtPaid(rs.getDouble("ext_amt_paid")); + bill.setCgstAmt(rs.getDouble("ext_cgst_amt")); + bill.setContAmt(rs.getDouble("ext_cont_amt")); + bill.setIgstAmt(rs.getDouble("ext_igst_amt")); + bill.setInvoiceBillingPeriod(rs.getString("ext_invoice_billing_period")); + bill.setInvoiceEndDate(rs.getString("ext_invoice_end_date")); + bill.setInvoiceStartDate(rs.getString("ext_invoice_start_date")); + bill.setSgstAmt(rs.getDouble("ext_sgst_amt")); + bill.setTotAmt(rs.getDouble("ext_tot_amt")); + bill.setBillStatName(rs.getString("bill_stat_type_name")); + bill.setBillFilePath(rs.getString("ext_bill_file_path")); + bill.setInvoiceFilePath(rs.getString("ext_invoice_file_path")); + bill.setInvoiceBillDate(rs.getString("ext_invoice_billing_date")); + bill.setItTaxAmt(rs.getDouble("ext_it_tax_amt")); + bill.setRtgsFilePath(rs.getString("ext_rtgs_file_path")); + bill.setPercentApplied(rs.getDouble("ext_percent_applied")); + bill.setSnaRetAmt(rs.getDouble("ext_sna_ret_amt")); + + billDetList.add(bill); + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return billDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExistExtContDet.java b/src/main/java/com/cont_mgmt/repository/FetchExistExtContDet.java new file mode 100644 index 0000000..0e6028f --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExistExtContDet.java @@ -0,0 +1,150 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Contract; + +public class FetchExistExtContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(int vendId, String contNum) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List contList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch contract details based on vend_id and cont_num + query = "select c.ext_cont_num, c2.vend_id , c.ext_cont_start_date, c.ext_cont_end_date, c.ext_cont_amt, " + + "i.invoice_bill_type_name, c.ext_wo_file_path, c.ext_as_file_path, c.ext_agree_file_path, " + + "c.ext_sd_amt, c.ext_asd_amt, c.ext_sd_file_path, c.ext_asd_file_path, c2.cont_rmrk " + + "from tbl_ext_cont_det c inner join tbl_invoice_bill_type_det i " + + "on c.ext_invoice_bill_type_id = i.invoice_bill_type_id inner join tbl_cont_det c2 " + + "on c2.cont_num = c.ext_cont_num where "; + + boolean hasWhereClause = false; + + // If both parameters are provided + if (contNum != null && !contNum.trim().isEmpty() && vendId >= 1) { + query += "c.ext_cont_num = ? and c2.vend_id = ?"; + hasWhereClause = true; + } else { + // If only contNum is provided + if (contNum != null && !contNum.trim().isEmpty()) { + query += "c.ext_cont_num = ?"; + hasWhereClause = true; + } + // If only vendId is provided + if (vendId >= 1) { + if (hasWhereClause) { + query += " and c2.vend_id = ?"; + } else { + query += "c2.vend_id = ?"; + hasWhereClause = true; + } + } + } + + query += " order by to_date(c.ext_cont_start_date,'DD-MM-YYYY'), " + + "to_date(c.ext_cont_end_date,'DD-MM-YYYY')"; + + // Prepare statement after constructing the query + ps = con.prepareStatement(query); + int paramIndex = 1; + + // Bind parameters + if (contNum != null && !contNum.trim().isEmpty() && vendId >= 1) { + ps.setString(paramIndex++, contNum); // Set contNum + ps.setInt(paramIndex++, vendId); // Set vendId + } else { + if (contNum != null && !contNum.trim().isEmpty()) { + ps.setString(paramIndex++, contNum); // Set contNum + } + if (vendId >= 1) { + ps.setInt(paramIndex++, vendId); // Set vendId + } + } + + // Execute the query + rs = ps.executeQuery(); + + // Initialize the list + contList = new ArrayList(); + + while (rs.next()) { + + int storedVendId = rs.getInt("vend_id"); + String storedContNum = rs.getString("ext_cont_num"); + + if (storedVendId == vendId || storedContNum.equals(contNum)) { + + Contract contract = new Contract(); + contract.setContNum(rs.getString("ext_cont_num")); + contract.setContStartDate(rs.getString("ext_cont_start_date")); + contract.setContEndDate(rs.getString("ext_cont_end_date")); + contract.setContAmt(rs.getDouble("ext_cont_amt")); + contract.setInvoiceBillTypeName(rs.getString("invoice_bill_type_name")); + contract.setContASFilePath(rs.getString("ext_as_file_path")); + contract.setContWOFilePath(rs.getString("ext_wo_file_path")); + contract.setVendId(rs.getInt("vend_id")); + contract.setContAgreeFilePath(rs.getString("ext_agree_file_path")); + contract.setAsdAmt(rs.getDouble("ext_asd_amt")); + contract.setSdAmt(rs.getDouble("ext_sd_amt")); + contract.setContASDFilePath(rs.getString("ext_asd_file_path")); + contract.setContSDFilePath(rs.getString("ext_sd_file_path")); + contract.setContRmrk(rs.getString("cont_rmrk")); + + contList.add(contract); + } + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return contList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExistVendDet.java b/src/main/java/com/cont_mgmt/repository/FetchExistVendDet.java new file mode 100644 index 0000000..4cda44a --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExistVendDet.java @@ -0,0 +1,164 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Vendor; + +public class FetchExistVendDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(int vendId, String vendName, String vendKey, String searchType) + throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + List vendList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Prepare the query + query = "select v.vend_id, v.vend_name, v.vend_addr, v.gst_num, v.pan_num, " + + "v.tel_num_1, v.tel_num_2, v.email_id, p.prod_cat_name, " + + "count(distinct c.cont_num) as cont_count from tbl_vend_det v " + + "inner join tbl_prod_cat_det p on p.prod_cat_id = v.prod_cat_id " + + "left join tbl_cont_det c on c.vend_id = v.vend_id where "; + + boolean hasWhereClause = false; + + // If vendName is present + if (vendName != null && !vendName.trim().isEmpty()) { + query += "v.vend_name = ?"; + hasWhereClause = true; + } + + // If vendId is present + if (vendId >= 1) { + if (hasWhereClause) { + query += " and "; + } + query += "v.vend_id = ?"; + hasWhereClause = true; + } + + // If vendKey is present + if (vendKey != null && !vendKey.trim().isEmpty()) { + if (hasWhereClause) { + query += " and "; + } + if (searchType.equalsIgnoreCase("work_desc")) { + query += "lower(c.work_desc) like ?"; + } else if (searchType.equalsIgnoreCase("cont_num")) { + query += "c.cont_num like ?"; + } + } + + query += " group by v.vend_id, v.vend_name, v.vend_addr, v.gst_num, v.pan_num, " + + "v.tel_num_1, v.tel_num_2, v.email_id, p.prod_cat_name "; + + // Prepare the statement after the query is fully constructed + ps = con.prepareStatement(query); + int paramIndex = 1; + + // Bind parameters + if (vendName != null && !vendName.trim().isEmpty()) { + ps.setString(paramIndex++, vendName); + } + if (vendId >= 1) { + ps.setInt(paramIndex++, vendId); + } + if (vendKey != null && !vendKey.trim().isEmpty()) { + System.out.println(searchType); + if (searchType.equalsIgnoreCase("work_desc")) { + ps.setString(paramIndex++, "%" + vendKey.toLowerCase() + "%"); + } else if (searchType.equalsIgnoreCase("cont_num")) { + ps.setString(paramIndex++, "%" + vendKey + "%"); + } + } + + System.out.println("Final SQL Query: " + query); + System.out.println("Parameters: "); + if (vendName != null && !vendName.trim().isEmpty()) { + System.out.println("vendName = " + vendName); + } + if (vendId >= 1) { + System.out.println("vendId = " + vendId); + } + if (vendKey != null && !vendKey.trim().isEmpty()) { + if (searchType.equalsIgnoreCase("work_desc")) { + System.out.println("vendKey - work_desc (LIKE) = %" + vendKey.toLowerCase() + "%"); + } else if (searchType.equalsIgnoreCase("cont_num")) { + System.out.println("vendKey - cont_num (LIKE) = %" + vendKey + "%"); + } + } + + // Execute the query + rs = ps.executeQuery(); + + // Initialize the list + vendList = new ArrayList(); + + while (rs.next()) { + + // Populate Vendor object + Vendor vendor = new Vendor(); + vendor.setEmailId(rs.getString("email_id")); + vendor.setGstNum(rs.getString("gst_num")); + vendor.setPanNum(rs.getString("pan_num")); + vendor.setProdCatName(rs.getString("prod_cat_name")); + vendor.setTelNum1(rs.getString("tel_num_1")); + vendor.setTelNum2(rs.getString("tel_num_2")); + vendor.setVendAddr(rs.getString("vend_addr")); + vendor.setVendName(rs.getString("vend_name")); + vendor.setVendId(rs.getInt("vend_id")); + vendor.setContCount(rs.getInt("cont_count")); + vendList.add(vendor); + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return vendList; + } +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExtBillDet.java b/src/main/java/com/cont_mgmt/repository/FetchExtBillDet.java new file mode 100644 index 0000000..68437ef --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExtBillDet.java @@ -0,0 +1,107 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Bill; + +public class FetchExtBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public Bill fetch(int extInvoiceId) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + Bill bill = null; + + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select i.ext_invoice_id, i.ext_invoice_billing_period, i.ext_amt_paid, i.ext_amt_excl_tax, " + + "i.ext_cgst_amt, i.ext_sgst_amt, i.ext_igst_amt, i.ext_tot_amt, i.ext_amt_due, " + + "i.ext_invoice_start_date, i.ext_invoice_end_date, c.ext_cont_amt, i.ext_sna_ret_amt, " + + "i.ext_invoice_billing_date, i.ext_it_tax_amt from tbl_ext_invoice_det i " + + "inner join tbl_ext_cont_det c on i.ext_cont_num = c.ext_cont_num " + + "where i.ext_invoice_id = ?"; + + ps = con.prepareStatement(query); + ps.setInt(1, extInvoiceId); + + // Execute the query + rs = ps.executeQuery(); + + if (rs.next()) { + + int storedInvoiceId = rs.getInt("ext_invoice_id"); + + if (storedInvoiceId == extInvoiceId) { + // Populate Bill Object + bill = new Bill(); + bill.setAmtDue(rs.getDouble("ext_amt_due")); + bill.setAmtExclTax(rs.getDouble("ext_amt_excl_tax")); + bill.setAmtPaid(rs.getDouble("ext_amt_paid")); + bill.setCgstAmt(rs.getDouble("ext_cgst_amt")); + bill.setContAmt(rs.getDouble("ext_cont_amt")); + bill.setIgstAmt(rs.getDouble("ext_igst_amt")); + bill.setInvoiceBillingPeriod(rs.getString("ext_invoice_billing_period")); + bill.setInvoiceEndDate(rs.getString("ext_invoice_end_date")); + bill.setInvoiceStartDate(rs.getString("ext_invoice_start_date")); + bill.setSgstAmt(rs.getDouble("ext_sgst_amt")); + bill.setTotAmt(rs.getDouble("ext_tot_amt")); + bill.setInvoiceBillDate(rs.getString("ext_invoice_billing_date")); + bill.setItTaxAmt(rs.getDouble("ext_it_tax_amt")); + bill.setSnaRetAmt(rs.getDouble("ext_sna_ret_amt")); + // Commit the transaction + con.commit(); + return bill; + } + + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return null; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExtContDet.java b/src/main/java/com/cont_mgmt/repository/FetchExtContDet.java new file mode 100644 index 0000000..02b2b48 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExtContDet.java @@ -0,0 +1,85 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Contract; + +public class FetchExtContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public Contract fetch(String existContNum) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + Contract contract = null; + + try { + con = conn.oracleCon(); + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + query = "select c.ext_cont_num, c.ext_cont_start_date, c.ext_cont_end_date, c.ext_wo_file_path, " + + "c.ext_as_file_path, c.ext_cont_amt, c.ext_agree_file_path, i.invoice_bill_type_name, " + + "c.ext_sd_amt, c.ext_asd_amt from tbl_ext_cont_det c " + "inner join tbl_invoice_bill_type_det i " + + "on i.invoice_bill_type_id = c.ext_invoice_bill_type_id where c.ext_cont_num = ?"; + ps = con.prepareStatement(query); + ps.setString(1, existContNum); + rs = ps.executeQuery(); + if (rs.next()) { + String storedContNum = rs.getString("ext_cont_num"); + if (storedContNum.equals(existContNum)) { + contract = new Contract(); + contract.setContAmt(rs.getDouble("ext_cont_amt")); + contract.setContEndDate(rs.getString("ext_cont_end_date")); + contract.setContNum(rs.getString("ext_cont_num")); + contract.setContStartDate(rs.getString("ext_cont_start_date")); + contract.setContWOFilePath(rs.getString("ext_wo_file_path")); + contract.setContASFilePath(rs.getString("ext_as_file_path")); + contract.setContAgreeFilePath(rs.getString("ext_agree_file_path")); + contract.setInvoiceBillTypeName(rs.getString("invoice_bill_type_name")); + contract.setAsdAmt(rs.getDouble("ext_asd_amt")); + contract.setSdAmt(rs.getDouble("ext_sd_amt")); + } + } + con.commit(); + } catch (ClassNotFoundException | SQLException e) { + if (con != null) { + try { + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + + if (ps != null) { + ps.close(); + } + + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + + } + return contract; + + } +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchExtInvoiceBillDateDet.java b/src/main/java/com/cont_mgmt/repository/FetchExtInvoiceBillDateDet.java new file mode 100644 index 0000000..140047e --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchExtInvoiceBillDateDet.java @@ -0,0 +1,76 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchExtInvoiceBillDateDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public String fetch(String contNum, String invoiceBillingPeriod) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + String res = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch Invoice Bill Date based on contNum and invoiceBillingPeriod + query = "select ext_invoice_billing_date from tbl_ext_invoice_det where ext_invoice_billing_period = ? " + + "and ext_cont_num = ?"; + ps = con.prepareStatement(query); + ps.setString(1, invoiceBillingPeriod); + ps.setString(2, contNum); + + // Execute the query + rs = ps.executeQuery(); + + if (rs.next()) { + res = rs.getString("ext_invoice_billing_date"); + } + + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return res; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchInvoiceBillDateDet.java b/src/main/java/com/cont_mgmt/repository/FetchInvoiceBillDateDet.java new file mode 100644 index 0000000..a8d9ce3 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchInvoiceBillDateDet.java @@ -0,0 +1,76 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchInvoiceBillDateDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public String fetch(String contNum, String invoiceBillingPeriod) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + String res = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch Invoice Bill Date based on contNum and invoiceBillingPeriod + query = "select invoice_billing_date from tbl_invoice_det where invoice_billing_period = ? " + + "and cont_num = ?"; + ps = con.prepareStatement(query); + ps.setString(1, invoiceBillingPeriod); + ps.setString(2, contNum); + + // Execute the query + rs = ps.executeQuery(); + + if (rs.next()) { + res = rs.getString("invoice_billing_date"); + } + + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return res; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchInvoiceBillTypeDet.java b/src/main/java/com/cont_mgmt/repository/FetchInvoiceBillTypeDet.java new file mode 100644 index 0000000..9c739c1 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchInvoiceBillTypeDet.java @@ -0,0 +1,84 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.InvoiceBillType; + +public class FetchInvoiceBillTypeDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch() { + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List invoiceBillTypeDetList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Query to fetch invoice bill type + query = "select invoice_bill_type_id, invoice_bill_type_name from tbl_invoice_bill_type_det " + + "order by invoice_bill_type_id"; + ps = con.prepareStatement(query); + rs = ps.executeQuery(); + + // Initialize the list + invoiceBillTypeDetList = new ArrayList(); + + while (rs.next()) { + + InvoiceBillType invoiceBillType = new InvoiceBillType(); + invoiceBillType.setInvoiceBillTypeId(rs.getInt("invoice_bill_type_id")); + invoiceBillType.setInvoiceBillTypeName(rs.getString("invoice_bill_type_name")); + + invoiceBillTypeDetList.add(invoiceBillType); + + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return invoiceBillTypeDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchProdCatDet.java b/src/main/java/com/cont_mgmt/repository/FetchProdCatDet.java new file mode 100644 index 0000000..918465e --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchProdCatDet.java @@ -0,0 +1,82 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.ProdCat; + +public class FetchProdCatDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch() { + + Connection con = null; + ResultSet rs = null; + PreparedStatement ps = null; + String query = null; + List prodCatDetList = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Query to fetch invoice bill type + query = "select prod_cat_id, prod_cat_name from tbl_prod_cat_det " + "order by prod_cat_id"; + ps = con.prepareStatement(query); + rs = ps.executeQuery(); + + // Initialize the list + prodCatDetList = new ArrayList(); + + while (rs.next()) { + + ProdCat prodCat = new ProdCat(); + prodCat.setProdCatId(rs.getInt("prod_cat_id")); + prodCat.setProdCatName(rs.getString("prod_cat_name")); + prodCatDetList.add(prodCat); + + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return prodCatDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchStats.java b/src/main/java/com/cont_mgmt/repository/FetchStats.java new file mode 100644 index 0000000..946fb63 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchStats.java @@ -0,0 +1,81 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchStats { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List> fetch() throws SQLException, ClassNotFoundException { + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + List> listObject = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Start building the query + query = "select nvl(c1.ext_cont_num, c.cont_num) as cont_num, " + + "nvl(c1.ext_cont_end_date, c.cont_end_date) as cont_end_date from tbl_cont_det c " + + "left join tbl_ext_cont_det c1 on c.cont_num = c1.ext_cont_num"; + ps = con.prepareStatement(query); + + rs = ps.executeQuery(); // Execute the query + + listObject = new ArrayList>(); + + while (rs.next()) { + Map mapObject = new HashMap(); + mapObject.put("contNum", rs.getString("cont_num")); + mapObject.put("contEndDate", rs.getString("cont_end_date")); + listObject.add(mapObject); + } + // Commit the transaction + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return listObject; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchTotAmtDueByContNum.java b/src/main/java/com/cont_mgmt/repository/FetchTotAmtDueByContNum.java new file mode 100644 index 0000000..b233e8b --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchTotAmtDueByContNum.java @@ -0,0 +1,89 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchTotAmtDueByContNum { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(String contNum) throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + String query = null; + List amt = null; + + boolean contAmtAdded = false; + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select c.cont_amt, i.amt_paid from tbl_cont_det c join tbl_invoice_det i " + + "on i.cont_num = c.cont_num join tbl_bill_stat_type_det b " + + "on i.bill_stat_type_id = b.bill_stat_type_id where b.bill_stat_type_name = 'CLAIMED'" + + "and c.cont_num = ?"; + + ps = con.prepareStatement(query); + ps.setString(1, contNum); + + // Execute the query + rs = ps.executeQuery(); + + amt = new ArrayList(); + + while (rs.next()) { + if (!contAmtAdded) { + amt.add(rs.getDouble("cont_amt")); + contAmtAdded = true; + } + amt.add(rs.getDouble("amt_paid")); + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return amt; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchTotAmtDueByExtContNum.java b/src/main/java/com/cont_mgmt/repository/FetchTotAmtDueByExtContNum.java new file mode 100644 index 0000000..f98947c --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchTotAmtDueByExtContNum.java @@ -0,0 +1,90 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchTotAmtDueByExtContNum { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(String extContNum) throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + String query = null; + List amt = null; + + boolean contAmtAdded = false; + try { + + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch bill details based on cont_num + query = "select c.ext_cont_amt, i.ext_amt_paid from tbl_ext_cont_det c join tbl_ext_invoice_det i " + + "on i.ext_cont_num = c.ext_cont_num join tbl_bill_stat_type_det b " + + "on i.ext_bill_stat_type_id = b.bill_stat_type_id where b.bill_stat_type_name = 'CLAIMED'" + + "and c.ext_cont_num = ?"; + + ps = con.prepareStatement(query); + ps.setString(1, extContNum); + + // Execute the query + rs = ps.executeQuery(); + + amt = new ArrayList(); + + while (rs.next()) { + if (!contAmtAdded) { + amt.add(rs.getDouble("ext_cont_amt")); + contAmtAdded = true; + } + amt.add(rs.getDouble("ext_amt_paid")); + } + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return amt; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchUserLoginDet.java b/src/main/java/com/cont_mgmt/repository/FetchUserLoginDet.java new file mode 100644 index 0000000..2fa3cb0 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchUserLoginDet.java @@ -0,0 +1,82 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.User; + +public class FetchUserLoginDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public User fetch(String usrName, String usrPass) throws SQLException, ClassNotFoundException { + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + User user = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch user details based on user name and user password + query = "SELECT user_id, user_name, user_pass FROM tbl_users_det WHERE user_name = ? AND user_pass = ?"; + ps = con.prepareStatement(query); + ps.setString(1, usrName); + ps.setString(2, usrPass); + rs = ps.executeQuery(); // Execute the query + + if (rs.next()) { + String storedUsrName = rs.getString("user_name"); + String storedUsrPass = rs.getString("user_pass"); + + if (storedUsrName.equals(usrName) && storedUsrPass.equals(usrPass)) { + // Populate user object + user = new User(); + user.setUserId(rs.getInt("user_id")); + user.setUserName(rs.getString("user_name")); + + // Commit the transaction + con.commit(); + return user; + } + } + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return null; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchVendDet.java b/src/main/java/com/cont_mgmt/repository/FetchVendDet.java new file mode 100644 index 0000000..580d48f --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchVendDet.java @@ -0,0 +1,88 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; +import com.cont_mgmt.dto.Vendor; + +public class FetchVendDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public Vendor fetch(int vendId) throws SQLException, ClassNotFoundException { + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + Vendor vendor = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Fetch vendor details based on vendor id + query = "select v.vend_id, v.vend_name, v.vend_addr, v.gst_num, v.pan_num, v.tel_num_1, " + + "v.tel_num_2, v.email_id, p.prod_cat_name from tbl_vend_det v " + + "inner join tbl_prod_cat_det p on p.prod_cat_id = v.prod_cat_id " + "where v.vend_id = ?"; + ps = con.prepareStatement(query); + ps.setInt(1, vendId); + rs = ps.executeQuery(); // Execute the query + if (rs.next()) { + int storedVendId = rs.getInt("vend_id"); + + if (storedVendId == vendId) { + // Populate Vendor object + vendor = new Vendor(); + vendor.setEmailId(rs.getString("email_id")); + vendor.setGstNum(rs.getString("gst_num")); + vendor.setPanNum(rs.getString("pan_num")); + vendor.setProdCatName(rs.getString("prod_cat_name")); + vendor.setTelNum1(rs.getString("tel_num_1")); + vendor.setTelNum2(rs.getString("tel_num_2")); + vendor.setVendAddr(rs.getString("vend_addr")); + vendor.setVendName(rs.getString("vend_name")); + vendor.setVendId(rs.getInt("vend_id")); + + // Commit the transaction + con.commit(); + return vendor; + } + } + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return null; + } +} diff --git a/src/main/java/com/cont_mgmt/repository/FetchWorkTypeSuggestions.java b/src/main/java/com/cont_mgmt/repository/FetchWorkTypeSuggestions.java new file mode 100644 index 0000000..a4ada7e --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/FetchWorkTypeSuggestions.java @@ -0,0 +1,82 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import com.cont_mgmt.dbconnection.DbCon; + +public class FetchWorkTypeSuggestions { + + // Call the driver class + private DbCon conn = new DbCon(); + + public List fetch(String queryTerm, String searchType) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + ResultSet rs = null; + String query = null; + PreparedStatement ps = null; + List fetchedSuggestions = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Start building the base query + if (searchType.equalsIgnoreCase("work_desc")) { + query = "select distinct work_desc as res from tbl_cont_det where lower(work_desc) like ?"; + } else if (searchType.equalsIgnoreCase("cont_num")) { + query = "select distinct cont_num as res from tbl_cont_det where lower(cont_num) like ?"; + } else { + throw new IllegalArgumentException("Invalid Search Type : " + searchType); + } + ps = con.prepareStatement(query); + ps.setString(1, "%" + queryTerm.toLowerCase() + "%"); + + // Execute the query + rs = ps.executeQuery(); + + fetchedSuggestions = new ArrayList(); + + while (rs.next()) { + fetchedSuggestions.add(rs.getString("res")); + } + // Commit the transaction + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return fetchedSuggestions; + } +} diff --git a/src/main/java/com/cont_mgmt/repository/InsertBillDet.java b/src/main/java/com/cont_mgmt/repository/InsertBillDet.java new file mode 100644 index 0000000..82862d0 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/InsertBillDet.java @@ -0,0 +1,99 @@ +package com.cont_mgmt.repository; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; + +import com.cont_mgmt.dbconnection.DbCon; + +public class InsertBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public int insert(String contNum, Double itTaxAmt, String invoiceBillingPeriod, String invoiceStartDate, + String invoiceEndDate, double invoiceAmt, double contAmt, double amtDue, double amtExclTax, + Double newCGSTAmt, Double newSGSTAmt, Double newIGSTAmt, double totAmt, String billFilePath, + String invoiceFilePath, Integer usrId, String invoiceBilledDate, Double newPercent, Double snaRetAmt) + throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + int invoiceId = 0; + CallableStatement cs = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + query = "begin insert into tbl_invoice_det (cont_num, bill_stat_type_id, invoice_billing_period, " + + "invoice_start_date, invoice_end_date, amt_paid, amt_excl_tax, cgst_amt, sgst_amt, igst_amt, " + + "tot_amt, amt_due, bill_file_path, opr_user_id, invoice_billing_date, opr_upd_user_id, " + + "invoice_file_path, it_tax_amt, rtgs_file_path, percent_applied, sna_ret_amt) " + + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) returning invoice_id into ?; end;"; + cs = con.prepareCall(query); + cs.setString(1, contNum); + cs.setInt(2, 2); + cs.setString(3, invoiceBillingPeriod); + cs.setString(4, invoiceStartDate); + cs.setString(5, invoiceEndDate); + cs.setDouble(6, invoiceAmt); + cs.setDouble(7, amtExclTax); + cs.setDouble(8, newCGSTAmt); + cs.setDouble(9, newSGSTAmt); + cs.setDouble(10, newIGSTAmt); + cs.setDouble(11, totAmt); + cs.setDouble(12, amtDue); + cs.setString(13, billFilePath); + cs.setInt(14, usrId); + cs.setString(15, invoiceBilledDate); + cs.setInt(16, -1); + cs.setString(17, invoiceFilePath); + cs.setDouble(18, itTaxAmt); + cs.setString(19, "-"); + cs.setDouble(20, newPercent); + cs.setDouble(21, snaRetAmt); + + // register OUT parameter + cs.registerOutParameter(22, Types.INTEGER); + + // Execute + cs.execute(); + + // Get returned invoice_id + invoiceId = cs.getInt(22); + + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (cs != null) { + cs.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return invoiceId; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/InsertContDet.java b/src/main/java/com/cont_mgmt/repository/InsertContDet.java new file mode 100644 index 0000000..21dbe27 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/InsertContDet.java @@ -0,0 +1,99 @@ +package com.cont_mgmt.repository; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; + +import com.cont_mgmt.dbconnection.DbCon; + +public class InsertContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public String insert(String contNum, Integer vendId, String contStartDate, String contEndDate, Double contAmt, + Double emdAmt, String loiFilePath, Integer invoiceBillTypeId, String workDesc, String asFilePath, + String agreeFilePath, String woFilePath, Integer usrId, String contRmrk) + throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + CallableStatement cs = null; + String query = null; + String res = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Insert contract details + query = "BEGIN INSERT INTO tbl_cont_det (cont_num, vend_id, cont_start_date, cont_end_date, cont_amt, " + + "invoice_bill_type_id, loa_file_path, work_desc, wo_file_path, as_file_path, " + + "agree_file_path, opr_user_id, is_ext, opr_upd_user_id, emd_amt, sd_amt, " + + "asd_amt, emd_file_path, sd_file_path, asd_file_path, cont_rmrk) VALUES (?, ?, ?, ?, " + + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING cont_num INTO ?; END;"; + cs = con.prepareCall(query); + cs.setString(1, contNum); + cs.setInt(2, vendId); + cs.setString(3, contStartDate); + cs.setString(4, contEndDate); + cs.setDouble(5, contAmt); + cs.setInt(6, invoiceBillTypeId); + cs.setString(7, loiFilePath); + cs.setString(8, workDesc); + cs.setString(9, woFilePath); + cs.setString(10, asFilePath); + cs.setString(11, agreeFilePath); + cs.setInt(12, usrId); + cs.setInt(13, 0); + cs.setInt(14, -1); + cs.setDouble(15, emdAmt); + cs.setDouble(16, 0); + cs.setDouble(17, 0); + cs.setString(18, "-"); + cs.setString(19, "-"); + cs.setString(20, "-"); + cs.setString(21, contRmrk); + + // register OUT parameter + cs.registerOutParameter(22, Types.VARCHAR); + + // Execute + cs.executeUpdate(); + + // Get returned cont_num + res = cs.getString(22); + + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (cs != null) { + cs.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return res; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/InsertExtBillDet.java b/src/main/java/com/cont_mgmt/repository/InsertExtBillDet.java new file mode 100644 index 0000000..5689473 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/InsertExtBillDet.java @@ -0,0 +1,96 @@ +package com.cont_mgmt.repository; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; + +import com.cont_mgmt.dbconnection.DbCon; + +public class InsertExtBillDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public int insert(String contNum, Double itTaxAmt, String invoiceBillingPeriod, String invoiceStartDate, + String invoiceEndDate, double invoiceAmt, double contAmt, double amtDue, double amtExclTax, + Double newCGSTAmt, Double newSGSTAmt, Double newIGSTAmt, double totAmt, String billFilePath, + String invoiceFilePath, Integer usrId, String invoiceBilledDate, Double newPercent, Double extSNARetAmt) + throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + int invoiceId = 0; + CallableStatement cs = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + query = "begin insert into tbl_ext_invoice_det (ext_cont_num, ext_bill_stat_type_id, ext_invoice_billing_period, " + + "ext_invoice_start_date, ext_invoice_end_date, ext_amt_paid, ext_amt_excl_tax, ext_cgst_amt, " + + "ext_sgst_amt, ext_igst_amt, ext_tot_amt, ext_amt_due, ext_bill_file_path, opr_user_id, " + + "ext_invoice_billing_date, opr_upd_user_id, ext_invoice_file_path, ext_it_tax_amt, " + + "ext_rtgs_file_path, ext_percent_applied, ext_sna_ret_amt) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " + + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) returning ext_invoice_id into ?; end;"; + cs = con.prepareCall(query); + cs.setString(1, contNum); + cs.setInt(2, 2); + cs.setString(3, invoiceBillingPeriod); + cs.setString(4, invoiceStartDate); + cs.setString(5, invoiceEndDate); + cs.setDouble(6, invoiceAmt); + cs.setDouble(7, amtExclTax); + cs.setDouble(8, newCGSTAmt); + cs.setDouble(9, newSGSTAmt); + cs.setDouble(10, newIGSTAmt); + cs.setDouble(11, totAmt); + cs.setDouble(12, amtDue); + cs.setString(13, billFilePath); + cs.setInt(14, usrId); + cs.setString(15, invoiceBilledDate); + cs.setInt(16, -1); + cs.setString(17, invoiceFilePath); + cs.setDouble(18, itTaxAmt); + cs.setString(19, "-"); + cs.setDouble(20, newPercent); + cs.setDouble(21, extSNARetAmt); + + // register OUT parameter + cs.registerOutParameter(22, Types.INTEGER); + + // Execute + cs.execute(); + + // Get returned ext_invoice_id + invoiceId = cs.getInt(22); + + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return invoiceId; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/InsertExtContDet.java b/src/main/java/com/cont_mgmt/repository/InsertExtContDet.java new file mode 100644 index 0000000..1af25b4 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/InsertExtContDet.java @@ -0,0 +1,100 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class InsertExtContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public boolean insert(String existContNum, String extContStartDate, String extContEndDate, Double extContAmt, + String extASFilePath, String extWOFilePath, Integer usrId, String extAgreeFilePath, + Integer extInvoiceBillTypeId) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + PreparedStatement ps = null; + String query = null; + boolean flag = false; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Update the tbl_cont_det + query = "UPDATE tbl_cont_det SET is_ext = 1 ,db_updated_timestamp = SYSTIMESTAMP, " + + "usr_opr_updated_timestamp = CURRENT_TIMESTAMP, opr_upd_user_id = ? " + "WHERE cont_num = ?"; + ps = con.prepareStatement(query); + ps.setInt(1, usrId); + ps.setString(2, existContNum); + + int rowsAffected = ps.executeUpdate(); // Execute the query + ps.close(); // Close the PreparedStatement + + if (rowsAffected > 0) { + + query = "INSERT INTO tbl_ext_cont_det (ext_cont_num, ext_cont_start_date, ext_cont_end_date, " + + "ext_cont_amt, opr_user_id, ext_wo_file_path, ext_as_file_path, ext_agree_file_path, " + + "ext_invoice_bill_type_id, opr_upd_user_id, ext_sd_amt, ext_asd_amt, " + + "ext_sd_file_path, ext_asd_file_path) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + ps = con.prepareStatement(query); + ps.setString(1, existContNum); + ps.setString(2, extContStartDate); + ps.setString(3, extContEndDate); + ps.setDouble(4, extContAmt); + ps.setInt(5, usrId); + ps.setString(6, extWOFilePath); + ps.setString(7, extASFilePath); + ps.setString(8, extAgreeFilePath); + ps.setInt(9, extInvoiceBillTypeId); + ps.setInt(10, -1); + ps.setDouble(11, 0); + ps.setDouble(12, 0); + ps.setString(13, "-"); + ps.setString(14, "-"); + + int rowsAffected2 = ps.executeUpdate(); + + if (rowsAffected2 > 0) { + flag = true; + con.commit(); // Commit the transaction + } else { + con.rollback(); // Rollback if insert fails + } + } else { + con.rollback(); // Rollback if update fails + } + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return flag; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/InsertLogDet.class b/src/main/java/com/cont_mgmt/repository/InsertLogDet.class new file mode 100644 index 0000000..0bd0213 Binary files /dev/null and b/src/main/java/com/cont_mgmt/repository/InsertLogDet.class differ diff --git a/src/main/java/com/cont_mgmt/repository/InsertLogDet.java b/src/main/java/com/cont_mgmt/repository/InsertLogDet.java new file mode 100644 index 0000000..8eb09f5 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/InsertLogDet.java @@ -0,0 +1,68 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class InsertLogDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public void insert(Integer usrId, String usrIPAddr, String usrOpr) { + // TODO Auto-generated method stub + + Connection con = null; + PreparedStatement ps = null; + String query = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + query = "INSERT INTO tbl_log_det (user_id, user_operation, user_ip_addr) VALUES (?, ?, ?)"; + ps = con.prepareStatement(query); + if (usrId == 0) { + ps.setInt(1, -1); + } else { + ps.setInt(1, usrId); + } + ps.setString(2, usrOpr); + ps.setString(3, usrIPAddr); + + ps.executeUpdate(); // Execute the query + + // Commit the transaction + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + e.printStackTrace(); + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/InsertVendDet.java b/src/main/java/com/cont_mgmt/repository/InsertVendDet.java new file mode 100644 index 0000000..ba4bf14 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/InsertVendDet.java @@ -0,0 +1,83 @@ +package com.cont_mgmt.repository; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; + +import com.cont_mgmt.dbconnection.DbCon; + +public class InsertVendDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public int insert(String vendName, String vendAddr, String gstNum, String panNum, Integer prodCatId, String telNum1, + String telNum2, String emailId, Integer usrId) + throws SQLException, ClassNotFoundException, NullPointerException { + + Connection con = null; + String query = null; + CallableStatement cs = null; + int vendId = 0; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Insert contract details + query = "BEGIN INSERT INTO tbl_vend_det (vend_name, vend_addr, gst_num, pan_num, tel_num_1, tel_num_2, email_id, " + + "prod_cat_id, opr_user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING vend_id INTO ?; END;"; + cs = con.prepareCall(query); + cs.setString(1, vendName); + cs.setString(2, vendAddr); + cs.setString(3, gstNum); + cs.setString(4, panNum); + cs.setString(5, telNum1); + cs.setString(6, telNum2); + cs.setString(7, emailId); + cs.setInt(8, prodCatId); + cs.setInt(9, usrId); + + // register OUT parameter to capture the generated vend_id + cs.registerOutParameter(10, Types.INTEGER); + + // Execute + cs.executeUpdate(); + + // get the returned vend_id + vendId = cs.getInt(10); + + con.commit(); + + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (cs != null) { + cs.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return vendId; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/ModifyBillStat.java b/src/main/java/com/cont_mgmt/repository/ModifyBillStat.java new file mode 100644 index 0000000..b6d7f02 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/ModifyBillStat.java @@ -0,0 +1,82 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class ModifyBillStat { + + // Call the driver class + private DbCon conn = new DbCon(); + + public boolean update(String contNum, String invoiceBillPeriod, String rtgsFilePath, Integer usrId) + throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + PreparedStatement ps = null; + boolean flag = false; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Check for null values and throw a meaningful NullPointerException + if (invoiceBillPeriod == null) { + throw new NullPointerException("Invoice Billing Period cannot be empty"); + } + + query = "UPDATE tbl_invoice_det SET bill_stat_type_id = 1, db_updated_timestamp = SYSTIMESTAMP, " + + "usr_opr_updated_timestamp = CURRENT_TIMESTAMP, opr_upd_user_id = ?, " + + "rtgs_file_path = ? WHERE cont_num = ? and invoice_billing_period = ?"; + ps = con.prepareStatement(query); + ps.setInt(1, usrId); + ps.setString(2, rtgsFilePath); + ps.setString(3, contNum); + ps.setString(4, invoiceBillPeriod); + + int rowsAffected = ps.executeUpdate(); // Execute the query + + if (rowsAffected > 0) { + flag = true; + } + + // Commit the transaction + con.commit(); + + } catch (NullPointerException e) { + throw new NullPointerException("Null value encountered: " + e.getMessage()); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + throw sqle; + } + } + throw e; + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + throw sqle; + } + } + return flag; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/ModifyExtBillStat.java b/src/main/java/com/cont_mgmt/repository/ModifyExtBillStat.java new file mode 100644 index 0000000..65fd0fa --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/ModifyExtBillStat.java @@ -0,0 +1,82 @@ +package com.cont_mgmt.repository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import com.cont_mgmt.dbconnection.DbCon; + +public class ModifyExtBillStat { + + // Call the driver class + private DbCon conn = new DbCon(); + + public boolean update(String contNum, String invoiceBillPeriod, String rtgsFilePath, Integer usrId) + throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + PreparedStatement ps = null; + boolean flag = false; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Check for null values and throw a meaningful NullPointerException + if (invoiceBillPeriod == null) { + throw new NullPointerException("Invoice Billing Period cannot be empty"); + } + + query = "UPDATE tbl_ext_invoice_det SET ext_bill_stat_type_id = 1, db_updated_timestamp = SYSTIMESTAMP, " + + "usr_opr_updated_timestamp = CURRENT_TIMESTAMP, opr_upd_user_id = ?, " + + "ext_rtgs_file_path = ? WHERE ext_cont_num = ? and ext_invoice_billing_period = ?"; + ps = con.prepareStatement(query); + ps.setInt(1, usrId); + ps.setString(2, rtgsFilePath); + ps.setString(3, contNum); + ps.setString(4, invoiceBillPeriod); + + int rowsAffected = ps.executeUpdate(); // Execute the query + + if (rowsAffected > 0) { + flag = true; + } + + // Commit the transaction + con.commit(); + + } catch (NullPointerException e) { + throw new NullPointerException("Null value encountered: " + e.getMessage()); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + throw sqle; + } + } + throw e; + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + throw sqle; + } + } + return flag; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/UpdateContDet.java b/src/main/java/com/cont_mgmt/repository/UpdateContDet.java new file mode 100644 index 0000000..0206a2d --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/UpdateContDet.java @@ -0,0 +1,128 @@ +package com.cont_mgmt.repository; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; + +import com.cont_mgmt.dbconnection.DbCon; + +public class UpdateContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public String update(String contNum, String contStartDate, String contEndDate, Integer vendId, Double contAmt, + Double sdAmt, Double finalASDAmt, Double finalEMDAmt, String loaFilePath, String asFilePath, + String woFilePath, String agreeFilePath, String emdFilePath, Integer invoiceBillTypeId, String workDesc, + Integer usrId) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + CallableStatement cs = null; + String res = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Start building the base query + query = "BEGIN UPDATE tbl_cont_det SET cont_start_date = ?, cont_end_date = ?, cont_amt = ?, " + + "invoice_bill_type_id = ?, work_desc = ?, db_updated_timestamp = SYSTIMESTAMP, " + + "usr_opr_updated_timestamp = CURRENT_TIMESTAMP, opr_upd_user_id = ?, " + + "emd_amt = ?, sd_amt = ?, asd_amt = ?, emd_file_path = ?"; + // Dynamically append file paths if present + boolean addLOA = !"-".equals(loaFilePath); + boolean addAgree = !"-".equals(agreeFilePath); + boolean addAS = !"-".equals(asFilePath); + boolean addWO = !"-".equals(woFilePath); + if (addLOA) { + query += ", loa_file_path = ?"; + } + if (addAS) { + query += ", as_file_path = ?"; + } + if (addAgree) { + query += ", agree_file_path = ?"; + } + if (addWO) { + query += ", wo_file_path = ?"; + } + // Ensure there is a space before WHERE clause + query += " WHERE cont_num = ? AND vend_id = ? RETURNING cont_num INTO ?; END;"; + + // Prepare the statement after the query is fully constructed + cs = con.prepareCall(query); + int paramIndex = 1; + + // Set fixed parameters + cs.setString(paramIndex++, contStartDate); + cs.setString(paramIndex++, contEndDate); + cs.setDouble(paramIndex++, contAmt); + cs.setInt(paramIndex++, invoiceBillTypeId); + cs.setString(paramIndex++, workDesc); + cs.setInt(paramIndex++, usrId); + cs.setDouble(paramIndex++, finalEMDAmt); + cs.setDouble(paramIndex++, sdAmt); + cs.setDouble(paramIndex++, finalASDAmt); + cs.setString(paramIndex++, emdFilePath); + // Dynamically set file paths if included + if (addLOA) { + cs.setString(paramIndex++, loaFilePath); + } + if (addAS) { + cs.setString(paramIndex++, asFilePath); + } + if (addAgree) { + cs.setString(paramIndex++, agreeFilePath); + } + if (addWO) { + cs.setString(paramIndex++, woFilePath); + } + // Set WHERE clause parameters + cs.setString(paramIndex++, contNum); + cs.setInt(paramIndex++, vendId); + + // Register OUT parameter + cs.registerOutParameter(paramIndex++, Types.VARCHAR); + + // Execute + cs.executeUpdate(); + int outParamIndex = paramIndex - 1; + + // get updated cont_num + res = cs.getString(outParamIndex); + + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (cs != null) { + cs.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return res; + + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/UpdateContRmrk.java b/src/main/java/com/cont_mgmt/repository/UpdateContRmrk.java new file mode 100644 index 0000000..0d3999b --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/UpdateContRmrk.java @@ -0,0 +1,82 @@ +package com.cont_mgmt.repository; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; + +import com.cont_mgmt.dbconnection.DbCon; + +public class UpdateContRmrk { + + // Call the driver class + private DbCon conn = new DbCon(); + + public String update(String contNum, String contRmrk, Integer usrId) throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + String query = null; + CallableStatement cs = null; + String res = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Start building the base query + query = "BEGIN UPDATE tbl_cont_det SET cont_rmrk = ?, db_updated_timestamp = SYSTIMESTAMP, " + + "usr_opr_updated_timestamp = CURRENT_TIMESTAMP, opr_upd_user_id = ? where " + "cont_num = ? " + + "RETURNING cont_num INTO ?; END;"; + + // Prepare the statement after the query is fully constructed + cs = con.prepareCall(query); + int paramIndex = 1; + + // Set fixed parameters and WHERE clause parameters + cs.setString(paramIndex++, contRmrk); + cs.setInt(paramIndex++, usrId); + cs.setString(paramIndex++, contNum); + + // Register OUT parameter to capture cont_num + cs.registerOutParameter(paramIndex++, Types.VARCHAR); + + // Execute + cs.executeUpdate(); + int outParamIndex = paramIndex - 1; + + // Get the returned cont_num + res = cs.getString(outParamIndex); + + // Commit transaction + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (cs != null) { + cs.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return res; + } + +} diff --git a/src/main/java/com/cont_mgmt/repository/UpdateExtContDet.java b/src/main/java/com/cont_mgmt/repository/UpdateExtContDet.java new file mode 100644 index 0000000..f21d415 --- /dev/null +++ b/src/main/java/com/cont_mgmt/repository/UpdateExtContDet.java @@ -0,0 +1,111 @@ +package com.cont_mgmt.repository; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; + +import com.cont_mgmt.dbconnection.DbCon; + +public class UpdateExtContDet { + + // Call the driver class + private DbCon conn = new DbCon(); + + public String update(String extContNum, String extContStartDate, String extContEndDate, Integer extVendId, + Double extContAmt, String extASFilePath, String extWOFilePath, String extAgreeFilePath, + Integer extInvoiceBillTypeId, Integer extUsrId, Double extSDAmt, Double extFinalASDAmt) + throws SQLException, ClassNotFoundException { + // TODO Auto-generated method stub + + Connection con = null; + CallableStatement cs = null; + String query = null; + String res = null; + + try { + // Establish database connection + con = conn.oracleCon(); + + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + + // Start building the base query + query = "BEGIN UPDATE tbl_ext_cont_det SET ext_cont_start_date = ?, ext_cont_end_date = ?, ext_cont_amt = ?, " + + "ext_invoice_bill_type_id = ?, db_updated_timestamp = SYSTIMESTAMP, ext_sd_amt = ?, " + + "ext_asd_amt = ?, usr_opr_updated_timestamp = CURRENT_TIMESTAMP, opr_upd_user_id = ?, " + + "ext_agree_file_path = ?"; + // Dynamically append file paths if present + boolean addWO = !"-".equals(extWOFilePath); + boolean addAS = !"-".equals(extASFilePath); + if (addAS) { + query += ", ext_as_file_path = ?"; + } + if (addWO) { + query += ", ext_wo_file_path = ?"; + } + // Ensure there is a space before WHERE clause + query += " WHERE ext_cont_num = ? RETURNING ext_cont_num INTO ?; END;"; + + // Prepare the statement after the query is fully constructed + cs = con.prepareCall(query); + int paramIndex = 1; + + // Set fixed parameters + cs.setString(paramIndex++, extContStartDate); + cs.setString(paramIndex++, extContEndDate); + cs.setDouble(paramIndex++, extContAmt); + cs.setInt(paramIndex++, extInvoiceBillTypeId); + cs.setDouble(paramIndex++, extSDAmt); + cs.setDouble(paramIndex++, extFinalASDAmt); + cs.setInt(paramIndex++, extUsrId); + cs.setString(paramIndex++, extAgreeFilePath); + // Dynamically set file paths if included + if (addAS) { + cs.setString(paramIndex++, extASFilePath); + } + if (addWO) { + cs.setString(paramIndex++, extWOFilePath); + } + // Set WHERE clause parameters + cs.setString(paramIndex++, extContNum); + + // Register OUT parameter for RETURNING + cs.registerOutParameter(paramIndex++, Types.VARCHAR); + + // Execute + cs.executeUpdate(); + int outParamIndex = paramIndex - 1; + + // Get returned ext_cont_num + res = cs.getString(outParamIndex); + + // Commit transaction + con.commit(); + } catch (SQLException | ClassNotFoundException e) { + if (con != null) { + try { + // Rollback the transaction in case of error + con.rollback(); + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + throw e; + } finally { + try { + if (cs != null) { + cs.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace(); + } + } + return res; + + } +} diff --git a/src/main/java/com/cont_mgmt/service/CloseContDetService.java b/src/main/java/com/cont_mgmt/service/CloseContDetService.java new file mode 100644 index 0000000..1288b64 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/CloseContDetService.java @@ -0,0 +1,83 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.repository.ClosureContDet; + +import jakarta.servlet.http.Part; + +public class CloseContDetService { + + // Call the ClosureContDet + private ClosureContDet closureContDet = new ClosureContDet(); + + // Call the NewContDetService + private NewContDetService newContDetService = new NewContDetService(); + + // Call the FileService to create directory if it is absent + private FileService fileService = new FileService(); + + public boolean closeContDet(String contNum, Double sdAmt, String asdAmtRfd, String contEndDate, Double amtDue, + String vendName, Part sdFilePart, Part asdFilePart, String basePath, Integer usrId) + throws IOException, ClassNotFoundException, SQLException { + boolean flag; + Double newASDAmtRfd; + + String sdFilePath; + String asdFilePath; + + String oldSDFilePath = newContDetService.getContDet(contNum).getContSDFilePath(); + String oldASDFilePath = newContDetService.getContDet(contNum).getContASDFilePath(); + String contStartDate = newContDetService.getContDet(contNum).getContStartDate(); + + if (asdAmtRfd != null && !asdAmtRfd.isEmpty()) { + newASDAmtRfd = Double.parseDouble(asdAmtRfd); + } else { + newASDAmtRfd = 0.0; + } + + // Create directory and handle file upload if file is present + if (asdFilePart != null && asdFilePart.getSize() > 0) { + fileService.createDirectory("ASD", fileService.getContractorDirectory(vendName, contNum, basePath)); + asdFilePath = fileService.saveFile(vendName, contNum, asdFilePart, "ASD", basePath, contStartDate); + } else { + asdFilePath = "-"; + } + + if (sdFilePart != null && sdFilePart.getSize() > 0) { + fileService.createDirectory("SD", fileService.getContractorDirectory(vendName, contNum, basePath)); + sdFilePath = fileService.saveFile(vendName, contNum, sdFilePart, "SD", basePath, contStartDate); + } else { + sdFilePath = "-"; + } + try { + Double finalSDAmt = newContDetService.getContDet(contNum).getSdAmt() - sdAmt; + Double finalASDAmt = newContDetService.getContDet(contNum).getAsdAmt() - newASDAmtRfd; + flag = closureContDet.update(contNum, finalSDAmt, finalASDAmt, asdFilePath, sdFilePath, usrId); + } catch (ClassNotFoundException | SQLException e) { + // TODO Auto-generated catch block + try { + fileService.deleteFileIfExists(sdFilePath); + if (asdFilePart != null && asdFilePart.getSize() > 0) { + fileService.deleteFileIfExists(asdFilePath); + } + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (flag) { + if (oldSDFilePath != null && !oldSDFilePath.trim().equals("-")) { + fileService.deleteFileIfExists(oldSDFilePath); + } + if (oldASDFilePath != null && !oldASDFilePath.trim().equals("-")) { + fileService.deleteFileIfExists(oldASDFilePath); + } + return flag; + } else { + return flag; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/CloseExtContDetService.java b/src/main/java/com/cont_mgmt/service/CloseExtContDetService.java new file mode 100644 index 0000000..f3bcda3 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/CloseExtContDetService.java @@ -0,0 +1,94 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.ClosureExtContDet; + +import jakarta.servlet.http.Part; + +public class CloseExtContDetService { + + // Call the ClosureExtContDet + private ClosureExtContDet closureExtContDet = new ClosureExtContDet(); + + // Call the ExtContDetService + private ExtContDetService extContDetService = new ExtContDetService(); + + // Call the FileService to create directory if it is absent + private FileService fileService = new FileService(); + + public boolean closeExtContDet(String extContNum, Double extSDAmtRfd, String extASDAmtRfd, String extContEndDate, + Double extAmtDue, String extVendName, Part extSDFilePart, Part extASDFilePart, String extBasePath, + Integer extUsrId) throws IOException, ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + boolean flag; + Double newExtASDAmtRfd; + System.out.println("SD File : " + extSDFilePart.getSize()); + System.out.println("ASD File : " + extASDFilePart.getSize()); + + Contract oldCont = extContDetService.getExtContDet(extContNum); + + String extSDFilePath; + String extASDFilePath; + + String oldExtSDFilePath = oldCont.getContSDFilePath(); + String oldExtASDFilePath = oldCont.getContASDFilePath(); + String extContStartDate = oldCont.getContStartDate(); + + if (extASDAmtRfd != null && !extASDAmtRfd.isEmpty()) { + newExtASDAmtRfd = Double.parseDouble(extASDAmtRfd); + } else { + newExtASDAmtRfd = 0.0; + } + + // Create directory and handle file upload if file is present + if (extASDFilePart != null && extASDFilePart.getSize() > 0) { + fileService.createDirectory("ASD-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBasePath)); + extASDFilePath = fileService.saveFile(extVendName, extContNum, extASDFilePart, "ASD-Ext", extBasePath, + extContStartDate); + } else { + extASDFilePath = "-"; + } + + if (extSDFilePart != null && extSDFilePart.getSize() > 0) { + fileService.createDirectory("SD-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBasePath)); + extSDFilePath = fileService.saveFile(extVendName, extContNum, extSDFilePart, "SD-Ext", extBasePath, + extContStartDate); + } else { + extSDFilePath = "-"; + } + try { + Double finalExtSDAmt = extContDetService.getExtContDet(extContNum).getSdAmt() - extSDAmtRfd; + Double finalExtASDAmt = extContDetService.getExtContDet(extContNum).getAsdAmt() - newExtASDAmtRfd; + flag = closureExtContDet.update(extContNum, finalExtSDAmt, finalExtASDAmt, extASDFilePath, extSDFilePath, + extUsrId); + } catch (ClassNotFoundException | SQLException e) { + // TODO Auto-generated catch block + try { + fileService.deleteFileIfExists(extSDFilePath); + if (extASDFilePart != null && extASDFilePart.getSize() > 0) { + fileService.deleteFileIfExists(extASDFilePath); + } + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (flag) { + if (oldExtSDFilePath != null && !oldExtSDFilePath.trim().equals("-")) { + fileService.deleteFileIfExists(oldExtSDFilePath); + } + if (oldExtASDFilePath != null && !oldExtASDFilePath.trim().equals("-")) { + fileService.deleteFileIfExists(oldExtASDFilePath); + } + return flag; + } else { + return flag; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/CustRepDetService.java b/src/main/java/com/cont_mgmt/service/CustRepDetService.java new file mode 100644 index 0000000..d4c170d --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/CustRepDetService.java @@ -0,0 +1,30 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +import com.cont_mgmt.repository.FetchContDetByDates; + +public class CustRepDetService { + + // Call the FetchContDetByDates to get contract details based on date + private FetchContDetByDates fetchContDetByDates = new FetchContDetByDates(); + + public List> getContDetByDates(String fromDate, String toDate) + throws ClassNotFoundException, SQLException, ParseException { + boolean flag = false; + + List> isCustRepListFetched = fetchContDetByDates.fetch(fromDate, toDate); + if (isCustRepListFetched != null && !isCustRepListFetched.isEmpty()) { + flag = true; + } + if (flag) { + return isCustRepListFetched; + } else { + return null; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistBillDetService.java b/src/main/java/com/cont_mgmt/service/ExistBillDetService.java new file mode 100644 index 0000000..4eb6566 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistBillDetService.java @@ -0,0 +1,33 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.repository.FetchExistBillDet; + +public class ExistBillDetService { + + // Call FetchExistBillDet to fetch bill data + private FetchExistBillDet fetchExistBillDet = new FetchExistBillDet(); + + public List getBillDet(String reqContNum) throws ClassNotFoundException, SQLException { + boolean flag = false; + String contNum = null; + + // Check if reqContNum is not empty or null + if (reqContNum != null && !reqContNum.trim().isEmpty()) { + contNum = reqContNum; + } + + List isBillDetListFetched = fetchExistBillDet.fetch(contNum); + if (isBillDetListFetched != null && !isBillDetListFetched.isEmpty()) { + flag = true; + } + if (flag) { + return isBillDetListFetched; + } else { + return null; + } + } +} diff --git a/src/main/java/com/cont_mgmt/service/ExistBillStatDetService.java b/src/main/java/com/cont_mgmt/service/ExistBillStatDetService.java new file mode 100644 index 0000000..04e1062 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistBillStatDetService.java @@ -0,0 +1,28 @@ +package com.cont_mgmt.service; + +import java.util.List; + +import com.cont_mgmt.dto.BillStat; +import com.cont_mgmt.repository.FetchBillStatDet; +import com.cont_mgmt.wrapper.BillStatDetListWrapper; + +public class ExistBillStatDetService { + + // Call FetchBillStatDet + private FetchBillStatDet fetchBillStatDet = new FetchBillStatDet(); + + public BillStatDetListWrapper getBillStatDet() { + BillStatDetListWrapper billStatDetListWrapper = null; + boolean flag = false; + List isBillStatDetListFetched = fetchBillStatDet.fetch(); + if (!isBillStatDetListFetched.isEmpty() && isBillStatDetListFetched != null) { + billStatDetListWrapper = new BillStatDetListWrapper(isBillStatDetListFetched); + flag = true; + } + if (flag) { + return billStatDetListWrapper; + } else { + return billStatDetListWrapper; + } + } +} diff --git a/src/main/java/com/cont_mgmt/service/ExistContDetService.java b/src/main/java/com/cont_mgmt/service/ExistContDetService.java new file mode 100644 index 0000000..dbc9697 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistContDetService.java @@ -0,0 +1,327 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.repository.FetchExistContDet; +import com.cont_mgmt.repository.FetchExistVendDet; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.util.TimeUtils; +import com.cont_mgmt.repository.FetchAllContDet; + +public class ExistContDetService { + + // Call the FetchExistVendDet + private FetchExistVendDet fetchExistVendDet = new FetchExistVendDet(); + + // Call the ExtContDetService + private ExtContDetService extContDetService = new ExtContDetService(); + + // Call the ExistExtContDetService + ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call FetchExistContDet to fetch contract data + private FetchExistContDet fetchExistContDet = new FetchExistContDet(); + + // Call the FetchAllContDet to fetch all contracts data + private FetchAllContDet fetchAllContDet = new FetchAllContDet(); + + // Call the TimeUtils + private TimeUtils timeUtils = new TimeUtils(); + + private int daysThreshold = 60; // Days before expiry to show "Expires Soon" + private SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + private Date currentDate = null; + + public List getContDet(String reqVendId, String reqContNum) throws ClassNotFoundException, SQLException { + + boolean flag = false; + int vendId = -1; + String contNum = null; + + // Check if reqVendId and reqContNum is not empty or null + if (reqVendId != null && !reqVendId.trim().isEmpty()) { + vendId = Integer.parseInt(reqVendId); + } + + if (reqContNum != null && !reqContNum.trim().isEmpty()) { + contNum = reqContNum; + } + + List isExistContListFetched = fetchExistContDet.fetch(vendId, contNum); + if (isExistContListFetched != null && !isExistContListFetched.isEmpty()) { + flag = true; + } + if (flag) { + return isExistContListFetched; + } else { + return null; + } + } + + public List getAllContDet() { + List isAllContListFetched = new ArrayList(); + try { + isAllContListFetched = fetchAllContDet.fetch(); + } catch (ClassNotFoundException | SQLException e) { + e.printStackTrace(); + } + return isAllContListFetched; + } + + public List getExpdContDetList() throws SQLException, ParseException, ClassNotFoundException { + // TODO Auto-generated method stub + List expdContList = null; + currentDate = sdf.parse(sdf.format(new Date())); + try { + List isExistContListFetched = fetchAllContDet.fetch(); + if (isExistContListFetched != null && !isExistContListFetched.isEmpty()) { + expdContList = new ArrayList(); + for (Contract contract : isExistContListFetched) { + Contract usedCont = contract; + String startDateStr = contract.getContStartDate(); + String endDateStr = contract.getContEndDate(); + if (contract.getIsExtended() == 1) { + Contract extContract = extContDetService.getExtContDet(contract.getContNum()); + if (extContract != null) { + endDateStr = extContract.getContEndDate(); + usedCont = extContract; + usedCont.setContStartDate(startDateStr); + usedCont.setVendId(contract.getVendId()); + usedCont.setWorkDesc(contract.getWorkDesc()); + usedCont.setIsExtended(contract.getIsExtended()); + } + } + Date endDate = sdf.parse(endDateStr); + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + // Convert milliseconds to days + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); + // Determine the contract status based on the difference + if (diffInDays < 0) { + expdContList.add(usedCont); + } + } + } + } catch (ClassNotFoundException | SQLException | ParseException e) { + e.printStackTrace(); + throw e; + } + return expdContList; + } + + public List getActContDetList() throws SQLException, ParseException, ClassNotFoundException { + // TODO Auto-generated method stub + List actContList = null; + currentDate = sdf.parse(sdf.format(new Date())); + try { + List isExistContListFetched = fetchAllContDet.fetch(); + if (isExistContListFetched != null && !isExistContListFetched.isEmpty()) { + actContList = new ArrayList(); + for (Contract contract : isExistContListFetched) { + Contract usedCont = contract; + String startDateStr = contract.getContStartDate(); + String endDateStr = contract.getContEndDate(); + if (contract.getIsExtended() == 1) { + Contract extContract = extContDetService.getExtContDet(contract.getContNum()); + if (extContract != null) { + endDateStr = extContract.getContEndDate(); + usedCont = extContract; + usedCont.setContStartDate(startDateStr); + usedCont.setVendId(contract.getVendId()); + usedCont.setWorkDesc(contract.getWorkDesc()); + usedCont.setIsExtended(contract.getIsExtended()); + } + } + Date endDate = sdf.parse(endDateStr); + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + // Convert milliseconds to days + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); + // Determine the contract status based on the difference + if (diffInDays > daysThreshold) { + actContList.add(usedCont); + } + } + } + } catch (ClassNotFoundException | SQLException | ParseException e) { + e.printStackTrace(); + throw e; + } + return actContList; + } + + public List getExpContDetList() throws SQLException, ParseException, ClassNotFoundException { + // TODO Auto-generated method stub + List expContList = null; + currentDate = sdf.parse(sdf.format(new Date())); + try { + List isExistContListFetched = fetchAllContDet.fetch(); + if (isExistContListFetched != null && !isExistContListFetched.isEmpty()) { + expContList = new ArrayList(); + for (Contract contract : isExistContListFetched) { + Contract usedCont = contract; + String startDateStr = contract.getContStartDate(); + String endDateStr = contract.getContEndDate(); + if (contract.getIsExtended() == 1) { + Contract extContract = extContDetService.getExtContDet(contract.getContNum()); + if (extContract != null) { + endDateStr = extContract.getContEndDate(); + usedCont = extContract; + usedCont.setContStartDate(startDateStr); + usedCont.setVendId(contract.getVendId()); + usedCont.setWorkDesc(contract.getWorkDesc()); + usedCont.setIsExtended(contract.getIsExtended()); + } + } + Date endDate = sdf.parse(endDateStr); + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + // Convert milliseconds to days + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); + // Determine the contract status based on the difference + if (diffInDays >= 0 && diffInDays <= daysThreshold) { + expContList.add(usedCont); + } + } + } + } catch (ClassNotFoundException | SQLException | ParseException e) { + e.printStackTrace(); + throw e; + } + return expContList; + } + + public String getExpContDet() throws ParseException { + StringBuilder alertMsg = new StringBuilder(); + List expContList = new ArrayList(); + List expdContList = new ArrayList(); + List actContList = new ArrayList(); + List isExistVendListFetched; + String vendName = null; + String vendKey = null; + String searchType = null; + Contract usedCont; + currentDate = sdf.parse(sdf.format(new Date())); + try { + List isExistContListFetched = fetchAllContDet.fetch(); + if (isExistContListFetched != null && !isExistContListFetched.isEmpty()) { + for (Contract contract : isExistContListFetched) { + usedCont = contract; + String endDateStr = contract.getContEndDate(); + String startDateStr = contract.getContStartDate(); + if (contract.getIsExtended() == 1) { + Contract extContract = extContDetService.getExtContDet(contract.getContNum()); + if (extContract != null) { + endDateStr = extContract.getContEndDate(); + usedCont = extContract; + usedCont.setContStartDate(startDateStr); + usedCont.setVendId(contract.getVendId()); + usedCont.setWorkDesc(contract.getWorkDesc()); + usedCont.setIsExtended(contract.getIsExtended()); + } + } + Date endDate = sdf.parse(endDateStr); + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); + + if (diffInDays >= 0 && diffInDays <= daysThreshold) { + expContList.add(usedCont); + } else if (diffInDays > daysThreshold) { + actContList.add(usedCont); + } else if (diffInDays < daysThreshold) { + expdContList.add(usedCont); + } + } + + // Build Expiring Contracts Message + if (expContList != null && !expContList.isEmpty()) { + if (expContList.size() == 1) { + isExistVendListFetched = fetchExistVendDet.fetch(expContList.get(0).getVendId(), vendName, + vendKey, searchType); + Contract expCont = expContList.get(0); + alertMsg.append("ITC Number: ").append(expCont.getContNum()).append(" for the contractor ") + .append(isExistVendListFetched.get(0).getVendName()).append(" is about to expire in ") + .append(timeUtils.getExpiryDays(sdf, currentDate, expCont.getContEndDate())) + .append(" days.\n"); + } else if (expContList.size() >= 2 && expContList.size() <= 5) { + alertMsg.append("The following ITC numbers are about to expire: "); + for (int i = 0; i < expContList.size(); i++) { + alertMsg.append(expContList.get(i).getContNum()); + if (i < expContList.size() - 1) { + alertMsg.append(", "); + } + } + alertMsg.append(".\n"); + } else { + alertMsg.append(expContList.size()).append(" contracts are about to expire.\n"); + } + } + + // Build Active Contracts Message + if (actContList != null && !actContList.isEmpty()) { + if (actContList.size() == 1) { + isExistVendListFetched = fetchExistVendDet.fetch(actContList.get(0).getVendId(), vendName, + vendKey, searchType); + Contract actCont = actContList.get(0); + alertMsg.append("ITC Number: ").append(actCont.getContNum()).append(" for the contractor ") + .append(isExistVendListFetched.get(0).getVendName()).append(" is active.\n"); + } else if (actContList.size() >= 2 && actContList.size() <= 5) { + alertMsg.append("The following ITC numbers are active: "); + for (int i = 0; i < actContList.size(); i++) { + alertMsg.append(actContList.get(i).getContNum()); + if (i < actContList.size() - 1) { + alertMsg.append(", "); + } + } + alertMsg.append(".\n"); + } else { + alertMsg.append(actContList.size()).append(" contracts are active.\n"); + } + } + + // Build Expired Contracts Message + if (expdContList != null && !expdContList.isEmpty()) { + if (expdContList.size() == 1) { + isExistVendListFetched = fetchExistVendDet.fetch(expdContList.get(0).getVendId(), vendName, + vendKey, searchType); + Contract expdCont = expdContList.get(0); + alertMsg.append("ITC Number: ").append(expdCont.getContNum()).append(" for the contractor ") + .append(isExistVendListFetched.get(0).getVendName()).append(" has already expired.\n"); + } else if (expdContList.size() >= 2 && expdContList.size() <= 5) { + alertMsg.append("The following ITC numbers have expired: "); + for (int i = 0; i < expdContList.size(); i++) { + alertMsg.append(expdContList.get(i).getContNum()); + if (i < expdContList.size() - 1) { + alertMsg.append(", "); + } + } + alertMsg.append(".\n"); + } else { + alertMsg.append(expdContList.size()).append(" contracts have expired.\n"); + } + } + } else { + alertMsg.append("No contracts found"); + } + } catch (ClassNotFoundException | SQLException | ParseException e) { + e.printStackTrace(); + alertMsg.append("Error: ").append(stringUtils.escapeJavaScript(e.getMessage())); + } + return alertMsg.toString().trim(); + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistExtBillDetService.java b/src/main/java/com/cont_mgmt/service/ExistExtBillDetService.java new file mode 100644 index 0000000..fe716a0 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistExtBillDetService.java @@ -0,0 +1,34 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.repository.FetchExistExtBillDet; + +public class ExistExtBillDetService { + + // Call FetchExistExtBillDet to fetch extension bill data + private FetchExistExtBillDet fetchExistExtBillDet = new FetchExistExtBillDet(); + + public List getExtBillDet(String reqContNum) throws ClassNotFoundException, SQLException { + boolean flag = false; + String contNum = null; + + // Check if reqContNum is not empty or null + if (reqContNum != null && !reqContNum.trim().isEmpty()) { + contNum = reqContNum; + } + + List isBillDetListFetched = fetchExistExtBillDet.fetch(contNum); + if (isBillDetListFetched != null && !isBillDetListFetched.isEmpty()) { + flag = true; + } + if (flag) { + return isBillDetListFetched; + } else { + return null; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistExtContDetService.java b/src/main/java/com/cont_mgmt/service/ExistExtContDetService.java new file mode 100644 index 0000000..61c754a --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistExtContDetService.java @@ -0,0 +1,41 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.FetchExistExtContDet; + +public class ExistExtContDetService { + + // Call FetchExistExtContDet to fetch contract data + private FetchExistExtContDet fetchExistExtContDet = new FetchExistExtContDet(); + + public List getExtContDet(String reqVendId, String reqContNum) + throws ClassNotFoundException, SQLException { + + boolean flag = false; + int vendId = -1; + String contNum = null; + + // Check if reqVendId and reqContNum is not empty or null + if (reqVendId != null && !reqVendId.trim().isEmpty()) { + vendId = Integer.parseInt(reqVendId); + } + + if (reqContNum != null && !reqContNum.trim().isEmpty()) { + contNum = reqContNum; + } + + List isExistContListFetched = fetchExistExtContDet.fetch(vendId, contNum); + if (isExistContListFetched != null && !isExistContListFetched.isEmpty()) { + flag = true; + } + if (flag) { + return isExistContListFetched; + } else { + return null; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistExtInvoiceBillDateService.java b/src/main/java/com/cont_mgmt/service/ExistExtInvoiceBillDateService.java new file mode 100644 index 0000000..beba0f0 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistExtInvoiceBillDateService.java @@ -0,0 +1,34 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; + +import com.cont_mgmt.repository.FetchExtInvoiceBillDateDet; + +public class ExistExtInvoiceBillDateService { + + // Call FetchExtInvoiceBillDateDet + private FetchExtInvoiceBillDateDet fetchExtInvoiceBillDateDet = new FetchExtInvoiceBillDateDet(); + + public String getExtInvoiceBillDate(String contNum, String invoiceBillingPeriod) { + boolean flag = false; + String res = ""; + try { + res = fetchExtInvoiceBillDateDet.fetch(contNum, invoiceBillingPeriod); + if (res != null && !res.trim().isEmpty()) { + flag = true; + } + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + if (flag) { + return res; + } else { + return res; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistInvoiceBillDateService.java b/src/main/java/com/cont_mgmt/service/ExistInvoiceBillDateService.java new file mode 100644 index 0000000..b68ce6c --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistInvoiceBillDateService.java @@ -0,0 +1,34 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; + +import com.cont_mgmt.repository.FetchInvoiceBillDateDet; + +public class ExistInvoiceBillDateService { + + // Call FetchInvoiceBillDateDet + private FetchInvoiceBillDateDet fetchInvoiceBillDateDet = new FetchInvoiceBillDateDet(); + + public String getInvoiceBillDate(String contNum, String invoiceBillingPeriod) { + boolean flag = false; + String res = ""; + try { + res = fetchInvoiceBillDateDet.fetch(contNum, invoiceBillingPeriod); + if (res != null && !res.trim().isEmpty()) { + flag = true; + } + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + if (flag) { + return res; + } else { + return res; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistInvoiceBillTypeDetService.java b/src/main/java/com/cont_mgmt/service/ExistInvoiceBillTypeDetService.java new file mode 100644 index 0000000..3584183 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistInvoiceBillTypeDetService.java @@ -0,0 +1,31 @@ +package com.cont_mgmt.service; + +import java.util.List; + +import com.cont_mgmt.dto.InvoiceBillType; +import com.cont_mgmt.repository.FetchInvoiceBillTypeDet; +import com.cont_mgmt.wrapper.InvoiceBillTypeDetListWrapper; + +public class ExistInvoiceBillTypeDetService { + + // Call FetchInvoiceBillTypeDet + private FetchInvoiceBillTypeDet fetchInvoiceBillTypeDet = new FetchInvoiceBillTypeDet(); + + public InvoiceBillTypeDetListWrapper getInvoiceBillTypeDet() { + InvoiceBillTypeDetListWrapper invoiceBillTypeDetListWrapper = null; + boolean flag = false; + List isInvoiceBillTypeDetListFetched = fetchInvoiceBillTypeDet.fetch(); + if (!isInvoiceBillTypeDetListFetched.isEmpty() && isInvoiceBillTypeDetListFetched != null) { + invoiceBillTypeDetListWrapper = new InvoiceBillTypeDetListWrapper(isInvoiceBillTypeDetListFetched); + flag = true; + } + + if (flag) { + return invoiceBillTypeDetListWrapper; + } else { + return invoiceBillTypeDetListWrapper; + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistProdCatDetService.java b/src/main/java/com/cont_mgmt/service/ExistProdCatDetService.java new file mode 100644 index 0000000..9f74c3a --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistProdCatDetService.java @@ -0,0 +1,32 @@ +package com.cont_mgmt.service; + +import java.util.List; + +import com.cont_mgmt.dto.ProdCat; +import com.cont_mgmt.repository.FetchProdCatDet; +import com.cont_mgmt.wrapper.ProdCatDetListWrapper; + +public class ExistProdCatDetService { + + // Call FetchInvoiceBillTypeDet + private FetchProdCatDet fetchProdCatDet = new FetchProdCatDet(); + + public ProdCatDetListWrapper getProdCatDet() { + ProdCatDetListWrapper prodCatDetListWrapper = null; + boolean flag = false; + + List isProdCatDetListFetched = fetchProdCatDet.fetch(); + if (!isProdCatDetListFetched.isEmpty() && isProdCatDetListFetched != null) { + prodCatDetListWrapper = new ProdCatDetListWrapper(isProdCatDetListFetched); + flag = true; + } + + if (flag) { + return prodCatDetListWrapper; + } else { + return prodCatDetListWrapper; + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExistVendDetService.java b/src/main/java/com/cont_mgmt/service/ExistVendDetService.java new file mode 100644 index 0000000..33cc1a2 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExistVendDetService.java @@ -0,0 +1,67 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.repository.FetchAllVendDet; +import com.cont_mgmt.repository.FetchExistVendDet; + +public class ExistVendDetService { + + // Call FetchExistVendDet to fetch vendor data + private FetchExistVendDet fetchExistVendDet = new FetchExistVendDet(); + + // Call FetchAllVendDet to fetch vendor data + private FetchAllVendDet fetchAllVendDet = new FetchAllVendDet(); + + public List getVendDet(String reqVendId, String reqVendName, String reqVendKey) + throws ClassNotFoundException, SQLException { + boolean flag = false; + int vendId = -1; + String vendName = null; + String vendKey = null; + String searchType = null; + + // Check if reqVendId and reqVendName and reqVendKey is not empty or + // null + if (reqVendId != null && !reqVendId.trim().isEmpty()) { + vendId = Integer.parseInt(reqVendId); + } + + if (reqVendName != null && !reqVendName.trim().isEmpty()) { + vendName = reqVendName; + vendName = vendName.replace("/", "-"); + } + + if (reqVendKey != null && !reqVendKey.trim().isEmpty()) { + vendKey = reqVendKey.toUpperCase(); + searchType = vendKey.matches(".*\\d.*") ? "cont_num" : "work_desc"; + } + + List isExistVendListFetched = fetchExistVendDet.fetch(vendId, vendName, vendKey, searchType); + System.out.println("Service: " + isExistVendListFetched); + if (isExistVendListFetched != null && !isExistVendListFetched.isEmpty()) { + flag = true; + } + if (flag) { + return isExistVendListFetched; + } else { + return null; + } + } + + public List getAllVendDet() throws ClassNotFoundException, SQLException { + boolean flag = false; + List isExistVendListFetched = fetchAllVendDet.fetch(); + if (isExistVendListFetched != null && !isExistVendListFetched.isEmpty()) { + flag = true; + } + if (flag) { + return isExistVendListFetched; + } else { + return null; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExtBillDetService.java b/src/main/java/com/cont_mgmt/service/ExtBillDetService.java new file mode 100644 index 0000000..1c6c652 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExtBillDetService.java @@ -0,0 +1,223 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.DeleteExtBillDet; +import com.cont_mgmt.repository.FetchAmtDueByExtContNum; +import com.cont_mgmt.repository.FetchExtBillDet; +import com.cont_mgmt.repository.FetchExtContDet; +import com.cont_mgmt.repository.FetchTotAmtDueByExtContNum; +import com.cont_mgmt.repository.InsertExtBillDet; + +import jakarta.servlet.http.Part; + +public class ExtBillDetService { + + // Call the FileService to create directory + private FileService fileService = new FileService(); + + // Call FetchTotAmtDueByExtContNum + private FetchTotAmtDueByExtContNum fetchTotAmtDueByExtContNum = new FetchTotAmtDueByExtContNum(); + + // Call DeleteExtBillDet to delete bill data + private DeleteExtBillDet deleteExtBillDet = new DeleteExtBillDet(); + + // Call FetchExtBillDet to fetch bill data + private FetchExtBillDet fetchExtBillDet = new FetchExtBillDet(); + + // Call FetchAmtDueByExtContNum + private FetchAmtDueByExtContNum fetchAmtDueByExtContNum = new FetchAmtDueByExtContNum(); + + // Call FetchContDet + private FetchExtContDet fetchExtContDet = new FetchExtContDet(); + + // Call InsertExtBillDet to insert data + private InsertExtBillDet insertExtBillDet = new InsertExtBillDet(); + + public void removeExtBillDetOnError(int extInvoiceId) { + deleteExtBillDet.delete(extInvoiceId); + } + + public Bill getExtBillDet(int extInvoiceId) throws ClassNotFoundException, SQLException { + boolean flag = false; + Bill isBillFetched = fetchExtBillDet.fetch(extInvoiceId); + if (isBillFetched != null) { + flag = true; + } + if (flag) { + return isBillFetched; + } else { + return null; + } + } + + public Double getAmtDueByExtContNum(String extContNum) throws ClassNotFoundException, SQLException { + boolean flag = false; + Double isAmtDueFetched = null; + isAmtDueFetched = fetchAmtDueByExtContNum.fetch(extContNum); + if (isAmtDueFetched != null && !isAmtDueFetched.isNaN() && isAmtDueFetched != 0.0) { + flag = true; + } + if (flag) { + return isAmtDueFetched; + } else { + isAmtDueFetched = 0.0; + return isAmtDueFetched; + } + } + + public Double getTotAmtDueByExtContNum(String extContNum) throws ClassNotFoundException, SQLException { + boolean flag = false; + Double totAmtPaid = 0.0; + Double contAmt = 0.0; + List isAmtFetched = fetchTotAmtDueByExtContNum.fetch(extContNum); + if (!isAmtFetched.isEmpty() && isAmtFetched != null) { + for (int i = 0; i < isAmtFetched.size(); i++) { + if (i == 0) { + if (isAmtFetched.get(i) != null && !isAmtFetched.get(i).isNaN() && isAmtFetched.get(i) != 0.0) { + contAmt = isAmtFetched.get(i); + } + } else { + if (isAmtFetched.get(i) != null && !isAmtFetched.get(i).isNaN() && isAmtFetched.get(i) != 0.0) { + totAmtPaid += isAmtFetched.get(i); + } + } + } + flag = true; + } else { + Contract isContractFetched = fetchExtContDet.fetch(extContNum); + if (isContractFetched != null) { + contAmt = isContractFetched.getContAmt(); + } + } + if (flag) { + return (contAmt - totAmtPaid); + } else { + return contAmt; + } + } + + public int addExtBillDet(String extContNum, String extInvoiceBillingPeriod, String extInvoiceStartDate, + String extInvoiceEndDate, double extInvoiceAmt, double extContAmt, String extCGSTAmt, String extSGSTAmt, + String extIGSTAmt, String extITTaxAmt, Part extBillFilePart, Part extInvoiceFilePart, String extVendName, + Integer extUsrId, String extBasePath, String extInvoiceBilledDate, Double extPercent, Double extSNARetAmt) + throws ClassNotFoundException, SQLException, IOException { + // TODO Auto-generated method stub + double extAmtExclTax = 0.0; + double extTotAmt = 0.0; + boolean flag = false; + double extAmtDue = 0.0; + Double extExistAmtDue = 0.0; + int extInvoiceId = 0; + + if (extInvoiceStartDate == null || extInvoiceStartDate.trim().isEmpty()) { + extInvoiceStartDate = "-"; + } + + if (extInvoiceEndDate == null || extInvoiceEndDate.trim().isEmpty()) { + extInvoiceEndDate = "-"; + } + + Double newExtCGSTAmt; + Double newExtIGSTAmt; + Double newExtSGSTAmt; + Double newExtITTaxAmt; + Double newExtPercent; + + if (extITTaxAmt != null && !extITTaxAmt.isEmpty()) { + newExtITTaxAmt = Double.parseDouble(extITTaxAmt); + } else { + newExtITTaxAmt = 0.0; + } + + if (extCGSTAmt != null && !extCGSTAmt.isEmpty()) { + newExtCGSTAmt = Double.parseDouble(extCGSTAmt); + } else { + newExtCGSTAmt = 0.0; + } + + if (extIGSTAmt != null && !extIGSTAmt.isEmpty()) { + newExtIGSTAmt = Double.parseDouble(extIGSTAmt); + } else { + newExtIGSTAmt = 0.0; + } + + if (extSGSTAmt != null && !extSGSTAmt.isEmpty()) { + newExtSGSTAmt = Double.parseDouble(extSGSTAmt); + } else { + newExtSGSTAmt = 0.0; + } + + String extInvoiceDate = extInvoiceStartDate.equalsIgnoreCase("-") ? extInvoiceBilledDate : extInvoiceStartDate; + extVendName = extVendName.replace("/", "-"); + + if (extPercent != null && !extPercent.isNaN() && extPercent != 0.0) { + newExtPercent = extPercent; + // Calculate the Amount Due, Amount excluding Tax + extAmtExclTax = Math + .round(extInvoiceAmt - (newExtITTaxAmt + newExtCGSTAmt + newExtSGSTAmt + newExtIGSTAmt)); + extAmtExclTax = Math.round(extAmtExclTax - extSNARetAmt); + extExistAmtDue = getAmtDueByExtContNum(extContNum); + if (extExistAmtDue != null && !extExistAmtDue.isNaN() && extExistAmtDue != 0.0) { + extAmtDue = Math.round(extExistAmtDue - extInvoiceAmt); + } else { + extAmtDue = Math.round(extContAmt - extInvoiceAmt); + } + } else { + newExtPercent = 0.0; + // Calculate the Amount Due, Amount excluding Tax + extAmtExclTax = Math + .round(extInvoiceAmt - (newExtITTaxAmt + newExtCGSTAmt + newExtSGSTAmt + newExtIGSTAmt)); + extAmtExclTax = Math.round(extAmtExclTax - extSNARetAmt); + extExistAmtDue = getAmtDueByExtContNum(extContNum); + if (extExistAmtDue != null && !extExistAmtDue.isNaN() && extExistAmtDue != 0.0) { + extAmtDue = Math.round(extExistAmtDue - extInvoiceAmt); + } else { + extAmtDue = Math.round(extContAmt - extInvoiceAmt); + } + } + + extTotAmt = extInvoiceAmt; + + fileService.createDirectory("Bill-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBasePath)); + String extBillFileName = "Bill-Ext-" + extInvoiceBillingPeriod; + fileService.createDirectory("Invoice-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBasePath)); + String extInvoiceFileName = "Invoice-Ext-" + extInvoiceBillingPeriod; + // Handle file upload + String extBillFilePath = fileService.saveFile(extVendName, extContNum, extBillFilePart, extBillFileName, + extBasePath, extInvoiceDate); + String extInvoiceFilePath = fileService.saveFile(extVendName, extContNum, extInvoiceFilePart, + extInvoiceFileName, extBasePath, extInvoiceDate); + + try { + extInvoiceId = insertExtBillDet.insert(extContNum, newExtITTaxAmt, extInvoiceBillingPeriod, + extInvoiceStartDate, extInvoiceEndDate, extInvoiceAmt, extContAmt, extAmtDue, extAmtExclTax, + newExtCGSTAmt, newExtSGSTAmt, newExtIGSTAmt, extTotAmt, extBillFilePath, extInvoiceFilePath, + extUsrId, extInvoiceBilledDate, newExtPercent, extSNARetAmt); + } catch (SQLException | ClassNotFoundException e) { + try { + fileService.deleteFileIfExists(extBillFilePath); + fileService.deleteFileIfExists(extInvoiceFilePath); + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (extInvoiceId >= 1) { + flag = true; + } + if (flag) { + return extInvoiceId; + } else { + extInvoiceId = -1; + return extInvoiceId; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ExtContDetService.java b/src/main/java/com/cont_mgmt/service/ExtContDetService.java new file mode 100644 index 0000000..aaa2e53 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ExtContDetService.java @@ -0,0 +1,94 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.DeleteExtContDet; +import com.cont_mgmt.repository.FetchExtContDet; +import com.cont_mgmt.repository.InsertExtContDet; + +import jakarta.servlet.http.Part; + +public class ExtContDetService { + + // Call the FileService to create directory if it is absent + private FileService fileService = new FileService(); + + // Call the InsertExtContDet + private InsertExtContDet insertExtContDet = new InsertExtContDet(); + + // Call FetchExtContDet to fetch extended contract data + private FetchExtContDet fetchExtContDet = new FetchExtContDet(); + + // Call the DeleteExtContDet + private DeleteExtContDet deleteExtContDet = new DeleteExtContDet(); + + public boolean addExtContDet(String extContStartDate, String extContEndDate, Double extContAmt, String existContNum, + Integer usrId, String basePath, Part extASFilePart, Part extWOFilePart, String existVendName, + Part extAgreeFilePart, Integer extInvoiceBillTypeId) + throws IOException, ClassNotFoundException, SQLException { + boolean flag = false; + boolean res; + + fileService.createDirectory(existContNum, fileService.getBaseDirectory(existVendName, basePath)); + // Create directories + fileService.createDirectory("Work-Order-Ext", + fileService.getContractorDirectory(existVendName, existContNum, basePath)); + fileService.createDirectory("AS-Ext", + fileService.getContractorDirectory(existVendName, existContNum, basePath)); + // Handle file upload + String extWOFilePath = fileService.saveFile(existVendName, existContNum, extWOFilePart, "Work-Order-Ext", + basePath, extContStartDate); + String extASFilePath = fileService.saveFile(existVendName, existContNum, extASFilePart, "AS-Ext", basePath, + extContStartDate); + + String extAgreeFilePath; + if (extAgreeFilePart != null && extAgreeFilePart.getSize() > 0) { + fileService.createDirectory("Agreement-Ext", + fileService.getContractorDirectory(existVendName, existContNum, basePath)); + extAgreeFilePath = fileService.saveFile(existVendName, existContNum, extAgreeFilePart, "Agreement-Ext", + basePath, extContStartDate); + } else { + extAgreeFilePath = "-"; + } + try { + res = insertExtContDet.insert(existContNum, extContStartDate, extContEndDate, extContAmt, extASFilePath, + extWOFilePath, usrId, extAgreeFilePath, extInvoiceBillTypeId); + } catch (SQLException | ClassNotFoundException e) { + try { + fileService.deleteFileIfExists(extWOFilePath); + fileService.deleteFileIfExists(extASFilePath); + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (res) { + flag = true; + } + if (flag) { + return flag; + } else { + return flag; + } + } + + public Contract getExtContDet(String existContNum) throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + boolean flag = false; + Contract isExtContFetched = fetchExtContDet.fetch(existContNum); + if (isExtContFetched != null) { + flag = true; + } + if (flag) { + return isExtContFetched; + } else { + return null; + } + } + + public void removeExtContDetOnError(String existContNum) { + deleteExtContDet.delete(existContNum); + } +} diff --git a/src/main/java/com/cont_mgmt/service/FileService.java b/src/main/java/com/cont_mgmt/service/FileService.java new file mode 100644 index 0000000..1a203d9 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/FileService.java @@ -0,0 +1,322 @@ +package com.cont_mgmt.service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLDecoder; + +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.http.Part; + +public class FileService { + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + public byte[] getFile(String filePath) throws FileNotFoundException, IOException { + + // Decode the URL-encoded file path + String decodedFilePath = URLDecoder.decode(filePath, "UTF-8"); + + File file = new File(decodedFilePath); + + if (!file.exists()) { + throw new FileNotFoundException("File not found at path: " + filePath); + } + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] fileContent = new byte[(int) file.length()]; + fis.read(fileContent); + return fileContent; + } catch (IOException ioe) { + ioe.printStackTrace(); + throw ioe; + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException ioe2) { + ioe2.printStackTrace(); + throw ioe2; // Handle closing exception + } + } + } + } + + // Method to create a directory for the vendor + public void createDirectory(String dirName, String baseDir) { + File baseDirectory = new File(baseDir); + + // Ensure the base directory exists, create it if it doesn't + if (!baseDirectory.exists()) { + if (baseDirectory.mkdirs()) { + System.out.println("Base directory created: " + baseDirectory.getAbsolutePath()); + } else { + System.err.println("Failed to create base directory: " + baseDirectory.getAbsolutePath()); + return; + } + } + + // Create the required directory inside the base directory + File subDir = new File(baseDirectory, dirName); + if (!subDir.exists()) { + if (subDir.mkdirs()) { + System.out.println("Directory created: " + subDir.getAbsolutePath()); + } else { + System.err.println("Failed to create directory: " + subDir.getAbsolutePath()); + } + } else { + System.out.println("Directory already exists: " + subDir.getAbsolutePath()); + } + } + + // Method to determine the contractor directory based on the OS + public String getContractorDirectory(String vendName, String contNum, String basePath) { + String os = System.getProperty("os.name").toLowerCase(); + + StringBuilder filePath = new StringBuilder(); + + if (os.contains("win")) { + // Windows path + filePath.append(basePath).append(File.separator).append("uploads").append(File.separator) + .append("contractors").append(File.separator).append(vendName).append(File.separator) + .append(contNum); + } else { + // Linux/Mac path + filePath.append(basePath).append(File.separator).append("uploads").append(File.separator) + .append("contractors").append(File.separator).append(vendName).append(File.separator) + .append(contNum); + } + + return filePath.toString(); + + } + + // Method to determine the base directory based on the OS (inside contractor + // directory) + public String getBaseDirectory(String vendName, String basePath) { + String os = System.getProperty("os.name").toLowerCase(); + + StringBuilder filePath = new StringBuilder(); + + if (os.contains("win")) { + // Windows path + filePath.append(basePath).append(File.separator).append("uploads").append(File.separator) + .append("contractors").append(File.separator).append(vendName); + } else { + // Linux/Mac path + filePath.append(basePath).append(File.separator).append("uploads").append(File.separator) + .append("contractors").append(File.separator).append(vendName); + } + + return filePath.toString(); + + } + + // Method to determine the base directory based on the OS + public String getBaseDirectory(String basePath) { + String os = System.getProperty("os.name").toLowerCase(); + + StringBuilder filePath = new StringBuilder(); + + if (os.contains("win")) { + // Windows path + filePath.append(basePath).append(File.separator).append("uploads").append(File.separator) + .append("contractors"); + } else { + // Linux/Mac path + filePath.append(basePath).append(File.separator).append("uploads").append(File.separator) + .append("contractors"); + } + + return filePath.toString(); + + } + + // Method to handle file upload and save the file (generic for LOI and WO) + public String saveFile(String vendName, String contNum, Part filePart, String fileType, String basePath, + String startDate) throws IOException { + + String strOpr1[]; + String strOpr2[]; + String strOpr3[]; + + if (filePart == null || filePart.getSize() == 0) { + return "-"; // Return "-" if no file is uploaded + } + + // Extract file name manually from the Content-Disposition header + String contentDisposition = filePart.getHeader("content-disposition"); + String fileName = stringUtils.extractFileName(contentDisposition); + + // Trim any leading/trailing whitespace from fileName + fileName = fileName != null ? fileName.trim() : ""; + + if (fileType.startsWith("Bill") || fileType.startsWith("Invoice") || fileType.startsWith("RTGS")) { + String fileCounter = ""; + + // Extract fileCounter and normalize fileType + if (fileType.startsWith("Bill-Ext-")) { + fileCounter = fileType.substring("Bill-Ext-".length()); // e.g., + // Q1-Q4 + fileType = "Bill-Ext"; + } else if (fileType.startsWith("Invoice-Ext-")) { + fileCounter = fileType.substring("Invoice-Ext-".length()); + fileType = "Invoice-Ext"; + } else if (fileType.startsWith("RTGS-Ext-")) { + fileCounter = fileType.substring("RTGS-Ext-".length()); + fileType = "RTGS-Ext"; + } else if (fileType.startsWith("Bill-")) { + fileCounter = fileType.substring("Bill-".length()); + fileType = "Bill"; + } else if (fileType.startsWith("Invoice-")) { + fileCounter = fileType.substring("Invoice-".length()); + fileType = "Invoice"; + } else if (fileType.startsWith("RTGS-")) { + fileCounter = fileType.substring("RTGS-".length()); + fileType = "RTGS"; + } else { + strOpr1 = fileType.split("-"); + fileCounter = strOpr1.length > 1 ? strOpr1[1] : ""; + fileType = strOpr1[0]; + } + + // Now update the fileName based on .pdf and startDate + if (fileName.endsWith(".pdf")) { + strOpr2 = fileName.split("\\.pdf"); + strOpr3 = startDate.split("-"); + + if (strOpr2.length == 1 && strOpr3.length == 3) { + fileName = strOpr2[0] + "-" + fileCounter + "-" + strOpr3[2] + ".pdf"; + } + } + } else { + if (fileName.endsWith(".pdf")) { + strOpr1 = fileName.split("\\.pdf"); + strOpr2 = startDate.split("-"); + + if (strOpr1.length == 1 && strOpr2.length == 3) { + fileName = strOpr1[0] + "-" + strOpr2[2] + ".pdf"; + } + } + } + System.out.println("Updated file name: " + fileName); // Debug + // Set path based on file type + String directoryPath = getDirectoryByFileType(vendName, contNum, fileType, basePath); + + String filePath = directoryPath + fileName; + + InputStream fileContent = null; + try { + File file = new File(filePath); + fileContent = filePart.getInputStream(); + file.getParentFile().mkdirs(); // Ensure directory exists + filePart.write(file.getAbsolutePath()); + } catch (IOException ioe) { + throw ioe; + } finally { + // Ensure input stream is closed properly + if (fileContent != null) { + try { + fileContent.close(); + } catch (IOException e) { + throw e; + } + } + } + + return filePath; // Return the file path to save in the database + } + + // Method to determine the file type directory based on the OS + public String getDirectoryByFileType(String vendName, String contNum, String fileType, String basePath) { + String os = System.getProperty("os.name").toLowerCase(); + StringBuilder filePath = new StringBuilder(); + + // Determine the path based on the OS + if (os.contains("win")) { + filePath.append(basePath).append("uploads").append(File.separator).append("contractors") + .append(File.separator).append(vendName).append(File.separator).append(contNum); + } else { + filePath.append(basePath).append("uploads").append(File.separator).append("contractors") + .append(File.separator).append(vendName).append(File.separator).append(contNum); + } + switch (fileType) { + case "LOA": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Work-Order": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Work-Order-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "AS": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "AS-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Bill": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Bill-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Agreement": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Agreement-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Invoice": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "Invoice-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "RTGS": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "RTGS-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "EMD": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "SD": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "SD-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "ASD": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + case "ASD-Ext": + filePath.append(File.separator).append(fileType).append(File.separator); + break; + } + + return filePath.toString(); + + } + + public void deleteFileIfExists(String filePath) throws IOException { + if (filePath != null && !filePath.equals("-")) { + File file = new File(filePath); + if (file.exists()) { + if (!file.delete()) { + throw new IOException("Failed to delete file"); + } + file.delete(); + } + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/LogDetService.class b/src/main/java/com/cont_mgmt/service/LogDetService.class new file mode 100644 index 0000000..07410ae Binary files /dev/null and b/src/main/java/com/cont_mgmt/service/LogDetService.class differ diff --git a/src/main/java/com/cont_mgmt/service/LogDetService.java b/src/main/java/com/cont_mgmt/service/LogDetService.java new file mode 100644 index 0000000..a68e108 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/LogDetService.java @@ -0,0 +1,14 @@ +package com.cont_mgmt.service; + +import com.cont_mgmt.repository.InsertLogDet; + +public class LogDetService { + + // Call the InsertLogDet to insert log details + private InsertLogDet insertLogDet = new InsertLogDet(); + + public void addLogDet(Integer usrId, String usrIPAddr, String usrOpr) { + insertLogDet.insert(usrId, usrIPAddr, usrOpr); + } + +} diff --git a/src/main/java/com/cont_mgmt/service/ModifyBillStatService.java b/src/main/java/com/cont_mgmt/service/ModifyBillStatService.java new file mode 100644 index 0000000..20a3222 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ModifyBillStatService.java @@ -0,0 +1,55 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.repository.ModifyBillStat; + +import jakarta.servlet.http.Part; + +public class ModifyBillStatService { + + // Call the FileService to create directory + private FileService fileService = new FileService(); + + // Call the ModifyBillStat to update the bill status + private ModifyBillStat modifyBillStat = new ModifyBillStat(); + + // Call the ExistInvoiceBillDateService to fetch invoice bill date based on + // contNum and invoice billing period + private ExistInvoiceBillDateService existInvoiceBillDateService = new ExistInvoiceBillDateService(); + + public boolean updateBillStat(String contNum, String invoiceBillPeriod, Part rgstFilePart, Integer usrId, + String vendName, String basePath) + throws ClassNotFoundException, SQLException, NullPointerException, IOException { + // TODO Auto-generated method stub + boolean flag = false; + String rtgsFilePath = null; + + try { + String invoiceDate = existInvoiceBillDateService.getInvoiceBillDate(contNum, invoiceBillPeriod); + + fileService.createDirectory("RTGS", fileService.getContractorDirectory(vendName, contNum, basePath)); + String rtgsFileName = "RTGS-" + invoiceBillPeriod; + + // Handle file upload + rtgsFilePath = fileService.saveFile(vendName, contNum, rgstFilePart, rtgsFileName, basePath, invoiceDate); + + flag = modifyBillStat.update(contNum, invoiceBillPeriod, rtgsFilePath, usrId); + } catch (IOException e) { + // TODO Auto-generated catch block + try { + fileService.deleteFileIfExists(rtgsFilePath); + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + + if (flag) { + return flag; + } else { + return flag; + } + } +} diff --git a/src/main/java/com/cont_mgmt/service/ModifyExtBillStatService.java b/src/main/java/com/cont_mgmt/service/ModifyExtBillStatService.java new file mode 100644 index 0000000..8aa70d3 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/ModifyExtBillStatService.java @@ -0,0 +1,60 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.repository.ModifyExtBillStat; + +import jakarta.servlet.http.Part; + +public class ModifyExtBillStatService { + + // Call the FileService to create directory + private FileService fileService = new FileService(); + + // Call the ModifyBillStat to update the bill status + private ModifyExtBillStat modifyExtBillStat = new ModifyExtBillStat(); + + // Call the ExistExtInvoiceBillDateService to fetch invoice bill date based on + // contNum and invoice billing period + private ExistExtInvoiceBillDateService existExtInvoiceBillDateService = new ExistExtInvoiceBillDateService(); + + public boolean updateBillStat(String extContNum, String extInvoiceBillPeriod, Part extRTGSFilePart, + Integer extUsrId, String extVendName, String extBsePath) + throws ClassNotFoundException, SQLException, NullPointerException, IOException { + // TODO Auto-generated method stub + boolean flag = false; + String extRTGSFilePath = null; + + try { + String extInvoiceDate = existExtInvoiceBillDateService.getExtInvoiceBillDate(extContNum, + extInvoiceBillPeriod); + + fileService.createDirectory("RTGS-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBsePath)); + String extRTGSFileName = "RTGS-Ext-" + extInvoiceBillPeriod; + + // Handle file upload + extRTGSFilePath = fileService.saveFile(extVendName, extContNum, extRTGSFilePart, extRTGSFileName, + extBsePath, extInvoiceDate); + + flag = modifyExtBillStat.update(extContNum, extInvoiceBillPeriod, extRTGSFilePath, extUsrId); + + } catch (IOException e) { + // TODO Auto-generated catch block + try { + fileService.deleteFileIfExists(extRTGSFilePath); + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + + if (flag) { + return flag; + } else { + return flag; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/NewBillDetService.java b/src/main/java/com/cont_mgmt/service/NewBillDetService.java new file mode 100644 index 0000000..76827ea --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/NewBillDetService.java @@ -0,0 +1,219 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.DeleteBillDet; +import com.cont_mgmt.repository.FetchAmtDueByContNum; +import com.cont_mgmt.repository.FetchBillDet; +import com.cont_mgmt.repository.FetchContDet; +import com.cont_mgmt.repository.FetchTotAmtDueByContNum; +import com.cont_mgmt.repository.InsertBillDet; + +import jakarta.servlet.http.Part; + +public class NewBillDetService { + + // Call FetchTotAmtDueByContNum + private FetchTotAmtDueByContNum fetchTotAmtDueByContNum = new FetchTotAmtDueByContNum(); + + // Call FetchContDet + private FetchContDet fetchContDet = new FetchContDet(); + + // Call FetchAmtDueByContNum + private FetchAmtDueByContNum fetchAmtDueByContNum = new FetchAmtDueByContNum(); + + // Call FetchBillDet to fetch bill data + private FetchBillDet fetchBillDet = new FetchBillDet(); + + // Call the FileService to create directory + private FileService fileService = new FileService(); + + // Call InsertBillDet to insert data + private InsertBillDet insertBillDet = new InsertBillDet(); + + // Call DeleteBillDet to delete bill data + private DeleteBillDet deleteBillDet = new DeleteBillDet(); + + public int addBillDet(String contNum, String invoiceBillingPeriod, String invoiceStartDate, String invoiceEndDate, + double invoiceAmt, double contAmt, String cgstAmt, String sgstAmt, String igstAmt, String itTaxAmt, + Part billFilePart, Part invoiceFilePart, String vendName, Integer usrId, String basePath, + String invoiceBilledDate, Double percent, Double snaRetAmt) + throws ClassNotFoundException, SQLException, IOException { + // TODO Auto-generated method stub + double amtExclTax = 0.0; + double totAmt = 0.0; + boolean flag = false; + double amtDue = 0.0; + Double existAmtDue = 0.0; + int invoiceId = 0; + + if (invoiceStartDate == null || invoiceStartDate.trim().isEmpty()) { + invoiceStartDate = "-"; + } + + if (invoiceEndDate == null || invoiceEndDate.trim().isEmpty()) { + invoiceEndDate = "-"; + } + + Double newCGSTAmt; + Double newIGSTAmt; + Double newSGSTAmt; + Double newITTaxAmt; + Double newPercent; + + if (itTaxAmt != null && !itTaxAmt.isEmpty()) { + newITTaxAmt = Double.parseDouble(itTaxAmt); + } else { + newITTaxAmt = 0.0; + } + + if (cgstAmt != null && !cgstAmt.isEmpty()) { + newCGSTAmt = Double.parseDouble(cgstAmt); + } else { + newCGSTAmt = 0.0; + } + + if (igstAmt != null && !igstAmt.isEmpty()) { + newIGSTAmt = Double.parseDouble(igstAmt); + } else { + newIGSTAmt = 0.0; + } + + if (sgstAmt != null && !sgstAmt.isEmpty()) { + newSGSTAmt = Double.parseDouble(sgstAmt); + } else { + newSGSTAmt = 0.0; + } + + String invoiceDate = invoiceStartDate.equalsIgnoreCase("-") ? invoiceBilledDate : invoiceStartDate; + vendName = vendName.replace("/", "-"); + + if (percent != null && !percent.isNaN() && percent != 0.0) { + newPercent = percent; + // Calculate the Amount Due, Amount excluding Tax + amtExclTax = Math.round(invoiceAmt - (newITTaxAmt + newCGSTAmt + newSGSTAmt + newIGSTAmt)); + amtExclTax = Math.round(amtExclTax - snaRetAmt); + existAmtDue = getAmtDueByContNum(contNum); + if (existAmtDue != null && !existAmtDue.isNaN() && existAmtDue != 0.0) { + amtDue = Math.round(existAmtDue - invoiceAmt); + } else { + amtDue = Math.round(contAmt - invoiceAmt); + } + } else { + newPercent = 0.0; + // Calculate the Amount Due, Amount excluding Tax + amtExclTax = Math.round(invoiceAmt - (newITTaxAmt + newCGSTAmt + newSGSTAmt + newIGSTAmt)); + amtExclTax = Math.round(amtExclTax - snaRetAmt); + existAmtDue = getAmtDueByContNum(contNum); + if (existAmtDue != null && !existAmtDue.isNaN() && existAmtDue != 0.0) { + amtDue = Math.round(existAmtDue - invoiceAmt); + } else { + amtDue = Math.round(contAmt - invoiceAmt); + } + } + + totAmt = invoiceAmt; + + fileService.createDirectory("Bill", fileService.getContractorDirectory(vendName, contNum, basePath)); + String billFileName = "Bill-" + invoiceBillingPeriod; + fileService.createDirectory("Invoice", fileService.getContractorDirectory(vendName, contNum, basePath)); + String invoiceFileName = "Invoice-" + invoiceBillingPeriod; + + // Handle file upload + String billFilePath = fileService.saveFile(vendName, contNum, billFilePart, billFileName, basePath, + invoiceDate); + String invoiceFilePath = fileService.saveFile(vendName, contNum, invoiceFilePart, invoiceFileName, basePath, + invoiceDate); + + try { + invoiceId = insertBillDet.insert(contNum, newITTaxAmt, invoiceBillingPeriod, invoiceStartDate, + invoiceEndDate, invoiceAmt, contAmt, amtDue, amtExclTax, newCGSTAmt, newSGSTAmt, newIGSTAmt, totAmt, + billFilePath, invoiceFilePath, usrId, invoiceBilledDate, newPercent, snaRetAmt); + } catch (SQLException | ClassNotFoundException e) { + try { + fileService.deleteFileIfExists(billFilePath); + fileService.deleteFileIfExists(invoiceFilePath); + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (invoiceId >= 1) { + flag = true; + } + if (flag) { + return invoiceId; + } else { + invoiceId = -1; + return invoiceId; + } + } + + public Bill getBillDet(int invoiceId) throws ClassNotFoundException, SQLException { + boolean flag = false; + Bill isBillFetched = fetchBillDet.fetch(invoiceId); + if (isBillFetched != null) { + flag = true; + } + if (flag) { + return isBillFetched; + } else { + return null; + } + } + + public void removeBillDetOnError(int invoiceId) { + deleteBillDet.delete(invoiceId); + } + + public Double getAmtDueByContNum(String contNum) throws ClassNotFoundException, SQLException { + boolean flag = false; + Double isAmtDueFetched = null; + isAmtDueFetched = fetchAmtDueByContNum.fetch(contNum); + if (isAmtDueFetched != null && !isAmtDueFetched.isNaN() && isAmtDueFetched != 0.0) { + flag = true; + } + if (flag) { + return isAmtDueFetched; + } else { + isAmtDueFetched = 0.0; + return isAmtDueFetched; + } + } + + public Double getTotAmtDueByContNum(String contNum) throws ClassNotFoundException, SQLException { + boolean flag = false; + Double totAmtPaid = 0.0; + Double contAmt = 0.0; + List isAmtFetched = fetchTotAmtDueByContNum.fetch(contNum); + if (!isAmtFetched.isEmpty() && isAmtFetched != null) { + for (int i = 0; i < isAmtFetched.size(); i++) { + if (i == 0) { + if (isAmtFetched.get(i) != null && !isAmtFetched.get(i).isNaN() && isAmtFetched.get(i) != 0.0) { + contAmt = isAmtFetched.get(i); + } + } else { + if (isAmtFetched.get(i) != null && !isAmtFetched.get(i).isNaN() && isAmtFetched.get(i) != 0.0) { + totAmtPaid += isAmtFetched.get(i); + } + } + } + flag = true; + } else { + Contract isContractFetched = fetchContDet.fetch(contNum); + if (isContractFetched != null) { + contAmt = isContractFetched.getContAmt(); + } + } + if (flag) { + return (contAmt - totAmtPaid); + } else { + return contAmt; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/NewContDetService.java b/src/main/java/com/cont_mgmt/service/NewContDetService.java new file mode 100644 index 0000000..eecc476 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/NewContDetService.java @@ -0,0 +1,126 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.DeleteContDet; +import com.cont_mgmt.repository.FetchContDet; +import com.cont_mgmt.repository.InsertContDet; + +import jakarta.servlet.http.Part; + +public class NewContDetService { + + // Call FetchContDet to fetch contract data + private FetchContDet fetchContDet = new FetchContDet(); + + // Call DeleteContDet to delete vendor data + private DeleteContDet deleteContDet = new DeleteContDet(); + + // Call the FileService to create directory if it is absent + private FileService fileService = new FileService(); + + // Call InsertContDet to insert data + private InsertContDet insertContDet = new InsertContDet(); + + public String addContDet(String contNum, String contStartDate, String contEndDate, Integer vendId, + Integer invoiceBillTypeId, String workDesc, String reqContAmt, Double emdAmt, Part loaFilePart, + Part asFilePart, Part woFilePart, Part agreeFilePart, String vendName, Integer usrId, String basePath, + String contRmrk) throws IOException, ClassNotFoundException, SQLException { + + vendName = vendName.replace("/", "-"); + + String res = ""; + boolean flag = false; + Double contAmt; + + if (reqContAmt != null && !reqContAmt.trim().isEmpty()) { + contAmt = Double.parseDouble(reqContAmt); + } else { + contAmt = 0.0; + } + + fileService.createDirectory(contNum, fileService.getBaseDirectory(vendName, basePath)); + // Create directories + fileService.createDirectory("AS", fileService.getContractorDirectory(vendName, contNum, basePath)); + + // Handle file upload + String asFilePath = fileService.saveFile(vendName, contNum, asFilePart, "AS", basePath, contStartDate); + + String loaFilePath; + String woFilePath; + String agreeFilePath; + + // Create directory and handle file upload if file is present + if (loaFilePart != null && loaFilePart.getSize() > 0) { + fileService.createDirectory("LOA", fileService.getContractorDirectory(vendName, contNum, basePath)); + loaFilePath = fileService.saveFile(vendName, contNum, loaFilePart, "LOA", basePath, contStartDate); + } else { + loaFilePath = "-"; + } + + if (agreeFilePart != null && agreeFilePart.getSize() > 0) { + fileService.createDirectory("Agreement", fileService.getContractorDirectory(vendName, contNum, basePath)); + agreeFilePath = fileService.saveFile(vendName, contNum, agreeFilePart, "Agreement", basePath, + contStartDate); + } else { + agreeFilePath = "-"; + } + + if (woFilePart != null && woFilePart.getSize() > 0) { + fileService.createDirectory("Work-Order", fileService.getContractorDirectory(vendName, contNum, basePath)); + woFilePath = fileService.saveFile(vendName, contNum, woFilePart, "Work-Order", basePath, contStartDate); + } else { + woFilePath = "-"; + } + + try { + res = insertContDet.insert(contNum, vendId, contStartDate, contEndDate, contAmt, emdAmt, loaFilePath, + invoiceBillTypeId, workDesc, asFilePath, agreeFilePath, woFilePath, usrId, contRmrk); + } catch (SQLException | ClassNotFoundException e) { + try { + fileService.deleteFileIfExists(asFilePath); + if (loaFilePart != null && loaFilePart.getSize() > 0) { + fileService.deleteFileIfExists(loaFilePath); + } + if (agreeFilePart != null && agreeFilePart.getSize() > 0) { + fileService.deleteFileIfExists(agreeFilePath); + } + if (woFilePart != null && woFilePart.getSize() > 0) { + fileService.deleteFileIfExists(woFilePath); + } + + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (res != null && !res.trim().equals("")) { + flag = true; + } + if (flag) { + return res; + } else { + return res; + } + } + + public Contract getContDet(String contNum) throws ClassNotFoundException, SQLException { + boolean flag = false; + Contract isContFetched = fetchContDet.fetch(contNum); + if (isContFetched != null) { + flag = true; + } + if (flag) { + return isContFetched; + } else { + return null; + } + } + + public void removeContDetOnError(String contNum) { + deleteContDet.delete(contNum); + } + +} diff --git a/src/main/java/com/cont_mgmt/service/NewVendDetService.java b/src/main/java/com/cont_mgmt/service/NewVendDetService.java new file mode 100644 index 0000000..afb298e --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/NewVendDetService.java @@ -0,0 +1,78 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; + +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.repository.DeleteVendDet; +import com.cont_mgmt.repository.FetchVendDet; +import com.cont_mgmt.repository.InsertVendDet; + +public class NewVendDetService { + + // Call the FileService to create directory if it is absent + private FileService fileService = new FileService(); + + // Call InsertVendDet to insert data + private InsertVendDet insertVendDet = new InsertVendDet(); + + // Call FetchVendDet to fetch vendor data + private FetchVendDet fetchVendDet = new FetchVendDet(); + + // Call DeleteVendDet to delete vendor data + private DeleteVendDet deleteVendDet = new DeleteVendDet(); + + public int addVendDet(String vendName, String vendAddr1, String vendAddr2, String vendCountry, String vendState, + String vendCity, String vendPincode, String gstNum, String panNum, Integer prodCatId, String telNum1, + String telNum2, String emailId, Integer usrId, String basePath) + throws ClassNotFoundException, SQLException { + boolean flag = false; + String vendFinalAddr = ""; + int vendId = 0; + + // Check if telNum2 is empty or null + if (telNum2 == null || telNum2.trim().isEmpty()) { + telNum2 += "-".trim(); + } + // Check if vendAddr2 is not empty or null + if (vendAddr2 != null && !vendAddr2.trim().isEmpty()) { + vendFinalAddr = vendAddr1 + ", " + vendAddr2 + ", " + vendCity + ", " + vendState + ", " + vendPincode + + ", " + vendCountry; + } else { + vendFinalAddr = vendAddr1 + ", " + vendCity + ", " + vendState + ", " + vendPincode + ", " + vendCountry; + } + + System.out.println(vendFinalAddr); + + vendId = insertVendDet.insert(vendName, vendFinalAddr, gstNum, panNum, prodCatId, telNum1, telNum2, emailId, + usrId); + if (vendId >= 1) { + fileService.createDirectory(vendName, fileService.getBaseDirectory(basePath)); + flag = true; + } + if (flag) { + return vendId; + } else { + vendId = -1; + return vendId; + } + + } + + public Vendor getVendDet(int vendId) throws ClassNotFoundException, SQLException { + boolean flag = false; + Vendor isVendFetched = fetchVendDet.fetch(vendId); + if (isVendFetched != null) { + flag = true; + } + if (flag) { + return isVendFetched; + } else { + return null; + } + } + + public void removeVendDetOnError(int vendId) { + deleteVendDet.delete(vendId); + } + +} diff --git a/src/main/java/com/cont_mgmt/service/StatsService.java b/src/main/java/com/cont_mgmt/service/StatsService.java new file mode 100644 index 0000000..0d1ccdb --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/StatsService.java @@ -0,0 +1,79 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.cont_mgmt.repository.FetchStats; +import com.cont_mgmt.util.TimeUtils; + +public class StatsService { + + // Call the ExistVendDetService + private ExistVendDetService existVendDetService = new ExistVendDetService(); + + // Call the TimeUtils + private TimeUtils timeUtils = new TimeUtils(); + + // Call the FetchStats + private FetchStats fetchStats = new FetchStats(); + + private int daysThreshold = 60; // Days before expiry to show "Expires Soon" + private SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + private Date currentDate = null; + + public Map getStats() { + + Integer activeCount = 0; + Integer expiredCount = 0; + Integer soonExpiresCount = 0; + Integer contractCount = 0; + Integer diffInDays; + Map statsObject = new HashMap(); + + try { + Integer totalContractors = existVendDetService.getAllVendDet() != null + ? existVendDetService.getAllVendDet().size() + : 0; + + List> contEndDateList = fetchStats.fetch(); + for (Map mapObject : contEndDateList) { + diffInDays = Integer.parseInt(timeUtils.getExpiryDays(sdf, currentDate, mapObject.get("contEndDate"))); + // Determine the status based on the difference + if (diffInDays < 0) { + expiredCount++; + } else if (diffInDays <= daysThreshold) { + soonExpiresCount++; + } else { + activeCount++; + } + contractCount++; + } + + statsObject.put("contractors", totalContractors); + statsObject.put("contracts", contractCount); + statsObject.put("active", activeCount); + statsObject.put("soon expires", soonExpiresCount); + statsObject.put("expired", expiredCount); + + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NumberFormatException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return statsObject; + } + +} diff --git a/src/main/java/com/cont_mgmt/service/UpdContDetService.java b/src/main/java/com/cont_mgmt/service/UpdContDetService.java new file mode 100644 index 0000000..8e96e51 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/UpdContDetService.java @@ -0,0 +1,146 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.UpdateContDet; + +import jakarta.servlet.http.Part; + +public class UpdContDetService { + + // Call UpdateContDet to update data + private UpdateContDet updateContDet = new UpdateContDet(); + + // Call the NewContDetService to get EMD Amount via getContDet + private NewContDetService newContDetService = new NewContDetService(); + + // Call the FileService to create directory if it is absent + private FileService fileService = new FileService(); + + public String updContDet(String contNum, String contStartDate, String contEndDate, Integer vendId, + Integer invoiceBillTypeId, String workDesc, Double contAmt, Double sdAmt, String asdAmt, String emdAmtRfd, + Part loaFilePart, Part asFilePart, Part woFilePart, Part agreeFilePart, Part emdFilePart, Integer usrId, + String basePath, String vendName) throws IOException, ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + String res = ""; + boolean flag = false; + + Double finalASDAmt = asdAmt != null && !asdAmt.trim().isEmpty() ? Double.parseDouble(asdAmt) : 0.0; + + Contract oldCont = newContDetService.getContDet(contNum); + String oldAgreeFilePath = oldCont.getContAgreeFilePath(); + String oldASFilePath = oldCont.getContASFilePath(); + String oldLOAFilePath = oldCont.getContLOAFilePath(); + String oldWOFilePath = oldCont.getContWOFilePath(); + String oldEMDFilePath = oldCont.getContEMDFilePath(); + + String woFilePath; + String agreeFilePath; + String loaFilePath; + String asFilePath; + String emdFilePath; + Double fetchedEMDAmt = oldCont.getEmdAmt(); + Double finalEMDAmt; + + // Create directory and handle file upload if file is present + if (woFilePart != null && woFilePart.getSize() > 0) { + fileService.createDirectory("Work-Order", fileService.getContractorDirectory(vendName, contNum, basePath)); + woFilePath = fileService.saveFile(vendName, contNum, woFilePart, "Work-Order", basePath, contStartDate); + } else { + woFilePath = oldWOFilePath; + } + + if (agreeFilePart != null && agreeFilePart.getSize() > 0) { + fileService.createDirectory("Agreement", fileService.getContractorDirectory(vendName, contNum, basePath)); + agreeFilePath = fileService.saveFile(vendName, contNum, agreeFilePart, "Agreement", basePath, + contStartDate); + } else { + agreeFilePath = oldAgreeFilePath; + } + + if (loaFilePart != null && loaFilePart.getSize() > 0) { + fileService.createDirectory("LOA", fileService.getContractorDirectory(vendName, contNum, basePath)); + loaFilePath = fileService.saveFile(vendName, contNum, loaFilePart, "LOA", basePath, contStartDate); + } else { + loaFilePath = oldLOAFilePath; + } + + if (asFilePart != null && asFilePart.getSize() > 0) { + fileService.createDirectory("AS", fileService.getContractorDirectory(vendName, contNum, basePath)); + asFilePath = fileService.saveFile(vendName, contNum, asFilePart, "AS", basePath, contStartDate); + } else { + asFilePath = oldASFilePath; + } + + if (emdFilePart != null && emdFilePart.getSize() > 0) { + fileService.createDirectory("EMD", fileService.getContractorDirectory(vendName, contNum, basePath)); + emdFilePath = fileService.saveFile(vendName, contNum, emdFilePart, "EMD", basePath, contStartDate); + + finalEMDAmt = Math.abs(Double.parseDouble(emdAmtRfd) - fetchedEMDAmt); + } else { + emdFilePath = oldEMDFilePath; + finalEMDAmt = fetchedEMDAmt; + } + + try { + res = updateContDet.update(contNum, contStartDate, contEndDate, vendId, contAmt, sdAmt, finalASDAmt, + finalEMDAmt, loaFilePath, asFilePath, woFilePath, agreeFilePath, emdFilePath, invoiceBillTypeId, + workDesc, usrId); + } catch (SQLException | ClassNotFoundException e) { + try { + if (loaFilePart != null && loaFilePart.getSize() > 0) { + fileService.deleteFileIfExists(loaFilePath); + } + if (asFilePart != null && asFilePart.getSize() > 0) { + fileService.deleteFileIfExists(asFilePath); + } + if (emdFilePart != null && emdFilePart.getSize() > 0) { + fileService.deleteFileIfExists(emdFilePath); + } + if (woFilePart != null && woFilePart.getSize() > 0) { + fileService.deleteFileIfExists(woFilePath); + } + if (agreeFilePart != null && agreeFilePart.getSize() > 0) { + fileService.deleteFileIfExists(agreeFilePath); + } + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (res != null && !res.trim().equals("")) { + if (agreeFilePart != null && agreeFilePart.getSize() > 0 && oldAgreeFilePath != null + && !oldAgreeFilePath.trim().equals("-") && !oldAgreeFilePath.trim().equals(agreeFilePath)) { + fileService.deleteFileIfExists(oldAgreeFilePath); + } + + if (woFilePart != null && woFilePart.getSize() > 0 && oldWOFilePath != null + && !oldWOFilePath.trim().equals("-") && !oldWOFilePath.trim().equals(woFilePath)) { + fileService.deleteFileIfExists(oldWOFilePath); + } + + if (loaFilePart != null && loaFilePart.getSize() > 0 && oldLOAFilePath != null + && !oldLOAFilePath.trim().equals("-") && !oldLOAFilePath.trim().equals(loaFilePath)) { + fileService.deleteFileIfExists(oldLOAFilePath); + } + + if (asFilePart != null && asFilePart.getSize() > 0 && oldASFilePath != null + && !oldASFilePath.trim().equals("-") && !oldASFilePath.trim().equals(asFilePath)) { + fileService.deleteFileIfExists(oldASFilePath); + } + + if (emdFilePart != null && emdFilePart.getSize() > 0 && oldEMDFilePath != null + && !oldEMDFilePath.trim().equals("-") && !oldEMDFilePath.trim().equals(emdFilePath)) { + fileService.deleteFileIfExists(oldEMDFilePath); + } + flag = true; + } + if (flag) { + return res; + } else { + return res; + } + } +} diff --git a/src/main/java/com/cont_mgmt/service/UpdContRmrkService.java b/src/main/java/com/cont_mgmt/service/UpdContRmrkService.java new file mode 100644 index 0000000..ec41432 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/UpdContRmrkService.java @@ -0,0 +1,31 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; + +import com.cont_mgmt.repository.UpdateContRmrk; + +public class UpdContRmrkService { + + // Call UpdateContRmrk to update remarks + private UpdateContRmrk updateContRmrk = new UpdateContRmrk(); + + public boolean updContRmrk(String contRmrk, String contNum, Integer usrId) + throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + String res = ""; + boolean flag = false; + + try { + res = updateContRmrk.update(contNum, contRmrk, usrId); + } catch (SQLException | ClassNotFoundException e) { + throw e; + } + if (res != null && !res.trim().equals("")) { + flag = true; + return flag; + } else { + return flag; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/UpdExtContDetService.java b/src/main/java/com/cont_mgmt/service/UpdExtContDetService.java new file mode 100644 index 0000000..b9c59b9 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/UpdExtContDetService.java @@ -0,0 +1,106 @@ +package com.cont_mgmt.service; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.repository.UpdateExtContDet; + +import jakarta.servlet.http.Part; + +public class UpdExtContDetService { + + // Call the ExtContDetService + private ExtContDetService extContDetService = new ExtContDetService(); + + // Call the FileService to create directory if it is absent + private FileService fileService = new FileService(); + + // Call UpdateExtContDet to update data + private UpdateExtContDet updateExtContDet = new UpdateExtContDet(); + + public String updContDet(String extContNum, String extContStartDate, String extContEndDate, Integer extVendId, + Integer extInvoiceBillTypeId, Double extContAmt, Part extASFilePart, Part extWOFilePart, + Part extAgreeFilePart, Integer extUsrId, String extBasePath, String extVendName, String extASDAmt, + Double extSDAmt) throws IOException, ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + String res = ""; + boolean flag = false; + + Double extFinalASDAmt = extASDAmt != null && !extASDAmt.trim().isEmpty() ? Double.parseDouble(extASDAmt) : 0.0; + + Contract oldCont = extContDetService.getExtContDet(extContNum); + String oldExtASFilePath = oldCont.getContASFilePath(); + String oldExtWOFilePath = oldCont.getContWOFilePath(); + String oldExtAgreeFilePath = oldCont.getContAgreeFilePath(); + + fileService.createDirectory("Agreement-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBasePath)); + String extAgreeFilePath = fileService.saveFile(extVendName, extContNum, extAgreeFilePart, "Agreement-Ext", + extBasePath, extContStartDate); + + String extASFilePath; + String extWOFilePath; + + // Create directory and handle file upload if file is present + if (extASFilePart != null && extASFilePart.getSize() > 0) { + fileService.createDirectory("AS-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBasePath)); + extASFilePath = fileService.saveFile(extVendName, extContNum, extASFilePart, "AS-Ext", extBasePath, + extContStartDate); + } else { + extASFilePath = oldExtASFilePath; + } + + if (extWOFilePart != null && extWOFilePart.getSize() > 0) { + fileService.createDirectory("Work-Order-Ext", + fileService.getContractorDirectory(extVendName, extContNum, extBasePath)); + extWOFilePath = fileService.saveFile(extVendName, extContNum, extWOFilePart, "Work-Order-Ext", extBasePath, + extContStartDate); + } else { + extWOFilePath = oldExtWOFilePath; + } + + try { + res = updateExtContDet.update(extContNum, extContStartDate, extContEndDate, extVendId, extContAmt, + extASFilePath, extWOFilePath, extAgreeFilePath, extInvoiceBillTypeId, extUsrId, extSDAmt, + extFinalASDAmt); + } catch (SQLException | ClassNotFoundException e) { + try { + fileService.deleteFileIfExists(extAgreeFilePath); + if (extASFilePart != null && extASFilePart.getSize() > 0) { + fileService.deleteFileIfExists(extASFilePath); + } + if (extWOFilePart != null && extWOFilePart.getSize() > 0) { + fileService.deleteFileIfExists(extWOFilePath); + } + } catch (IOException ioe) { + throw ioe; + } + throw e; + } + if (res != null && !res.trim().equals("")) { + if (extASFilePart != null && extASFilePart.getSize() > 0 && oldExtASFilePath != null + && !oldExtASFilePath.trim().equals("-") && !oldExtASFilePath.trim().equals(extASFilePath)) { + fileService.deleteFileIfExists(oldExtASFilePath); + } + + if (extWOFilePart != null && extWOFilePart.getSize() > 0 && oldExtWOFilePath != null + && !oldExtWOFilePath.trim().equals("-") && !oldExtWOFilePath.trim().equals(extWOFilePath)) { + fileService.deleteFileIfExists(oldExtWOFilePath); + } + + if (extAgreeFilePart != null && extAgreeFilePart.getSize() > 0 && oldExtAgreeFilePath != null + && !oldExtAgreeFilePath.trim().equals("-") + && !oldExtAgreeFilePath.trim().equals(extAgreeFilePath)) { + fileService.deleteFileIfExists(oldExtAgreeFilePath); + } + flag = true; + } + if (flag) { + return res; + } else { + return res; + } + } +} diff --git a/src/main/java/com/cont_mgmt/service/UserLoginDetService.java b/src/main/java/com/cont_mgmt/service/UserLoginDetService.java new file mode 100644 index 0000000..d83a2b7 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/UserLoginDetService.java @@ -0,0 +1,36 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; + +import com.cont_mgmt.dto.User; +import com.cont_mgmt.repository.FetchUserLoginDet; + +public class UserLoginDetService { + + // Call FetchUserLoginDet to fetch user data + private FetchUserLoginDet fetchUserLoginDet = new FetchUserLoginDet(); + + public boolean findUserLoginDet(String usrName, String usrPass) throws SQLException, ClassNotFoundException { + boolean flag = false; + User isUserFetched = fetchUserLoginDet.fetch(usrName, usrPass); + if (isUserFetched != null) { + flag = true; + } + return flag; + + } + + public User getUserLoginDet(String usrName, String usrPass) throws ClassNotFoundException, SQLException { + boolean flag = false; + User isUserFetched = fetchUserLoginDet.fetch(usrName, usrPass); + if (isUserFetched != null) { + flag = true; + } + if (flag) { + return isUserFetched; + } else { + return null; + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/WhatsAppMessageSenderService.java b/src/main/java/com/cont_mgmt/service/WhatsAppMessageSenderService.java new file mode 100644 index 0000000..9ef8bc8 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/WhatsAppMessageSenderService.java @@ -0,0 +1,85 @@ +package com.cont_mgmt.service; + +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +public class WhatsAppMessageSenderService { + + // Call the ExistContDetService + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Toggle for alternate day message sending (active/expired) in case both exist + private static boolean sendStatusToday = true; + + public String generateMessage() { + try { + String messageFromService = existContDetService.getExpContDet(); + String lowerMsg = messageFromService.toLowerCase(); + + // Flags to detect which type are present + boolean hasExp = lowerMsg.contains("about to expire"); + boolean hasExpd = lowerMsg.contains("expired"); + boolean hasAct = lowerMsg.contains("active"); + + StringBuilder finalMsg = new StringBuilder("Notification from Contract Management System\n"); + + if (lowerMsg.contains("no contracts")) { + return finalMsg.append(messageFromService).toString(); // If no contracts found + } else if (hasExp && !hasExpd && !hasAct) { + finalMsg.append(messageFromService).append("\n"); // Only Expiring + finalMsg.append("View expiring contract details: ").append(networkUtils.shortenURL( + "http://117.232.67.132:8090/ContractManagementSystem/ExpContDetMsgServlet", "exp_cont_det")); + return finalMsg.toString(); + } else if (hasExpd && !hasExp && !hasAct) { + finalMsg.append(messageFromService).append("\n"); // Only Expired + finalMsg.append("View expired contract details: ").append(networkUtils.shortenURL( + "http://117.232.67.132:8090/ContractManagementSystem/ExpdContDetMsgServlet", "expd_cont_det")); + return finalMsg.toString(); + } else if (hasAct && !hasExp && !hasExpd) { + finalMsg.append(messageFromService).append("\n"); // Only Active + finalMsg.append("View active contract details: ").append(networkUtils.shortenURL( + "http://117.232.67.132:8090/ContractManagementSystem/ActContDetMsgServlet", "act_cont_det")); + return finalMsg.toString(); + } else if (hasExp && (hasAct || hasExpd)) { // Expiring + Active/Expired -> send only expiring + String expMsg = stringUtils.extractBlock(messageFromService, "about to expire"); + finalMsg.append(expMsg).append("\n"); + finalMsg.append("View expiring contract details: ").append(networkUtils.shortenURL( + "http://117.232.67.132:8090/ContractManagementSystem/ExpContDetMsgServlet", "exp_cont_det")); + return finalMsg.toString(); + } else if (hasAct && hasExpd) { // Active + Expired -> Send in alternate days + String actMsg = stringUtils.extractBlock(messageFromService, "active"); + String expdMsg = stringUtils.extractBlock(messageFromService, "expired"); + + if (sendStatusToday) { + sendStatusToday = false; // Toggle msg for next day to expired + finalMsg.append(actMsg).append("\n"); + finalMsg.append("View active contract details: ") + .append(networkUtils.shortenURL( + "http://117.232.67.132:8090/ContractManagementSystem/ActContDetMsgServlet", + "act_cont_det")); + } else { + sendStatusToday = true; // Toggle msg for next day to active + finalMsg.append(expdMsg).append("\n"); + finalMsg.append("View expired contract details: ") + .append(networkUtils.shortenURL( + "http://117.232.67.132:8090/ContractManagementSystem/ExpdContDetMsgServlet", + "expd_cont_det")); + } + return finalMsg.toString(); + } else { + // Fallback message if all conditions failed + return "Notification from Contract Management System\nNo message could be generated."; + } + } catch (Exception e) { + e.printStackTrace(); + return "Notification from Contract Management System\nError retrieving contract data: " + e.getMessage(); + } + } + +} diff --git a/src/main/java/com/cont_mgmt/service/WorkTypeSearchService.java b/src/main/java/com/cont_mgmt/service/WorkTypeSearchService.java new file mode 100644 index 0000000..d2c52e0 --- /dev/null +++ b/src/main/java/com/cont_mgmt/service/WorkTypeSearchService.java @@ -0,0 +1,33 @@ +package com.cont_mgmt.service; + +import java.sql.SQLException; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.cont_mgmt.repository.FetchWorkTypeSuggestions; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + +public class WorkTypeSearchService { + + // Guava Cache with TTL of 10 minutes and max size of 1000 entries (LRU + // eviction) Evict least recently used when over limit + private static final Cache> cache = CacheBuilder.newBuilder().maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) // TTL: expire entries 10 min after write + .build(); + + // Call the FetchWorkType + private FetchWorkTypeSuggestions fetchWorkTypeSuggestions = new FetchWorkTypeSuggestions(); + + public List searchWorkType(String query, String searchType) throws ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + // Check cache + String cacheKey = searchType + "|" + query; + List res = cache.getIfPresent(cacheKey); + if (res == null) { + res = fetchWorkTypeSuggestions.fetch(query, searchType); + cache.put(cacheKey, res); + } + return res; + } +} diff --git a/src/main/java/com/cont_mgmt/servlet/ActContDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ActContDetMsgServlet.java new file mode 100644 index 0000000..404e63e --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ActContDetMsgServlet.java @@ -0,0 +1,213 @@ +package com.cont_mgmt.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.repository.FetchExistVendDet; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewBillDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +/** + * Servlet implementation class ActContDetMsgServlet + */ +@WebServlet("/ActContDetMsgServlet") +public class ActContDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the ExistContDetService to fetch active contracts + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the NewBillDetService to fetch due amount + private NewBillDetService newBillDetService = new NewBillDetService(); + + // Call FetchExistVendDet to fetch vendor data + private FetchExistVendDet fetchExistVendDet = new FetchExistVendDet(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + JSONArray contractsJsonArray = null; + + String vendKey = null; // Dummy data + String searchType = null; // Dummy data + + double amtDue; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + Integer usrId = -1; + + String vendName = null; // Dummy data + + try { + List contracts = existContDetService.getActContDetList(); + if (contracts != null && !contracts.isEmpty()) { + handleExpContSuccess(contracts, vendName, usrId, usrIPAddr, request, response); + } else if (contracts == null || contracts.isEmpty()) { + String errorMessage = null; + String messageProducer = existContDetService.getExpContDet(); + String lowerMsg = messageProducer.toLowerCase(); + + // Flags to detect which type are present + boolean hasExp = lowerMsg.contains("about to expire"); + boolean hasExpd = lowerMsg.contains("expired"); + boolean hasAct = lowerMsg.contains("active"); + + if (lowerMsg.contains("no contracts")) { + errorMessage = messageProducer; // If no contracts found + } else if (hasExp && !hasExpd && !hasAct) { + errorMessage = messageProducer; // Only Expiring + } else if (hasExpd && !hasExp && !hasAct) { + errorMessage = messageProducer; // Only Expired + } else if (hasExp && (hasAct || hasExpd)) { + // Expiring + Active/Expired -> send only expiring + errorMessage = stringUtils.extractBlock(messageProducer, "about to expire"); + } else if (hasAct && hasExpd && !hasExp) { // Active + Expired -> Send expired alone as active contracts + // are available + String expdMsg = stringUtils.extractBlock(messageProducer, "expired"); + errorMessage = expdMsg; + } else { + errorMessage = "No message could be generated"; // Fallback message if all conditions failed + } + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + } catch (SQLException | ClassNotFoundException | ParseException | JSONException e) { + e.printStackTrace(); + handleException(e, usrId, usrIPAddr, request, response); + } + } + + private void handleException(Exception e, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + String errorMessage = "An error occurred: " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, + "AN ERROR OCCURRED IN ACTIVE CONTRACT VIA MESSAGE NOTIFICATION: " + e.getMessage().toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + try { + contractsJsonArray = new JSONArray(); + + JSONObject contractJson = new JSONObject(); + contractJson.put("errorMessage", errorMessage); + contractsJsonArray.put(contractJson); + + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "fail"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("activeContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, + (errorMessage + " VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT").toUpperCase()); + + request.getRequestDispatcher("act_cont_det_display_msg.jsp").forward(request, response); + } catch (JSONException e) { + // Create a fallback JSON object + JSONArray fallbackJsonArray = new JSONArray(); + JSONObject fallbackJsonError = new JSONObject(); + + try { + fallbackJsonError.put("errorMessage", + "An error occurred while processing the error: " + e.getMessage()); + fallbackJsonError.put("status", "fail"); + fallbackJsonArray.put(fallbackJsonError); + + // Send as response or store in session if JSP forward is + // required + request.getSession().setAttribute("activeContractsJson", fallbackJsonArray); + logDetService.addLogDet(usrId, usrIPAddr, "AN ERROR OCCURRED WHILE PROCESSING THE ERROR VIA" + + " MESSAGE NOTIFICATION: " + e.getMessage().toUpperCase() + " IN ACTIVE CONTRACT"); + request.getRequestDispatcher("act_cont_det_display_msg.jsp").forward(request, response); + + } catch (JSONException jsonException) { + // In case of another error, log it and send a plain error + // response + jsonException.printStackTrace(); + response.setContentType("application/json"); + logDetService.addLogDet(usrId, usrIPAddr, + "CRITICAL ERROR OCCURRED VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT"); + response.getWriter().write("{\"errorMessage\":\"Critical error occurred.\", \"status\":\"fail\"}"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + } + + private void handleExpContSuccess(List contracts, String vendName, Integer usrId, String usrIPAddr, + HttpServletRequest request, HttpServletResponse response) + throws JSONException, ClassNotFoundException, SQLException, ServletException, IOException { + // TODO Auto-generated method stub + contractsJsonArray = new JSONArray(); + + for (Contract contract : contracts) { + List isExistVendListFetched = fetchExistVendDet.fetch(contract.getVendId(), vendName, vendKey, + searchType); + amtDue = newBillDetService.getTotAmtDueByContNum(contract.getContNum()); + JSONObject contractJson = new JSONObject(); + contractJson.put("contNum", contract.getContNum()); + contractJson.put("vendName", isExistVendListFetched.get(0).getVendName()); + contractJson.put("vendId", isExistVendListFetched.get(0).getVendId()); + contractJson.put("contStartDate", contract.getContStartDate()); + contractJson.put("contEndDate", contract.getContEndDate()); + contractJson.put("contAmt", contract.getContAmt()); + contractJson.put("amtDue", amtDue); + contractJson.put("workDesc", contract.getWorkDesc()); + contractJson.put("isExt", contract.getIsExtended()); + contractsJsonArray.put(contractJson); + } + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "success"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("activeContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, "ENTERED ACTIVE CONTRACT PAGE VIA MESSAGE NOTIFICATION"); + + request.getRequestDispatcher("act_cont_det_display_msg.jsp").forward(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/CloseContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/CloseContDetServlet.java new file mode 100644 index 0000000..51dce41 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/CloseContDetServlet.java @@ -0,0 +1,110 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.cont_mgmt.service.CloseContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.util.TimeUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class CloseContDetServlet + */ +@WebServlet("/CloseContDetServlet") +@MultipartConfig +public class CloseContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the CloseContDetService + private CloseContDetService closeContDetService = new CloseContDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the TimeUtils + private TimeUtils timeUtils = new TimeUtils(); + + private SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + private Date currentDate = null; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String contNum = stringUtils.safeParam(request, "hid_cont_num"); + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String basePath = request.getServletContext().getRealPath("/").trim(); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + Double sdAmtRfd = Double.parseDouble(request.getParameter("sd_amt_rfd")); + String asdAmtRfd = stringUtils.safeParam(request, "asd_amt_rfd"); + Part sdFilePart = request.getPart("cont_sd_file"); + Part asdFilePart = request.getPart("cont_asd_file"); + Double amtDue = Double.parseDouble(request.getParameter("hid_amt_due")); + String contEndDate = stringUtils.safeParam(request, "hid_cont_end_date"); + String alertMessage = ""; + boolean flag = false; + + try { + Integer diffInDays = Integer.parseInt(timeUtils.getExpiryDays(sdf, currentDate, contEndDate)); + if (diffInDays >= 0 && Math.round(amtDue) > 0) { + logDetService.addLogDet(usrId, usrIPAddr, "CONTRACT NOT CLOSED FOR ITC NO." + contNum); + response.getWriter().write(stringUtils + .buildFailureResponse("Neither contract is expired nor work order amount is completed")); + return; // Important: stop further execution + } + + flag = closeContDetService.closeContDet(contNum, sdAmtRfd, asdAmtRfd, contEndDate, amtDue, vendName, + sdFilePart, asdFilePart, basePath, usrId); + if (flag) { + alertMessage = "Contract Closed for ITC No " + contNum + " successfully."; + logDetService.addLogDet(usrId, usrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildSuccessResponse(alertMessage)); + } else { + alertMessage = "Contract Not Closed for ITC No " + contNum; + logDetService.addLogDet(usrId, usrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildFailureResponse(alertMessage)); + } + } catch (SQLException | ClassNotFoundException | NullPointerException | NumberFormatException + | ParseException e) { + // String errorMessage = e.getMessage(); + e.printStackTrace(); + logDetService.addLogDet(usrId, usrIPAddr, + "Failed to close the contract for ITC No " + contNum + ".\\nError: " + e.getMessage()); + response.getWriter().write(stringUtils.buildFailureResponse( + "Failed to close the contract for ITC No " + contNum + ".\\nError: " + e.getMessage())); + } + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/CloseExtContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/CloseExtContDetServlet.java new file mode 100644 index 0000000..42f068a --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/CloseExtContDetServlet.java @@ -0,0 +1,111 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.cont_mgmt.service.CloseExtContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.util.TimeUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class CloseExtContDetServlet + */ +@WebServlet("/CloseExtContDetServlet") +@MultipartConfig +public class CloseExtContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the TimeUtils + private TimeUtils timeUtils = new TimeUtils(); + + // Call the CloseExtContDetService + private CloseExtContDetService closeExtContDetService = new CloseExtContDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + private SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + private Date currentDate = null; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String extContNum = stringUtils.safeParam(request, "hid_ext_cont_num"); + Integer extUsrId = Integer.parseInt(request.getParameter("hid_ext_usr_id")); + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String extBasePath = request.getServletContext().getRealPath("/").trim(); + String extVendName = request.getParameter("hid_ext_vend_name").trim(); + Double extSDAmtRfd = Double.parseDouble(request.getParameter("ext_sd_amt_rfd")); + String extASDAmtRfd = stringUtils.safeParam(request, "ext_asd_amt_rfd"); + Part extSDFilePart = request.getPart("ext_cont_sd_file"); + Part extASDFilePart = request.getPart("ext_cont_asd_file"); + Double extAmtDue = Double.parseDouble(request.getParameter("hid_ext_amt_due")); + String extContEndDate = stringUtils.safeParam(request, "hid_ext_cont_end_date"); + String alertMessage = ""; + boolean flag = false; + + try { + Integer diffInDays = Integer.parseInt(timeUtils.getExpiryDays(sdf, currentDate, extContEndDate)); + if (diffInDays >= 0 && Math.round(extAmtDue) > 0) { + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "EXTENSION CONTRACT NOT CLOSED FOR ITC NO." + extContNum); + response.getWriter().write(stringUtils.buildFailureResponse( + "Neither extension contract is " + "expired nor work order amount is completed")); + } + + flag = closeExtContDetService.closeExtContDet(extContNum, extSDAmtRfd, extASDAmtRfd, extContEndDate, + extAmtDue, extVendName, extSDFilePart, extASDFilePart, extBasePath, extUsrId); + if (flag) { + alertMessage = "Extension Contract Closed for ITC No " + extContNum + " successfully."; + logDetService.addLogDet(extUsrId, extUsrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildSuccessResponse(alertMessage)); + } else { + alertMessage = "Extension Contract Not Closed for ITC No " + extContNum; + logDetService.addLogDet(extUsrId, extUsrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildFailureResponse(alertMessage)); + } + } catch (SQLException | ClassNotFoundException | NullPointerException | NumberFormatException + | ParseException e) { + // String errorMessage = e.getMessage(); + e.printStackTrace(); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "Failed to close the extension contract for ITC No " + extContNum + ".\\nError: " + e.getMessage()); + response.getWriter() + .write(stringUtils.buildFailureResponse("Failed to close the extension contract for ITC No " + + extContNum + ".\\nError: " + e.getMessage())); + } + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/CustRepDetServlet.java b/src/main/java/com/cont_mgmt/servlet/CustRepDetServlet.java new file mode 100644 index 0000000..9cd51ea --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/CustRepDetServlet.java @@ -0,0 +1,117 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.cont_mgmt.service.CustRepDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewBillDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class CustRepDetServlet + */ +@WebServlet("/CustRepDetServlet") +public class CustRepDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the CustRepDetService + private CustRepDetService custRepDetService = new CustRepDetService(); + + // Call the NewBillDetService + private NewBillDetService newBillDetService = new NewBillDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + request.getRequestDispatcher("cust_rep_det_search_display.jsp").forward(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String fromDate = stringUtils.safeParam(request, "from_date"); + String toDate = stringUtils.safeParam(request, "to_date"); + String userId = stringUtils.safeParam(request, "hid_user_id"); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + Integer usrId = stringUtils.getNonNull(userId) != "" ? Integer.parseInt(userId) : -1; + + try { + List> custRepList = custRepDetService.getContDetByDates(fromDate, toDate); + if (custRepList != null && !custRepList.isEmpty()) { + JSONArray jsonArray = new JSONArray(); + for (Map custRep : custRepList) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("vendName", custRep.get("vendName")); + jsonObject.put("vendId", custRep.get("vendId")); + jsonObject.put("prodCatName", custRep.get("prodCatName")); + jsonObject.put("contNum", custRep.get("contNum")); + jsonObject.put("workDesc", custRep.get("workDesc")); + jsonObject.put("contStartDate", custRep.get("contStartDate")); + jsonObject.put("contEndDate", custRep.get("contEndDate")); + jsonObject.put("invoiceBillType", custRep.get("invoiceBillType")); + jsonObject.put("emdAmt", custRep.get("emdAmt")); + jsonObject.put("sdAmt", custRep.get("sdAmt")); + jsonObject.put("asdAmt", custRep.get("asdAmt")); + jsonObject.put("contAmt", custRep.get("contAmt")); + jsonObject.put("amtDue", + newBillDetService.getAmtDueByContNum(String.valueOf(custRep.get("contNum")))); + jsonObject.put("isExt", custRep.get("isExt")); + jsonObject.put("contRmrk", custRep.get("contRmrk")); + jsonArray.put(jsonObject); + } + request.setAttribute("jsonCustRep", jsonArray); + request.setAttribute("fromDate", fromDate); + request.setAttribute("toDate", toDate); + logDetService.addLogDet(usrId, usrIPAddr, + "CONTRACT DETAILS BETWEEN " + fromDate + " TO " + toDate + " FETCHED."); + } else { + request.setAttribute("errorMessage", "No contracts found for the provided search criteria."); + request.setAttribute("fromDate", fromDate); + request.setAttribute("toDate", toDate); + logDetService.addLogDet(usrId, usrIPAddr, "NO CONTRACTS FOUND FOR THE PROVIDED SEARCH CRITERIA."); + } + request.getRequestDispatcher("cust_rep_det_search_display.jsp").forward(request, response); + } catch (SQLException | ClassNotFoundException | JSONException | ParseException e) { + request.setAttribute("errorMessage", "Error retrieving contracts."); + request.setAttribute("fromDate", fromDate); + request.setAttribute("toDate", toDate); + logDetService.addLogDet(usrId, usrIPAddr, + "ERROR RETRIEVING CONTRACTS IN CustRepDetServlet: " + e.getMessage()); + request.getRequestDispatcher("cust_rep_det_search_display.jsp").forward(request, response); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistActBillDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistActBillDetMsgServlet.java new file mode 100644 index 0000000..a8907a6 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistActBillDetMsgServlet.java @@ -0,0 +1,107 @@ +package com.cont_mgmt.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistBillDetService; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +/** + * Servlet implementation class ExistActBillDetMsgServlet + */ +@WebServlet("/ExistActBillDetMsgServlet") +public class ExistActBillDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the ViewBillDetService + private ExistBillDetService existBillDetService = new ExistBillDetService(); + + // Call the ExistContDetService + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String contNum = stringUtils.safeParam(request, "hid_cont_num"); + String vendId = stringUtils.safeParam(request, "hid_vend_id"); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + Integer usrId = -1; + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existBillDetService.getBillDet(contNum); + List contractDetList = existContDetService.getContDet(vendId, contNum); + + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, "BILLS FOR " + contractDetList.get(0).getContNum() + + " CONTRACT FETECHED VIA MESSAGE NOTIFICATION" + " IN ACTIVE BILLS"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, + "ONLY CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO BILLS FOUND FOR GIVEN CONTRACT" + + " VIA MESSAGE NOTIFICATION IN ACTIVE BILLS"); + } else { + logDetService.addLogDet(usrId, usrIPAddr, + "NO BILL DETAILS FOUND VIA MESSAGE NOTIFICATION IN" + " ACTIVE BILLS"); + servletUtils.setErrorAttribute(request, "No bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_act_bill_det_display_msg.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, usrId, usrIPAddr); + } + + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, "Error retrieving contract or bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, + "ERROR RETRIEVING CONTRACT OR BILL DATA VIA MESSAGE NOTIFICATION IN ACTIVE BILLS"); + servletUtils.forwardRequest(request, response, "exist_act_bill_det_display_msg.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistActExtBillDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistActExtBillDetMsgServlet.java new file mode 100644 index 0000000..8816f6d --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistActExtBillDetMsgServlet.java @@ -0,0 +1,110 @@ +package com.cont_mgmt.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistExtBillDetService; +import com.cont_mgmt.service.ExistExtContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +/** + * Servlet implementation class ExistActExtBillDetMsgServlet + */ +@WebServlet("/ExistActExtBillDetMsgServlet") +public class ExistActExtBillDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + // Call the ViewBillDetService + private ExistExtBillDetService existExtBillDetService = new ExistExtBillDetService(); + + // Call the ExistExtContDetService + private ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String extContNum = stringUtils.safeParam(request, "hid_ext_cont_num"); + String extVendId = stringUtils.safeParam(request, "hid_ext_vend_id"); + String extVendName = stringUtils.safeParam(request, "hid_ext_vend_name"); + String workDesc = stringUtils.safeParam(request, "work_desc"); + Integer extUsrId = -1; + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existExtBillDetService.getExtBillDet(extContNum); + List contractDetList = existExtContDetService.getExtContDet(extVendId, extContNum); + + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), extVendName, workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "EXTENSION BILLS FOR " + contractDetList.get(0).getContNum() + + " CONTRACT FETECHED VIA MESSAGE NOTIFICATION IN " + "EXTENSION ACTIVE BILLS"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, new ContDetListWrapper(contractDetList), extVendName, workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "ONLY EXTENSION CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO EXTENSION BILLS FOUND FOR GIVEN CONTRACT " + + "VIA MESSAGE NOTIFICATION IN EXTENSION ACTIVE BILLS"); + } else { + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "NO EXTENSION BILL DETAILS FOUND IN EXTENSION ACTIVE BILLS"); + servletUtils.setErrorAttribute(request, "No extension bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_act_ext_bill_det_display_msg.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, extUsrId, extUsrIPAddr); + } + + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, + "Error retrieving extension contract or " + "extension bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "ERROR RETRIEVING EXTENSION CONTRACT OR EXTENSION BILL DATA " + + "VIA MESSAGE NOTIFICATION IN EXTENSION ACTIVE BILLS"); + servletUtils.forwardRequest(request, response, "exist_act_ext_bill_det_display_msg.jsp"); + e.printStackTrace(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/cont_mgmt/servlet/ExistBillDetServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistBillDetServlet.java new file mode 100644 index 0000000..5c778dc --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistBillDetServlet.java @@ -0,0 +1,105 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistBillDetService; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExistBillDetServlet + */ +@WebServlet("/ExistBillDetServlet") +public class ExistBillDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + // Call the ViewBillDetService + private ExistBillDetService existBillDetService = new ExistBillDetService(); + + // Call the ExistContDetService + private ExistContDetService existContDetService = new ExistContDetService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String contNum = stringUtils.safeParam(request, "hid_cont_num"); + String vendId = stringUtils.safeParam(request, "hid_vend_id"); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + Integer usrId = Integer.parseInt(request.getParameter("hid_user_id")); + String reqSrc = stringUtils.safeParam(request, "req_src"); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existBillDetService.getBillDet(contNum); + List contractDetList = existContDetService.getContDet(vendId, contNum); + + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, reqSrc, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, + "BILLS FOR " + contractDetList.get(0).getContNum() + " CONTRACT FETECHED"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, reqSrc, new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, "ONLY CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO BILLS FOUND FOR GIVEN CONTRACT"); + } else { + logDetService.addLogDet(usrId, usrIPAddr, "NO BILL DETAILS FOUND"); + servletUtils.setErrorAttribute(request, "No bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_bill_det_display.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, usrId, usrIPAddr); + } + + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, "Error retrieving contract or bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "ERROR RETRIEVING CONTRACT OR BILL DATA"); + servletUtils.forwardRequest(request, response, "exist_bill_det_display.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistContDetServlet.java new file mode 100644 index 0000000..3274baf --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistContDetServlet.java @@ -0,0 +1,101 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.ExistVendDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.ContDetListWrapper; +import com.cont_mgmt.wrapper.VendDetListWrapper; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExistContDetServlet + */ +@WebServlet("/ExistContDetServlet") +public class ExistContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ExistVendDetService + private ExistVendDetService existVendDetService = new ExistVendDetService(); + + // Call the ExistContDetService + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Get vendId from hidden form + String hidVendId = stringUtils.safeParam(request, "hid_vend_id"); + Integer usrId = Integer.parseInt(request.getParameter("hid_user_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + String hidContNum = null; // Dummy value for + // existContDetService.getContDet + String hidVendName = null; // Dummy value for + // existVendDetService.getVendDet + String hidVendKey = null; // Dummy value for + // existVendDetService.getVendDet + + try { + List vendorList = existVendDetService.getVendDet(hidVendId, hidVendName, hidVendKey); + List contractList = existContDetService.getContDet(hidVendId, hidContNum); + if (stringUtils.hasData(contractList) && stringUtils.hasData(vendorList)) { + logDetService.addLogDet(usrId, usrIPAddr, + "CONTRACTS FOR " + vendorList.get(0).getVendName() + " CONTRACTOR FETCHED"); + servletUtils.setAttributes(request, new VendDetListWrapper(vendorList), + new ContDetListWrapper(contractList)); + } else if (stringUtils.hasData(vendorList)) { + logDetService.addLogDet(usrId, usrIPAddr, "ONLY CONTRACTOR " + vendorList.get(0).getVendName() + + " IS FETCHED AND NO CONTRACTS FOUND FOR GIVEN CONTRACTOR"); + request.setAttribute("vendListWrapper", new VendDetListWrapper(vendorList)); + } else { + logDetService.addLogDet(usrId, usrIPAddr, + "NO CONTRACTORS OR CONTRACT FOUND FOR THE PROVIDED SEARCH CRITERIA"); + servletUtils.setErrorAttribute(request, + "No contractors or contract found for the provided search criteria."); + } + + servletUtils.forwardRequest(request, response, "exist_cont_det_display.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, usrId, usrIPAddr); + } + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, "Error retrieving contractor or contract data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "ERROR RETRIEVING CONTRACTOR OR CONTRACT DATA"); + servletUtils.forwardRequest(request, response, "exist_cont_det_display.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistExpBillDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistExpBillDetMsgServlet.java new file mode 100644 index 0000000..d3618bc --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistExpBillDetMsgServlet.java @@ -0,0 +1,108 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistBillDetService; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExistBillDetMsgServlet + */ +@WebServlet("/ExistExpBillDetMsgServlet") +public class ExistExpBillDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + // Call the ViewBillDetService + private ExistBillDetService existBillDetService = new ExistBillDetService(); + + // Call the ExistContDetService + private ExistContDetService existContDetService = new ExistContDetService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String contNum = stringUtils.safeParam(request, "hid_cont_num"); + String vendId = stringUtils.safeParam(request, "hid_vend_id"); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + Integer usrId = -1; + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existBillDetService.getBillDet(contNum); + List contractDetList = existContDetService.getContDet(vendId, contNum); + + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, "BILLS FOR " + contractDetList.get(0).getContNum() + + " CONTRACT FETECHED VIA MESSAGE NOTIFICATION" + " IN EXPIRING BILLS"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, + "ONLY CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO BILLS FOUND FOR GIVEN CONTRACT" + + " VIA MESSAGE NOTIFICATION IN EXPIRING BILLS"); + } else { + logDetService.addLogDet(usrId, usrIPAddr, + "NO BILL DETAILS FOUND VIA MESSAGE NOTIFICATION IN EXPIRING BILLS"); + servletUtils.setErrorAttribute(request, "No bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_exp_bill_det_display_msg.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, usrId, usrIPAddr); + } + + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, "Error retrieving contract or bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, + "ERROR RETRIEVING CONTRACT OR BILL DATA VIA MESSAGE NOTIFICATION IN EXPIRING BILLS"); + servletUtils.forwardRequest(request, response, "exist_exp_bill_det_display_msg.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistExpExtBillDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistExpExtBillDetMsgServlet.java new file mode 100644 index 0000000..9f51ea2 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistExpExtBillDetMsgServlet.java @@ -0,0 +1,111 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistExtBillDetService; +import com.cont_mgmt.service.ExistExtContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExpExtBillDetMsgServlet + */ +@WebServlet("/ExistExpExtBillDetMsgServlet") +public class ExistExpExtBillDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + // Call the ViewBillDetService + private ExistExtBillDetService existExtBillDetService = new ExistExtBillDetService(); + + // Call the ExistExtContDetService + private ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String extContNum = stringUtils.safeParam(request, "hid_ext_cont_num"); + String extVendId = stringUtils.safeParam(request, "hid_ext_vend_id"); + String extVendName = stringUtils.safeParam(request, "hid_ext_vend_name"); + String workDesc = stringUtils.safeParam(request, "work_desc"); + Integer extUsrId = -1; + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existExtBillDetService.getExtBillDet(extContNum); + List contractDetList = existExtContDetService.getExtContDet(extVendId, extContNum); + + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), extVendName, workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "EXTENSION BILLS FOR " + contractDetList.get(0).getContNum() + + " CONTRACT FETECHED VIA MESSAGE NOTIFICATION IN EXTENSION EXPIRING BILLS"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, new ContDetListWrapper(contractDetList), extVendName, workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "ONLY EXTENSION CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO EXTENSION BILLS FOUND FOR GIVEN CONTRACT " + + "VIA MESSAGE NOTIFICATION IN EXTENSION EXPIRING BILLS"); + } else { + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "NO EXTENSION BILL DETAILS FOUND IN EXTENSION EXPIRING BILLS"); + servletUtils.setErrorAttribute(request, "No extension bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_exp_ext_bill_det_display_msg.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, extUsrId, extUsrIPAddr); + } + + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, + "Error retrieving extension contract or extension bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "ERROR RETRIEVING EXTENSION CONTRACT OR EXTENSION BILL DATA " + + "VIA MESSAGE NOTIFICATION IN EXTENSION EXPIRING BILLS"); + servletUtils.forwardRequest(request, response, "exist_exp_ext_bill_det_display_msg.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistExpdBillDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistExpdBillDetMsgServlet.java new file mode 100644 index 0000000..7e86612 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistExpdBillDetMsgServlet.java @@ -0,0 +1,106 @@ +package com.cont_mgmt.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistBillDetService; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +/** + * Servlet implementation class ExistExpdBillDetMsgServlet + */ +@WebServlet("/ExistExpdBillDetMsgServlet") +public class ExistExpdBillDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + // Call the ViewBillDetService + private ExistBillDetService existBillDetService = new ExistBillDetService(); + + // Call the ExistContDetService + private ExistContDetService existContDetService = new ExistContDetService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String contNum = stringUtils.safeParam(request, "hid_cont_num"); + String vendId = stringUtils.safeParam(request, "hid_vend_id"); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + Integer usrId = -1; + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existBillDetService.getBillDet(contNum); + List contractDetList = existContDetService.getContDet(vendId, contNum); + + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, "BILLS FOR " + contractDetList.get(0).getContNum() + + " CONTRACT FETECHED VIA MESSAGE NOTIFICATION IN EXPIRED BILLS"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, new ContDetListWrapper(contractDetList), vendName); + logDetService.addLogDet(usrId, usrIPAddr, + "ONLY CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO BILLS FOUND FOR GIVEN CONTRACT" + + " VIA MESSAGE NOTIFICATION IN EXPIRED BILLS"); + } else { + logDetService.addLogDet(usrId, usrIPAddr, + "NO BILL DETAILS FOUND VIA MESSAGE NOTIFICATION IN EXPIRED BILLS"); + servletUtils.setErrorAttribute(request, "No bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_expd_bill_det_display_msg.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, usrId, usrIPAddr); + } + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, "Error retrieving contract or bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, + "ERROR RETRIEVING CONTRACT OR BILL DATA VIA MESSAGE NOTIFICATION" + " IN EXPIRED BILLS"); + servletUtils.forwardRequest(request, response, "exist_expd_bill_det_display_msg.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistExpdExtBillDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistExpdExtBillDetMsgServlet.java new file mode 100644 index 0000000..4792545 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistExpdExtBillDetMsgServlet.java @@ -0,0 +1,109 @@ +package com.cont_mgmt.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistExtBillDetService; +import com.cont_mgmt.service.ExistExtContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +/** + * Servlet implementation class ExistExpdExtBillDetMsgServlet + */ +@WebServlet("/ExistExpdExtBillDetMsgServlet") +public class ExistExpdExtBillDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + // Call the ViewBillDetService + private ExistExtBillDetService existExtBillDetService = new ExistExtBillDetService(); + + // Call the ExistExtContDetService + private ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String extContNum = stringUtils.safeParam(request, "hid_ext_cont_num"); + String extVendId = stringUtils.safeParam(request, "hid_ext_vend_id"); + String extVendName = stringUtils.safeParam(request, "hid_ext_vend_name"); + String workDesc = stringUtils.safeParam(request, "work_desc"); + Integer extUsrId = -1; + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existExtBillDetService.getExtBillDet(extContNum); + List contractDetList = existExtContDetService.getExtContDet(extVendId, extContNum); + + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), extVendName, workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "EXTENSION BILLS FOR " + contractDetList.get(0).getContNum() + + " CONTRACT FETECHED VIA MESSAGE NOTIFICATION IN EXTENSION EXPIRED BILLS"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, new ContDetListWrapper(contractDetList), extVendName, workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "ONLY EXTENSION CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO EXTENSION BILLS FOUND FOR GIVEN CONTRACT " + + "VIA MESSAGE NOTIFICATION IN EXTENSION EXPIRED BILLS"); + } else { + logDetService.addLogDet(extUsrId, extUsrIPAddr, "NO BILL DETAILS FOUND"); + servletUtils.setErrorAttribute(request, "No extension bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_expd_ext_bill_det_display_msg.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, extUsrId, extUsrIPAddr); + } + + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, + "Error retrieving extension contract or extension bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "ERROR RETRIEVING EXTENSION CONTRACT OR EXTENSION BILL DATA " + + "VIA MESSAGE NOTIFICATION IN EXTENSION EXPIRED BILLS"); + servletUtils.forwardRequest(request, response, "exist_expd_ext_bill_det_display_msg.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistExtBillDetServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistExtBillDetServlet.java new file mode 100644 index 0000000..ba50a8e --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistExtBillDetServlet.java @@ -0,0 +1,109 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExistExtBillDetService; +import com.cont_mgmt.service.ExistExtContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExistExtBillDetServlet + */ +@WebServlet("/ExistExtBillDetServlet") +public class ExistExtBillDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ViewBillDetService + private ExistExtBillDetService existExtBillDetService = new ExistExtBillDetService(); + + // Call the ExistExtContDetService + private ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String extContNum = stringUtils.safeParam(request, "hid_ext_cont_num"); + String extVendId = stringUtils.safeParam(request, "hid_ext_vend_id"); + String extVendName = stringUtils.safeParam(request, "hid_ext_vend_name"); + Integer extUsrId = Integer.parseInt(request.getParameter("hid_ext_user_id")); + String reqSrc = stringUtils.safeParam(request, "req_src"); + String workDesc = stringUtils.safeParam(request, "work_desc"); + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + try { + List billDetList = existExtBillDetService.getExtBillDet(extContNum); + List contractDetList = existExtContDetService.getExtContDet(extVendId, extContNum); + // System.out.println(contractDetList); + if (stringUtils.hasData(contractDetList) && stringUtils.hasData(billDetList)) { + servletUtils.setAttributes(request, reqSrc, new BillDetListWrapper(billDetList), + new ContDetListWrapper(contractDetList), extVendName, workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "EXTENSION BILLS FOR " + contractDetList.get(0).getContNum() + " CONTRACT FETECHED"); + } else if (stringUtils.hasData(contractDetList)) { + servletUtils.setAttributes(request, reqSrc, new ContDetListWrapper(contractDetList), extVendName, + workDesc); + logDetService.addLogDet(extUsrId, extUsrIPAddr, + "ONLY EXTENSION CONTRACT " + contractDetList.get(0).getContNum() + + " IS FETCHED AND NO EXTENSION BILLS FOUND FOR GIVEN CONTRACT"); + } else { + logDetService.addLogDet(extUsrId, extUsrIPAddr, "NO BILL DETAILS FOUND"); + servletUtils.setErrorAttribute(request, "No extension bill details found."); + } + + servletUtils.forwardRequest(request, response, "exist_ext_bill_det_display.jsp"); + } catch (SQLException | ClassNotFoundException e) { + handleException(request, response, e, extUsrId, extUsrIPAddr); + } + + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, Exception e, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + servletUtils.setErrorAttribute(request, + "Error retrieving extension contract or extension bill data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "ERROR RETRIEVING EXTENSION CONTRACT OR EXTENSION BILL DATA"); + servletUtils.forwardRequest(request, response, "exist_ext_bill_det_display.jsp"); + e.printStackTrace(); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExistVendDetServlet.java b/src/main/java/com/cont_mgmt/servlet/ExistVendDetServlet.java new file mode 100644 index 0000000..2002322 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExistVendDetServlet.java @@ -0,0 +1,112 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.service.ExistVendDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.ServletUtils; +import com.cont_mgmt.util.StringUtils; +import com.cont_mgmt.wrapper.VendDetListWrapper; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExistVendDetServlet + */ +@WebServlet("/ExistVendDetServlet") +public class ExistVendDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ServletUtils + private ServletUtils servletUtils = new ServletUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + servletUtils.forwardRequest(request, response, "exist_vend_det_search_display.jsp"); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + handleRequest(request, response); + } + + private void handleRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + String vendName = stringUtils.safeParam(request, "vend_name"); + String vendId = stringUtils.safeParam(request, "vend_id"); + String userId = stringUtils.safeParam(request, "hid_user_id"); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String vendKey = stringUtils.safeParam(request, "vend_key"); + + Integer usrId = stringUtils.getNonNull(userId) != "" ? Integer.parseInt(userId) : -1; + + // Validate that meaningful input is provided + if (stringUtils.isInvalidSelection(vendName) && stringUtils.isInvalidSelection(vendId) + && stringUtils.isInvalidSelection(vendKey)) { + servletUtils.setErrorMessage(request, + "Please provide Contractor Name, Contractor ID, or a relevant Keyword."); + logDetService.addLogDet(usrId, usrIPAddr, "PLEASE PROVIDE CONTRACTOR NAME, CONTRACTOR ID, OR A KEYWORD."); + servletUtils.forwardRequest(request, response, "exist_vend_det_search_display.jsp"); + return; + } + + // Convert vendName to uppercase and ensure vendId is not null + vendName = stringUtils.getUpperCase(vendName); + vendId = stringUtils.getNonNull(vendId); + + ExistVendDetService existVendDetService = new ExistVendDetService(); + + try { + List vendList = existVendDetService.getVendDet(vendId, vendName, vendKey); + System.out.println("Servlet: " + vendList); + if (vendList != null && !vendList.isEmpty()) { + request.setAttribute("vendListWrapper", new VendDetListWrapper(vendList)); + request.setAttribute("vend_name", vendName); + request.setAttribute("vend_id", vendId); + request.setAttribute("vend_key", vendKey); + request.setAttribute("user_id", usrId); + logDetService.addLogDet(usrId, usrIPAddr, + "CONTRACTOR DETAILS FOR " + vendList.get(0).getVendName() + " FETCHED"); + } else { + servletUtils.setErrorMessage(request, "No contractors found for the provided search criteria."); + logDetService.addLogDet(usrId, usrIPAddr, "NO CONTRACTORS FOUND FOR THE PROVIDED SEARCH CRITERIA"); + } + + servletUtils.forwardRequest(request, response, "exist_vend_det_search_display.jsp"); + + } catch (SQLException | ClassNotFoundException e) { + servletUtils.setErrorMessage(request, "Error retrieving contractor data. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "ERROR RETRIEVING CONTRACTOR DATA"); + servletUtils.forwardRequest(request, response, "exist_vend_det_search_display.jsp"); + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExpContDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExpContDetMsgServlet.java new file mode 100644 index 0000000..6308a0e --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExpContDetMsgServlet.java @@ -0,0 +1,219 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.repository.FetchExistVendDet; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewBillDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExpContDetMsgServlet + */ +@WebServlet("/ExpContDetMsgServlet") +public class ExpContDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the ExistContDetService to fetch expiring contracts + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the NewBillDetService to fetch due amount + private NewBillDetService newBillDetService = new NewBillDetService(); + + // Call FetchExistVendDet to fetch vendor data + private FetchExistVendDet fetchExistVendDet = new FetchExistVendDet(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Toggle for alternate day message sending (active/expired) in case both exist + private static boolean sendStatusToday = true; + + JSONArray contractsJsonArray = null; + + String vendKey = null; // Dummy data + String searchType = null; // Dummy data + + double amtDue; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + Integer usrId = -1; + + String vendName = null; // Dummy data + + try { + List contracts = existContDetService.getExpContDetList(); + if (contracts != null && !contracts.isEmpty()) { + handleExpContSuccess(contracts, vendName, usrId, usrIPAddr, request, response); + } else if (contracts == null || contracts.isEmpty()) { + String errorMessage = null; + String messageProducer = existContDetService.getExpContDet(); + String lowerMsg = messageProducer.toLowerCase(); + + // Flags to detect which type are present + boolean hasExpd = lowerMsg.contains("expired"); + boolean hasAct = lowerMsg.contains("active"); + boolean hasExp = lowerMsg.contains("about to expire"); + + if (lowerMsg.contains("no contracts")) { + errorMessage = messageProducer; // If no contracts found + } else if (hasExpd && !hasExp && !hasAct) { + errorMessage = messageProducer; // Only Expired + } else if (hasAct && !hasExp && !hasExpd) { + errorMessage = messageProducer; // Only Active + } else if (hasAct && hasExpd && !hasExp) { // Active + Expired -> Send in alternate days + String actMsg = stringUtils.extractBlock(messageProducer, "active"); + String expdMsg = stringUtils.extractBlock(messageProducer, "expired"); + + if (sendStatusToday) { + errorMessage = actMsg; + } else { + errorMessage = expdMsg; + } + sendStatusToday = !sendStatusToday; // Toggle msg for next day + } else { + errorMessage = "No message could be generated"; // Fallback message if all conditions failed + } + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + } catch (SQLException | ClassNotFoundException | ParseException | JSONException e) { + e.printStackTrace(); + handleException(e, usrId, usrIPAddr, request, response); + } + } + + private void handleException(Exception e, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + String errorMessage = "An error occurred: " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, "AN ERROR OCCURRED" + + " IN EXPIRING CONTRACT VIA MESSAGE NOTIFICATION: " + e.getMessage().toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + try { + contractsJsonArray = new JSONArray(); + + JSONObject contractJson = new JSONObject(); + contractJson.put("errorMessage", errorMessage); + contractsJsonArray.put(contractJson); + + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "fail"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("expiringContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, + (errorMessage + " VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT").toUpperCase()); + + request.getRequestDispatcher("exp_cont_det_display_msg.jsp").forward(request, response); + } catch (JSONException e) { + // Create a fallback JSON object + JSONArray fallbackJsonArray = new JSONArray(); + JSONObject fallbackJsonError = new JSONObject(); + + try { + fallbackJsonError.put("errorMessage", + "An error occurred while processing the error: " + e.getMessage()); + fallbackJsonError.put("status", "fail"); + fallbackJsonArray.put(fallbackJsonError); + + // Send as response or store in session if JSP forward is + // required + request.getSession().setAttribute("expiringContractsJson", fallbackJsonArray); + logDetService.addLogDet(usrId, usrIPAddr, "AN ERROR OCCURRED WHILE PROCESSING THE ERROR VIA" + + " MESSAGE NOTIFICATION: " + e.getMessage().toUpperCase() + " IN EXPIRING CONTRACT"); + request.getRequestDispatcher("exp_cont_det_display_msg.jsp").forward(request, response); + + } catch (JSONException jsonException) { + // In case of another error, log it and send a plain error + // response + jsonException.printStackTrace(); + response.setContentType("application/json"); + logDetService.addLogDet(usrId, usrIPAddr, + "CRITICAL ERROR OCCURRED VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT"); + response.getWriter().write("{\"errorMessage\":\"Critical error occurred.\", \"status\":\"fail\"}"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + } + + private void handleExpContSuccess(List contracts, String vendName, Integer usrId, String usrIPAddr, + HttpServletRequest request, HttpServletResponse response) + throws JSONException, ClassNotFoundException, SQLException, ServletException, IOException { + // TODO Auto-generated method stub + contractsJsonArray = new JSONArray(); + + for (Contract contract : contracts) { + List isExistVendListFetched = fetchExistVendDet.fetch(contract.getVendId(), vendName, vendKey, + searchType); + amtDue = newBillDetService.getTotAmtDueByContNum(contract.getContNum()); + JSONObject contractJson = new JSONObject(); + contractJson.put("contNum", contract.getContNum()); + contractJson.put("vendName", isExistVendListFetched.get(0).getVendName()); + contractJson.put("vendId", isExistVendListFetched.get(0).getVendId()); + contractJson.put("contStartDate", contract.getContStartDate()); + contractJson.put("contEndDate", contract.getContEndDate()); + contractJson.put("contAmt", contract.getContAmt()); + contractJson.put("amtDue", amtDue); + contractJson.put("workDesc", contract.getWorkDesc()); + contractJson.put("isExt", contract.getIsExtended()); + contractsJsonArray.put(contractJson); + } + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "success"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("expiringContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, "ENTERED EXPIRING CONTRACT PAGE VIA MESSAGE NOTIFICATION"); + + request.getRequestDispatcher("exp_cont_det_display_msg.jsp").forward(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExpContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/ExpContDetServlet.java new file mode 100644 index 0000000..69c0dfb --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExpContDetServlet.java @@ -0,0 +1,227 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.repository.FetchExistVendDet; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewBillDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExpContDetServlet + */ +@WebServlet("/ExpContDetServlet") +public class ExpContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the ExistContDetService to fetch expiring contracts + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the NewBillDetService to fetch due amount + private NewBillDetService newBillDetService = new NewBillDetService(); + + // Call FetchExistVendDet to fetch vendor data + private FetchExistVendDet fetchExistVendDet = new FetchExistVendDet(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Toggle for alternate day message sending (active/expired) in case both exist + private static boolean sendStatusToday = true; + + JSONArray contractsJsonArray = null; + + String vendKey = null; // Dummy data + String searchType = null; // Dummy data + + double amtDue; + double extAmtDue; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String encodedUsrId = stringUtils.safeParam(request, "user_id"); + StringBuilder decodedUsrId = new StringBuilder(); + for (int i = 0; i < encodedUsrId.length(); i += 2) { + String hexChar = encodedUsrId.substring(i, i + 2); + decodedUsrId.append((char) Integer.parseInt(hexChar, 16)); + } + Integer usrId = Integer.parseInt(decodedUsrId.toString()); + + String vendName = null; // Dummy data + + try { + List contracts = existContDetService.getExpContDetList(); + if (contracts != null && !contracts.isEmpty()) { + handleExpContSuccess(contracts, vendName, usrId, usrIPAddr, request, response); + } else if (contracts == null || contracts.isEmpty()) { + String errorMessage = null; + String messageProducer = existContDetService.getExpContDet(); + String lowerMsg = messageProducer.toLowerCase(); + + // Flags to detect which type are present + boolean hasExpd = lowerMsg.contains("expired"); + boolean hasAct = lowerMsg.contains("active"); + boolean hasExp = lowerMsg.contains("about to expire"); + + if (lowerMsg.contains("no contracts")) { + errorMessage = messageProducer; // If no contracts found + } else if (hasExpd && !hasExp && !hasAct) { + errorMessage = messageProducer; // Only Expired + } else if (hasAct && !hasExp && !hasExpd) { + errorMessage = messageProducer; // Only Active + } else if (hasAct && hasExpd && !hasExp) { // Active + Expired -> Send in alternate days + String actMsg = stringUtils.extractBlock(messageProducer, "active"); + String expdMsg = stringUtils.extractBlock(messageProducer, "expired"); + + if (sendStatusToday) { + errorMessage = actMsg; + } else { + errorMessage = expdMsg; + } + sendStatusToday = !sendStatusToday; // Toggle msg for next day + } else { + errorMessage = "No message could be generated"; // Fallback message if all conditions failed + } + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + } catch (SQLException | ClassNotFoundException | ParseException | JSONException e) { + e.printStackTrace(); + handleException(e, usrId, usrIPAddr, request, response); + } + } + + private void handleException(Exception e, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + String errorMessage = "An error occurred: " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + try { + contractsJsonArray = new JSONArray(); + + JSONObject contractJson = new JSONObject(); + contractJson.put("errorMessage", errorMessage); + contractsJsonArray.put(contractJson); + + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "fail"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("expiringContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + + request.getRequestDispatcher("exp_cont_det_display.jsp").forward(request, response); + } catch (JSONException e) { + // Create a fallback JSON object + JSONArray fallbackJsonArray = new JSONArray(); + JSONObject fallbackJsonError = new JSONObject(); + + try { + fallbackJsonError.put("errorMessage", + "An error occurred while processing the error: " + e.getMessage()); + fallbackJsonError.put("status", "fail"); + fallbackJsonArray.put(fallbackJsonError); + + // Send as response or store in session if JSP forward is + // required + request.getSession().setAttribute("expiringContractsJson", fallbackJsonArray); + logDetService.addLogDet(usrId, usrIPAddr, + "AN ERROR OCCURRED WHILE PROCESSING THE ERROR: " + e.getMessage().toUpperCase()); + request.getRequestDispatcher("exp_cont_det_display.jsp").forward(request, response); + + } catch (JSONException jsonException) { + // In case of another error, log it and send a plain error + // response + jsonException.printStackTrace(); + response.setContentType("application/json"); + logDetService.addLogDet(usrId, usrIPAddr, "CRITICAL ERROR OCCURRED"); + response.getWriter().write("{\"errorMessage\":\"Critical error occurred.\", \"status\":\"fail\"}"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + } + + private void handleExpContSuccess(List contracts, String vendName, Integer usrId, String usrIPAddr, + HttpServletRequest request, HttpServletResponse response) + throws JSONException, ClassNotFoundException, SQLException, ServletException, IOException { + // TODO Auto-generated method stub + + contractsJsonArray = new JSONArray(); + + for (Contract contract : contracts) { + List isExistVendListFetched = fetchExistVendDet.fetch(contract.getVendId(), vendName, vendKey, + searchType); + amtDue = newBillDetService.getTotAmtDueByContNum(contract.getContNum()); + /* + * extAmtDue = extBillDetService.getTotAmtDueByExtContNum(contract + * .getContNum()); + */ + JSONObject contractJson = new JSONObject(); + contractJson.put("contNum", contract.getContNum()); + contractJson.put("vendName", isExistVendListFetched.get(0).getVendName()); + contractJson.put("vendId", isExistVendListFetched.get(0).getVendId()); + contractJson.put("contStartDate", contract.getContStartDate()); + contractJson.put("contEndDate", contract.getContEndDate()); + contractJson.put("contAmt", contract.getContAmt()); + contractJson.put("amtDue", amtDue); + contractJson.put("workDesc", contract.getWorkDesc()); + contractJson.put("isExt", contract.getIsExtended()); + contractsJsonArray.put(contractJson); + } + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "success"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("expiringContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, "ENTERED EXPIRING CONTRACT PAGE"); + + request.getRequestDispatcher("exp_cont_det_display.jsp").forward(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExpdContDetMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ExpdContDetMsgServlet.java new file mode 100644 index 0000000..3d40ed0 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExpdContDetMsgServlet.java @@ -0,0 +1,213 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.repository.FetchExistVendDet; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewBillDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ExpdContDetMsgServlet + */ +@WebServlet("/ExpdContDetMsgServlet") +public class ExpdContDetMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the ExistContDetService to fetch expired contracts + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the NewBillDetService to fetch due amount + private NewBillDetService newBillDetService = new NewBillDetService(); + + // Call FetchExistVendDet to fetch vendor data + private FetchExistVendDet fetchExistVendDet = new FetchExistVendDet(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + JSONArray contractsJsonArray = null; + + String vendKey = null; // Dummy data + String searchType = null; // Dummy data + + double amtDue; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + Integer usrId = -1; + + String vendName = null; // Dummy data + try { + List contracts = existContDetService.getExpdContDetList(); + if (contracts != null && !contracts.isEmpty()) { + handleExpContSuccess(contracts, vendName, usrId, usrIPAddr, request, response); + } else if (contracts == null || contracts.isEmpty()) { + String errorMessage = null; + String messageProducer = existContDetService.getExpContDet(); + String lowerMsg = messageProducer.toLowerCase(); + + // Flags to detect which type are present + boolean hasExp = lowerMsg.contains("about to expire"); + boolean hasExpd = lowerMsg.contains("expired"); + boolean hasAct = lowerMsg.contains("active"); + + if (lowerMsg.contains("no contracts")) { + errorMessage = messageProducer; // If no contracts found + } else if (hasExp && !hasExpd && !hasAct) { + errorMessage = messageProducer; // Only Expiring + } else if (hasAct && !hasExp && !hasExpd) { + errorMessage = messageProducer; // Only Active + } else if (hasExp && (hasAct || hasExpd)) { + // Expiring + Active/Expired -> send only expiring + errorMessage = stringUtils.extractBlock(messageProducer, "about to expire"); + } else if (hasAct && hasExpd && !hasExp) { // Active + Expired -> Send active alone as expired contracts + // are available + String actMsg = stringUtils.extractBlock(messageProducer, "active"); + errorMessage = actMsg; + } else { + errorMessage = "No message could be generated"; // Fallback message if all conditions failed + } + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + } catch (SQLException | ClassNotFoundException | ParseException | JSONException e) { + e.printStackTrace(); + handleException(e, usrId, usrIPAddr, request, response); + } + } + + private void handleExpContSuccess(List contracts, String vendName, Integer usrId, String usrIPAddr, + HttpServletRequest request, HttpServletResponse response) + throws JSONException, ClassNotFoundException, SQLException, ServletException, IOException { + // TODO Auto-generated method stub + contractsJsonArray = new JSONArray(); + + for (Contract contract : contracts) { + List isExistVendListFetched = fetchExistVendDet.fetch(contract.getVendId(), vendName, vendKey, + searchType); + amtDue = newBillDetService.getTotAmtDueByContNum(contract.getContNum()); + JSONObject contractJson = new JSONObject(); + contractJson.put("contNum", contract.getContNum()); + contractJson.put("vendName", isExistVendListFetched.get(0).getVendName()); + contractJson.put("vendId", isExistVendListFetched.get(0).getVendId()); + contractJson.put("contStartDate", contract.getContStartDate()); + contractJson.put("contEndDate", contract.getContEndDate()); + contractJson.put("contAmt", contract.getContAmt()); + contractJson.put("amtDue", amtDue); + contractJson.put("workDesc", contract.getWorkDesc()); + contractJson.put("isExt", contract.getIsExtended()); + contractsJsonArray.put(contractJson); + } + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "success"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("expiredContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, "ENTERED EXPIRED CONTRACT PAGE VIA MESSAGE NOTIFICATION"); + + request.getRequestDispatcher("expd_cont_det_display_msg.jsp").forward(request, response); + } + + private void handleException(Exception e, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + String errorMessage = "An error occurred: " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, + "AN ERROR OCCURRED IN EXPIRED CONTRACT VIA MESSAGE NOTIFICATION: " + e.getMessage().toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + try { + contractsJsonArray = new JSONArray(); + + JSONObject contractJson = new JSONObject(); + contractJson.put("errorMessage", errorMessage); + contractsJsonArray.put(contractJson); + + // Add a status as part of the contractsJsonArray + JSONObject statusJson = new JSONObject(); + statusJson.put("status", "fail"); + contractsJsonArray.put(statusJson); + + request.getSession().setAttribute("expiredContractsJson", contractsJsonArray); + + logDetService.addLogDet(usrId, usrIPAddr, + (errorMessage + " VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT").toUpperCase()); + + request.getRequestDispatcher("expd_cont_det_display_msg.jsp").forward(request, response); + } catch (JSONException e) { + // Create a fallback JSON object + JSONArray fallbackJsonArray = new JSONArray(); + JSONObject fallbackJsonError = new JSONObject(); + + try { + fallbackJsonError.put("errorMessage", + "An error occurred while processing the error: " + e.getMessage()); + fallbackJsonError.put("status", "fail"); + fallbackJsonArray.put(fallbackJsonError); + + // Send as response or store in session if JSP forward is + // required + request.getSession().setAttribute("expiredContractsJson", fallbackJsonArray); + logDetService.addLogDet(usrId, usrIPAddr, "AN ERROR OCCURRED WHILE PROCESSING THE ERROR VIA" + + " MESSAGE NOTIFICATION: " + e.getMessage().toUpperCase() + " IN EXPIRED CONTRACT"); + request.getRequestDispatcher("expd_cont_det_display_msg.jsp").forward(request, response); + + } catch (JSONException jsonException) { + // In case of another error, log it and send a plain error + // response + jsonException.printStackTrace(); + response.setContentType("application/json"); + logDetService.addLogDet(usrId, usrIPAddr, + "CRITICAL ERROR OCCURRED VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT"); + response.getWriter().write("{\"errorMessage\":\"Critical error occurred.\", \"status\":\"fail\"}"); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExtBillDetServlet.java b/src/main/java/com/cont_mgmt/servlet/ExtBillDetServlet.java new file mode 100644 index 0000000..7d9f9e2 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExtBillDetServlet.java @@ -0,0 +1,167 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.service.ExtBillDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class ExtBillDetServlet + */ +@WebServlet("/ExtBillDetServlet") +@MultipartConfig +public class ExtBillDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the ExtBillDetService + private ExtBillDetService extBillDetService = new ExtBillDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String extContNum = stringUtils.safeParam(request, "hid_ext_cont_num"); + String extVendName = stringUtils.safeParam(request, "hid_ext_vend_name"); + String extInvoiceBillTypeParam = stringUtils.safeParam(request, "hid_ext_invoice_bill_type").toUpperCase(); + String extInvoiceBillingPeriod = stringUtils.safeParam(request, "ext_invoice_bill_period").toUpperCase(); + String extInvoiceStartDate = stringUtils.safeParam(request, "ext_invoice_start_date"); + String extInvoiceEndDate = stringUtils.safeParam(request, "ext_invoice_end_date"); + String extInvoiceBilledDate = stringUtils.safeParam(request, "ext_invoice_billed_date"); + String reqInvoiceAmt = stringUtils.safeParam(request, "ext_invoice_amt"); + double extInvoiceAmt = reqInvoiceAmt != null ? Double.parseDouble(reqInvoiceAmt) : 0.0; + double extContAmt = Double.parseDouble(request.getParameter("hid_ext_cont_amt")); + String extCGSTAmt = stringUtils.safeParam(request, "ext_cgst_amt"); + String extSGSTAmt = stringUtils.safeParam(request, "ext_sgst_amt"); + String extIGSTAmt = stringUtils.safeParam(request, "ext_igst_amt"); + String extITTaxAmt = stringUtils.safeParam(request, "ext_it_tax_amt"); + Integer extUsrId = Integer.parseInt(request.getParameter("hid_ext_usr_id")); + Part extBillFilePart = request.getPart("ext_bill_file"); + Part extInvoiceFilePart = request.getPart("ext_invoice_file"); + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String extBasePath = request.getServletContext().getRealPath("/").trim(); + String reqPercent = stringUtils.safeParam(request, "ext_percent"); + Double extPercent = (reqPercent != null && !reqPercent.isEmpty()) ? Double.parseDouble(reqPercent) : 0.0; + String reqSNARetAmt = stringUtils.safeParam(request, "ext_sna_ret_amt"); + Double extSNARetAmt = (reqSNARetAmt != null && !reqSNARetAmt.trim().isEmpty()) + ? Double.parseDouble(reqSNARetAmt) + : 0.0; + + String firstCharOfInvoiceBillType; + // Extract the first character of each string as a substring + if (extInvoiceBillTypeParam.equals("ONE SHOT PAYMENT")) { + firstCharOfInvoiceBillType = "S"; + } else { + firstCharOfInvoiceBillType = extInvoiceBillTypeParam.substring(0, 1); + } + // Split the billing period if it's a range (e.g., Q1-Q4) + String[] periodParts = extInvoiceBillingPeriod.split("-"); + + // Flag to check if all parts match the bill type + boolean allPartsMatch = true; + for (String part : periodParts) { + if (part.length() == 0 || !part.substring(0, 1).equals(firstCharOfInvoiceBillType)) { + allPartsMatch = false; + break; + } + } + + // Validate + if (!allPartsMatch) { + handleError("Extension bill period doesn't match with " + "extension invoice bill type.", extUsrId, + extUsrIPAddr, request, response); + return; // Stop further processing if invalid + } + + int extInvoiceId = 0; + try { + extInvoiceId = extBillDetService.addExtBillDet(extContNum, extInvoiceBillingPeriod, extInvoiceStartDate, + extInvoiceEndDate, extInvoiceAmt, extContAmt, extCGSTAmt, extSGSTAmt, extIGSTAmt, extITTaxAmt, + extBillFilePart, extInvoiceFilePart, extVendName, extUsrId, extBasePath, extInvoiceBilledDate, + extPercent, extSNARetAmt); + if (extInvoiceId >= 1) { + handleBillSuccess(extInvoiceId, extUsrId, extUsrIPAddr, request, response); + } else if (extInvoiceId == -1) { + handleError("Failed to add Extension Bill. Please try again.", extUsrId, extUsrIPAddr, request, + response); + } + } catch (SQLException | ClassNotFoundException | NullPointerException | IllegalArgumentException e) { + e.printStackTrace(); + handleException(e, extInvoiceId, extUsrId, extUsrIPAddr, request, response); + } + + } + + private void handleBillSuccess(int extInvoiceId, Integer extUsrId, String extUsrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ClassNotFoundException, SQLException, ServletException, IOException { + // TODO Auto-generated method stub + Bill isBillFetched = extBillDetService.getExtBillDet(extInvoiceId); + if (isBillFetched != null) { + request.setAttribute("invoiceBillPeriod", isBillFetched.getInvoiceBillingPeriod()); + request.setAttribute("invoiceStartDate", isBillFetched.getInvoiceStartDate()); + request.setAttribute("invoiceEndDate", isBillFetched.getInvoiceEndDate()); + request.setAttribute("billSettled", isBillFetched.getAmtPaid()); + request.setAttribute("totalAmountBeforeTax", isBillFetched.getAmtExclTax()); + request.setAttribute("cgstAmt", isBillFetched.getCgstAmt()); + request.setAttribute("sgstAmt", isBillFetched.getSgstAmt()); + request.setAttribute("igstAmt", isBillFetched.getIgstAmt()); + request.setAttribute("totAmt", isBillFetched.getTotAmt()); + request.setAttribute("billToBeClaimed", isBillFetched.getAmtDue()); + request.setAttribute("invoiceBillDate", isBillFetched.getInvoiceBillDate()); + request.setAttribute("itTaxAmt", isBillFetched.getItTaxAmt()); + request.setAttribute("snaRetAmt", isBillFetched.getSnaRetAmt()); + logDetService.addLogDet(extUsrId, extUsrIPAddr, "EXTENSION BILL ADDED SUCCESSFULLY"); + request.getRequestDispatcher("ext_bill_res_display.jsp").forward(request, response); + } + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + request.setAttribute("errorMessage", errorMessage); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + request.getRequestDispatcher("ext_bill_res_display.jsp").forward(request, response); + } + + private void handleException(Exception e, int invoiceId, Integer usrId, String usrIPAddr, + HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + extBillDetService.removeExtBillDetOnError(invoiceId); + String errorMessage = "An error occurred: " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ExtContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/ExtContDetServlet.java new file mode 100644 index 0000000..61fc4c3 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ExtContDetServlet.java @@ -0,0 +1,113 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExtContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class ExtContDetServlet + */ +@WebServlet("/ExtContDetServlet") +@MultipartConfig +public class ExtContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the ExtContDetService + private ExtContDetService extContDetService = new ExtContDetService(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + boolean res; + String existVendName = stringUtils.safeParam(request, "hid_vend_name"); + String extContStartDate = stringUtils.safeParam(request, "ext_cont_start_date"); + String extContEndDate = stringUtils.safeParam(request, "ext_cont_end_date"); + Double extContAmt = Double.parseDouble(request.getParameter("ext_cont_amt")); + String existContNum = stringUtils.safeParam(request, "exist_cont_num"); + Part extWOFilePart = request.getPart("ext_cont_wo_file"); + Part extASFilePart = request.getPart("ext_cont_as_file"); + Part extAgreeFilePart = request.getPart("ext_cont_agree_file"); + Integer extInvoiceBillTypeId = Integer.parseInt(request.getParameter("ext_invoice_bill_type")); + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String basePath = request.getServletContext().getRealPath("/").trim(); + + try { + res = extContDetService.addExtContDet(extContStartDate, extContEndDate, extContAmt, existContNum, usrId, + basePath, extASFilePart, extWOFilePart, existVendName, extAgreeFilePart, extInvoiceBillTypeId); + if (res) { + handleSuccessfulContract(request, response, existContNum, usrId, usrIPAddr); + } else { + handleFailedContract(request, response, usrId, usrIPAddr); + } + } catch (SQLException | ClassNotFoundException | IOException e) { + handleException(request, response, existContNum, e, usrId, usrIPAddr); + } + } + + private void handleFailedContract(HttpServletRequest request, HttpServletResponse response, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + // TODO Auto-generated method stub + request.setAttribute("errorMessage", "Failed to extend contract. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "FAILED TO EXTEND CONTRACT"); + request.getRequestDispatcher("ext_cont_res_display.jsp").forward(request, response); + } + + private void handleSuccessfulContract(HttpServletRequest request, HttpServletResponse response, String existContNum, + Integer usrId, String usrIPAddr) + throws ServletException, IOException, ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + Contract isExtContFetched = extContDetService.getExtContDet(existContNum); + String usrOpr; + if (isExtContFetched != null) { + usrOpr = "CONTRACT EXTENDED SUCCESSFULLY"; + request.setAttribute("extContNum", isExtContFetched.getContNum()); + request.setAttribute("extContStartDate", isExtContFetched.getContStartDate()); + request.setAttribute("extContEndDate", isExtContFetched.getContEndDate()); + request.setAttribute("extContAmt", isExtContFetched.getContAmt()); + } else { + usrOpr = "FAILED TO EXTEND THE CONTRACT"; + request.setAttribute("errorMessage", "Failed to fetch extended contract details."); + } + + logDetService.addLogDet(usrId, usrIPAddr, usrOpr); + request.getRequestDispatcher("ext_cont_res_display.jsp").forward(request, response); + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, String existContNum, + Exception e, Integer usrId, String usrIPAddr) throws ServletException, IOException { + // TODO Auto-generated method stub + e.printStackTrace(); + this.extContDetService.removeExtContDetOnError(existContNum); + request.setAttribute("errorMessage", "An error occurred: " + e.getMessage()); + this.logDetService.addLogDet(usrId, usrIPAddr, e.getMessage().toUpperCase()); + request.getRequestDispatcher("ext_cont_res_display.jsp").forward(request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ModifyBillStatServlet.java b/src/main/java/com/cont_mgmt/servlet/ModifyBillStatServlet.java new file mode 100644 index 0000000..c6a2f6b --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ModifyBillStatServlet.java @@ -0,0 +1,110 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.ModifyBillStatService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class ModifyBillStatServlet + */ +@WebServlet("/ModifyBillStatServlet") +@MultipartConfig +public class ModifyBillStatServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ModifyBillStatService + private ModifyBillStatService modifyBillStatService = new ModifyBillStatService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Get form values + String contNum = stringUtils.safeParam(request, "hid_cont_num"); + String invoiceBillPeriodParam = stringUtils.safeParam(request, "invoice_bill_period"); + Part rtgsFilePart = request.getPart("rtgs_file"); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + String invoiceBillPeriod = null; + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + String basePath = request.getServletContext().getRealPath("/").trim(); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + String alertMessage = ""; + boolean flag = false; + + if (invoiceBillPeriodParam != null && !invoiceBillPeriodParam.equals("0")) { + // Proceed with processing the invoice bill period value + invoiceBillPeriod = invoiceBillPeriodParam.trim(); // Now safe to + // use + // Continue with logic + } else { + // Handle the error if the invoice bill period is not selected or is + // invalid + logDetService.addLogDet(usrId, usrIPAddr, "INVALID BILL PERIOD CHOSEN"); + response.getWriter().write(stringUtils.buildFailureResponse("Please select a valid invoice bill period.")); + } + + if (rtgsFilePart == null || rtgsFilePart.getSize() <= 0) { + // Handle the error if the invoice bill period is not selected or is + // invalid + logDetService.addLogDet(usrId, usrIPAddr, "INVOICE BILL STATUS NOT UPDATED"); + response.getWriter().write(stringUtils.buildFailureResponse("Please Upload RGST File.")); + } + + try { + flag = modifyBillStatService.updateBillStat(contNum, invoiceBillPeriod, rtgsFilePart, usrId, vendName, + basePath); + if (flag) { + alertMessage = "Invoice Bill Status for ITC No " + contNum + " and bill period " + invoiceBillPeriod + + " updated successfully."; + logDetService.addLogDet(usrId, usrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildSuccessResponse(alertMessage)); + } else { + alertMessage = "Failed to update invoice bill status for ITC No " + contNum + " and bill period " + + invoiceBillPeriod; + logDetService.addLogDet(usrId, usrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildFailureResponse(alertMessage)); + } + } catch (SQLException | ClassNotFoundException | NullPointerException | IOException e) { + String errorMessage = e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + response.getWriter() + .write(stringUtils.buildFailureResponse("Failed to update invoice bill status for ITC No " + contNum + + " and bill period " + invoiceBillPeriod + ".\\nError: " + errorMessage)); + } + + } +} diff --git a/src/main/java/com/cont_mgmt/servlet/ModifyExtBillStatServlet.java b/src/main/java/com/cont_mgmt/servlet/ModifyExtBillStatServlet.java new file mode 100644 index 0000000..742ccce --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ModifyExtBillStatServlet.java @@ -0,0 +1,110 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.ModifyExtBillStatService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class ModifyExtBillStatServlet + */ +@WebServlet("/ModifyExtBillStatServlet") +@MultipartConfig +public class ModifyExtBillStatServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the ModifyExtBillStatService + private ModifyExtBillStatService modifyExtBillStatService = new ModifyExtBillStatService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Get form values + String extContNum = stringUtils.safeParam(request, "hid_ext_cont_num"); + String extInvoiceBillPeriodParam = stringUtils.safeParam(request, "ext_invoice_bill_period"); + Part extRTGSFilePart = request.getPart("ext_rtgs_file"); + String extVendName = stringUtils.safeParam(request, "hid_ext_vend_name"); + String extInvoiceBillPeriod = null; + Integer extUsrId = Integer.parseInt(request.getParameter("hid_ext_usr_id")); + String extBsePath = request.getServletContext().getRealPath("/").trim(); + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + String alertMessage = ""; + boolean flag = false; + + if (extInvoiceBillPeriodParam != null && !extInvoiceBillPeriodParam.equals("0")) { + // Proceed with processing the invoice bill period value + extInvoiceBillPeriod = extInvoiceBillPeriodParam.trim(); // Now safe to + // use + // Continue with logic + } else { + // Handle the error if the invoice bill period is not selected or is + // invalid + logDetService.addLogDet(extUsrId, extUsrIPAddr, "INVALID EXTENSION BILL PERIOD CHOSEN"); + response.getWriter() + .write(stringUtils.buildFailureResponse("Please select a valid extension invoice bill period.")); + } + + if (extRTGSFilePart == null || extRTGSFilePart.getSize() <= 0) { + // Handle the error if the invoice bill period is not selected or is + // invalid + logDetService.addLogDet(extUsrId, extUsrIPAddr, "EXTENSION INVOICE BILL STATUS NOT UPDATED"); + response.getWriter().write(stringUtils.buildFailureResponse("Please Upload Extension RGST File.")); + } + + try { + flag = modifyExtBillStatService.updateBillStat(extContNum, extInvoiceBillPeriod, extRTGSFilePart, extUsrId, + extVendName, extBsePath); + if (flag) { + alertMessage = "Extension Invoice Bill Status for ITC No " + extContNum + " and bill period " + + extInvoiceBillPeriod + " updated successfully."; + logDetService.addLogDet(extUsrId, extUsrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildSuccessResponse(alertMessage)); + } else { + alertMessage = "Failed to update extension invoice bill status for ITC No " + extContNum + + " and bill period " + extInvoiceBillPeriod; + logDetService.addLogDet(extUsrId, extUsrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildFailureResponse(alertMessage)); + } + } catch (SQLException | ClassNotFoundException | NullPointerException | IOException e) { + String errorMessage = e.getMessage(); + logDetService.addLogDet(extUsrId, extUsrIPAddr, errorMessage.toUpperCase()); + response.getWriter().write( + stringUtils.buildFailureResponse("Failed to update extension " + "invoice bill status for ITC No " + + extContNum + " and bill period " + extInvoiceBillPeriod + ".\\nError: " + errorMessage)); + } + } +} diff --git a/src/main/java/com/cont_mgmt/servlet/NewBillDetServlet.java b/src/main/java/com/cont_mgmt/servlet/NewBillDetServlet.java new file mode 100644 index 0000000..1357f18 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/NewBillDetServlet.java @@ -0,0 +1,163 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Bill; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewBillDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class NewBillDetServlet + */ +@WebServlet("/NewBillDetServlet") +@MultipartConfig +public class NewBillDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NewBillDetService + private NewBillDetService newBillDetService = new NewBillDetService(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String contNum = stringUtils.safeParam(request, "hid_cont_num"); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + String invoiceBillTypeParam = stringUtils.safeParam(request, "hid_invoice_bill_type").toUpperCase(); + String invoiceBillingPeriod = stringUtils.safeParam(request, "invoice_bill_period").toUpperCase(); + String invoiceStartDate = stringUtils.safeParam(request, "invoice_start_date"); + String invoiceEndDate = stringUtils.safeParam(request, "invoice_end_date"); + String invoiceBilledDate = stringUtils.safeParam(request, "invoice_billed_date"); + String reqInvoiceAmt = stringUtils.safeParam(request, "invoice_amt"); + double invoiceAmt = reqInvoiceAmt != null ? Double.parseDouble(reqInvoiceAmt) : 0.0; + double contAmt = Double.parseDouble(request.getParameter("hid_cont_amt")); + String cgstAmt = stringUtils.safeParam(request, "cgst_amt"); + String sgstAmt = stringUtils.safeParam(request, "sgst_amt"); + String igstAmt = stringUtils.safeParam(request, "igst_amt"); + String itTaxAmt = stringUtils.safeParam(request, "it_tax_amt"); + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + Part billFilePart = request.getPart("bill_file"); + Part invoiceFilePart = request.getPart("invoice_file"); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String basePath = request.getServletContext().getRealPath("/").trim(); + String reqPercent = stringUtils.safeParam(request, "percent"); + Double percent = (reqPercent != null && !reqPercent.trim().isEmpty()) ? Double.parseDouble(reqPercent) : 0.0; + String reqSNARetAmt = stringUtils.safeParam(request, "sna_ret_amt"); + Double snaRetAmt = (reqSNARetAmt != null && !reqSNARetAmt.trim().isEmpty()) ? Double.parseDouble(reqSNARetAmt) + : 0.0; + + String firstCharOfInvoiceBillType; + // Extract the first character of each string as a substring + if (invoiceBillTypeParam.equals("ONE SHOT PAYMENT")) { + firstCharOfInvoiceBillType = "S"; + } else { + firstCharOfInvoiceBillType = invoiceBillTypeParam.substring(0, 1); + } + // Split the billing period if it's a range (e.g., Q1-Q4) + String[] periodParts = invoiceBillingPeriod.split("-"); + + // Flag to check if all parts match the bill type + boolean allPartsMatch = true; + for (String part : periodParts) { + if (part.length() == 0 || !part.substring(0, 1).equals(firstCharOfInvoiceBillType)) { + allPartsMatch = false; + break; + } + } + + // Validate + if (!allPartsMatch) { + handleError("Bill period doesn't match with invoice bill type.", usrId, usrIPAddr, request, response); + return; // Stop further processing if invalid + } + + int invoiceId = 0; + try { + + invoiceId = newBillDetService.addBillDet(contNum, invoiceBillingPeriod, invoiceStartDate, invoiceEndDate, + invoiceAmt, contAmt, cgstAmt, sgstAmt, igstAmt, itTaxAmt, billFilePart, invoiceFilePart, vendName, + usrId, basePath, invoiceBilledDate, percent, snaRetAmt); + if (invoiceId >= 1) { + handleBillSuccess(invoiceId, usrId, usrIPAddr, request, response); + } else if (invoiceId == -1) { + handleError("Failed to add Bill. Please try again.", usrId, usrIPAddr, request, response); + } + } catch (SQLException | ClassNotFoundException | NullPointerException | IllegalArgumentException e) { + e.printStackTrace(); + handleException(e, invoiceId, usrId, usrIPAddr, request, response); + } + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + request.setAttribute("errorMessage", errorMessage); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + request.getRequestDispatcher("new_bill_res_display.jsp").forward(request, response); + } + + private void handleBillSuccess(int invoiceId, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ClassNotFoundException, SQLException, ServletException, IOException { + // TODO Auto-generated method stub + Bill isBillFetched = newBillDetService.getBillDet(invoiceId); + if (isBillFetched != null) { + request.setAttribute("invoiceBillPeriod", isBillFetched.getInvoiceBillingPeriod()); + request.setAttribute("invoiceStartDate", isBillFetched.getInvoiceStartDate()); + request.setAttribute("invoiceEndDate", isBillFetched.getInvoiceEndDate()); + request.setAttribute("billSettled", isBillFetched.getAmtPaid()); + request.setAttribute("totalAmountBeforeTax", isBillFetched.getAmtExclTax()); + request.setAttribute("cgstAmt", isBillFetched.getCgstAmt()); + request.setAttribute("sgstAmt", isBillFetched.getSgstAmt()); + request.setAttribute("igstAmt", isBillFetched.getIgstAmt()); + request.setAttribute("totAmt", isBillFetched.getTotAmt()); + request.setAttribute("billToBeClaimed", isBillFetched.getAmtDue()); + request.setAttribute("invoiceBillDate", isBillFetched.getInvoiceBillDate()); + request.setAttribute("itTaxAmt", isBillFetched.getItTaxAmt()); + request.setAttribute("snaRetAmt", isBillFetched.getSnaRetAmt()); + logDetService.addLogDet(usrId, usrIPAddr, "BILL ADDED SUCCESSFULLY"); + request.getRequestDispatcher("new_bill_res_display.jsp").forward(request, response); + } + } + + private void handleException(Exception e, int invoiceId, Integer usrId, String usrIPAddr, + HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + newBillDetService.removeBillDetOnError(invoiceId); + String errorMessage = "An error occurred: " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/NewContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/NewContDetServlet.java new file mode 100644 index 0000000..abea2a1 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/NewContDetServlet.java @@ -0,0 +1,134 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewContDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class NewContDetServlet + */ +@WebServlet("/NewContDetServlet") +@MultipartConfig +public class NewContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + + // Call NewContDetService + private NewContDetService newContDetService = new NewContDetService(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Get form parameters + String contNum = ""; + String reqContNum = stringUtils.safeParam(request, "cont_num").toUpperCase(); + String contStartDate = stringUtils.safeParam(request, "cont_start_date"); + String contEndDate = stringUtils.safeParam(request, "cont_end_date"); + Integer vendId = Integer.parseInt(request.getParameter("hid_vend_id")); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + String workDesc = stringUtils.safeParam(request, "work_desc"); + Integer invoiceBillTypeId = Integer.parseInt(request.getParameter("invoice_bill_type")); + Part loaFilePart = request.getPart("cont_loa_file"); + Part asFilePart = request.getPart("cont_as_file"); + Part agreeFilePart = request.getPart("cont_agree_file"); + Part woFilePart = request.getPart("cont_wo_file"); + String reqContAmt = stringUtils.safeParam(request, "cont_amt"); + String reqEMDAmt = stringUtils.safeParam(request, "emd_amt"); + Double emdAmt = (reqEMDAmt != null && !reqEMDAmt.trim().isEmpty()) ? Double.parseDouble(reqEMDAmt) : 0.0; + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String basePath = request.getServletContext().getRealPath("/").trim(); + String contRmrk = stringUtils.safeParam(request, "cont_rmrk"); + + try { + contNum = newContDetService.addContDet(reqContNum, contStartDate, contEndDate, vendId, invoiceBillTypeId, + workDesc, reqContAmt, emdAmt, loaFilePart, asFilePart, woFilePart, agreeFilePart, vendName, usrId, + basePath, contRmrk); + + if (contNum != null && !contNum.trim().isEmpty()) { + handleSuccessfulContract(request, response, contNum, usrId, usrIPAddr); + } else { + handleFailedContract(request, response, usrId, usrIPAddr); + } + } catch (SQLException | ClassNotFoundException | IOException e) { + handleException(request, response, contNum, e, usrId, usrIPAddr); + } + + } + + private void handleSuccessfulContract(HttpServletRequest request, HttpServletResponse response, String contNum, + Integer usrId, String usrIPAddr) + throws ServletException, IOException, ClassNotFoundException, SQLException { + Contract isContFetched = newContDetService.getContDet(contNum); + String usrOpr; + + if (isContFetched != null) { + usrOpr = "CONTRACT ADDED SUCCESSFULLY"; + request.setAttribute("contNum", isContFetched.getContNum()); + request.setAttribute("contStartDate", isContFetched.getContStartDate()); + request.setAttribute("contEndDate", isContFetched.getContEndDate()); + request.setAttribute("invoiceBillTypeName", isContFetched.getInvoiceBillTypeName()); + request.setAttribute("contAmt", isContFetched.getContAmt()); + request.setAttribute("workDesc", isContFetched.getWorkDesc()); + request.setAttribute("emdAmt", isContFetched.getEmdAmt()); + } else { + usrOpr = "FAILED TO ADD CONTRACT"; + request.setAttribute("errorMessage", "Failed to fetch contract details."); + } + + logDetService.addLogDet(usrId, usrIPAddr, usrOpr); + request.getRequestDispatcher("new_cont_res_display.jsp").forward(request, response); + } + + private void handleFailedContract(HttpServletRequest request, HttpServletResponse response, Integer usrId, + String usrIPAddr) throws ServletException, IOException { + request.setAttribute("errorMessage", "Failed to add contract. Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "FAILED TO ADD CONTRACT"); + request.getRequestDispatcher("new_cont_res_display.jsp").forward(request, response); + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, String contNum, Exception e, + Integer usrId, String usrIPAddr) throws ServletException, IOException { + e.printStackTrace(); + newContDetService.removeContDetOnError(contNum); + request.setAttribute("errorMessage", "An error occurred: " + e.getMessage()); + logDetService.addLogDet(usrId, usrIPAddr, e.getMessage().toUpperCase()); + request.getRequestDispatcher("new_cont_res_display.jsp").forward(request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/NewVendDetServlet.java b/src/main/java/com/cont_mgmt/servlet/NewVendDetServlet.java new file mode 100644 index 0000000..d4ecaf9 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/NewVendDetServlet.java @@ -0,0 +1,136 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Vendor; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewVendDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class NewVendDetServlet + */ +@WebServlet("/NewVendDetServlet") +public class NewVendDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the VendDetService + private NewVendDetService newVendDetService = new NewVendDetService(); + + // Call the LogDetService to enter log details + private LogDetService logDetService = new LogDetService(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Get form parameters + String vendName = stringUtils.safeParam(request, "vend_name").toUpperCase(); + String gstNum = stringUtils.safeParam(request, "vend_gst_num").toUpperCase(); + String panNum = stringUtils.safeParam(request, "vend_pan_num").toUpperCase(); + String prodCatParam = stringUtils.safeParam(request, "vend_prod_cat"); + String telNum1 = stringUtils.safeParam(request, "vend_tel_num_1"); + String telNum2 = stringUtils.safeParam(request, "vend_tel_num_2"); + String emailId = stringUtils.safeParam(request, "vend_email_id"); + String vendAddr1 = stringUtils.safeParam(request, "vend_addr_1"); + String vendAddr2 = stringUtils.safeParam(request, "vend_addr_2"); + String vendCountry = stringUtils.safeParam(request, "vend_country"); + String vendPincode = stringUtils.safeParam(request, "vend_pincode"); + String vendStateParam = stringUtils.safeParam(request, "vend_state"); + String vendCityParam = stringUtils.safeParam(request, "vend_city"); + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String basePath = request.getServletContext().getRealPath("/").trim(); + vendName = vendName.replace("/", "-"); + + Integer prodCatId = null; + String vendState = null; + String vendCity = null; + + if (prodCatParam != null && !prodCatParam.equals("0")) { + prodCatId = Integer.parseInt(prodCatParam); + } else { + handleError("Please select a valid Product Category.", usrId, usrIPAddr, request, response); + return; // Stop further processing if invalid + } + + if (vendStateParam != null && !vendStateParam.equals("0")) { + // Proceed with processing the state value + vendState = vendStateParam.trim(); // Now safe to use + // Continue with your logic + } else { + // Handle the error if the state is not selected or is invalid + handleError("Please select a valid State.", usrId, usrIPAddr, request, response); + return; // Stop further processing if invalid + } + + if (vendCityParam != null && !vendCityParam.equals("0")) { + // Proceed with processing the city value + vendCity = vendCityParam.trim(); // Now safe to use + // Continue with your logic + } else { + // Handle the error if the city is not selected or is invalid + handleError("Please select a valid City.", usrId, usrIPAddr, request, response); + return; // Stop further processing if invalid + } + + int vendId = 0; + try { + vendId = newVendDetService.addVendDet(vendName, vendAddr1, vendAddr2, vendCountry, vendState, vendCity, + vendPincode, gstNum, panNum, prodCatId, telNum1, telNum2, emailId, usrId, basePath); + + if (vendId >= 1) { + handleVendorSuccess(vendId, usrId, usrIPAddr, request, response); + } else if (vendId == -1) { + handleError("Failed to add contractor. Please try again.", usrId, usrIPAddr, request, response); + } + } catch (SQLException | ClassNotFoundException | NullPointerException e) { + e.printStackTrace(); + handleException(e, vendId, usrId, usrIPAddr, request, response); + } + } + + private void handleVendorSuccess(int vendId, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException { + Vendor isVendFetched = newVendDetService.getVendDet(vendId); + if (isVendFetched != null) { + request.setAttribute("vendId", String.valueOf(vendId)); + request.setAttribute("vendName", isVendFetched.getVendName()); + logDetService.addLogDet(usrId, usrIPAddr, "CONTRACTOR ADDED SUCCESSFULLY"); + request.getRequestDispatcher("new_vend_res_display.jsp").forward(request, response); + } + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + request.setAttribute("errorMessage", errorMessage); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + request.getRequestDispatcher("new_vend_res_display.jsp").forward(request, response); + } + + private void handleException(Exception e, int vendId, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + newVendDetService.removeVendDetOnError(vendId); + String errorMessage = "An error occurred: " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/UpdContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/UpdContDetServlet.java new file mode 100644 index 0000000..cbe9a62 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/UpdContDetServlet.java @@ -0,0 +1,138 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.NewContDetService; +import com.cont_mgmt.service.UpdContDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class UpdContDetServlet + */ +@WebServlet("/UpdContDetServlet") +@MultipartConfig +public class UpdContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call UpdContDetService + private UpdContDetService updContDetService = new UpdContDetService(); + + // Call NewContDetService + private NewContDetService newContDetService = new NewContDetService(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String newContNum = ""; + String contNum = stringUtils.safeParam(request, "cont_num").toUpperCase(); + String contStartDate = stringUtils.safeParam(request, "cont_start_date"); + String contEndDate = stringUtils.safeParam(request, "cont_end_date"); + Integer vendId = Integer.parseInt(request.getParameter("hid_vend_id")); + String vendName = stringUtils.safeParam(request, "hid_vend_name"); + Part loaFilePart = request.getPart("cont_loa_file"); + Part asFilePart = request.getPart("cont_as_file"); + Part agreeFilePart = request.getPart("cont_agree_file"); + Part woFilePart = request.getPart("cont_wo_file"); + Part emdFilePart = request.getPart("cont_emd_file"); + Double contAmt = Double.parseDouble(request.getParameter("cont_amt")); + Double sdAmt = Double.parseDouble(request.getParameter("sd_amt")); + String asdAmt = stringUtils.safeParam(request, "asd_amt"); + Integer invoiceBillTypeId = Integer.parseInt(request.getParameter("invoice_bill_type")); + String emdAmtRfd = stringUtils.safeParam(request, "emd_amt_rfd"); + String workDesc = stringUtils.safeParam(request, "work_desc"); + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String basePath = request.getServletContext().getRealPath("/").trim(); + + try { + newContNum = updContDetService.updContDet(contNum, contStartDate, contEndDate, vendId, invoiceBillTypeId, + workDesc, contAmt, sdAmt, asdAmt, emdAmtRfd, loaFilePart, asFilePart, woFilePart, agreeFilePart, + emdFilePart, usrId, basePath, vendName); + + if (newContNum != null && !newContNum.trim().isEmpty()) { + handleSuccessfulContract(request, response, newContNum, usrId, usrIPAddr); + } else { + handleFailedContract(request, response, usrId, usrIPAddr, newContNum); + } + } catch (SQLException | ClassNotFoundException | IOException e) { + handleException(request, response, newContNum, e, usrId, usrIPAddr); + } + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, String contNum, Exception e, + Integer usrId, String usrIPAddr) throws ServletException, IOException { + // TODO Auto-generated method stub + String errorMessage = "An error occurred while updating ITC NO: " + contNum + " " + e.getMessage(); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + handleError(errorMessage, usrId, usrIPAddr, request, response); + } + + private void handleError(String errorMessage, Integer usrId, String usrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + request.setAttribute("errorMessage", errorMessage); + logDetService.addLogDet(usrId, usrIPAddr, errorMessage.toUpperCase()); + request.getRequestDispatcher("upd_cont_res_display.jsp").forward(request, response); + } + + private void handleFailedContract(HttpServletRequest request, HttpServletResponse response, Integer usrId, + String usrIPAddr, String newContNum) throws ServletException, IOException { + // TODO Auto-generated method stub + request.setAttribute("errorMessage", "Failed to update contract " + newContNum + ". Please try again."); + logDetService.addLogDet(usrId, usrIPAddr, "FAILED TO UPDATE CONTRACT " + newContNum); + request.getRequestDispatcher("upd_cont_res_display.jsp").forward(request, response); + } + + private void handleSuccessfulContract(HttpServletRequest request, HttpServletResponse response, String contNum, + Integer usrId, String usrIPAddr) + throws ServletException, IOException, ClassNotFoundException, SQLException { + // TODO Auto-generated method stub + Contract isContFetched = newContDetService.getContDet(contNum); + String usrOpr; + + if (isContFetched != null) { + usrOpr = "CONTRACT " + contNum + "UPDATED SUCCESSFULLY"; + request.setAttribute("contNum", isContFetched.getContNum()); + request.setAttribute("contStartDate", isContFetched.getContStartDate()); + request.setAttribute("contEndDate", isContFetched.getContEndDate()); + request.setAttribute("invoiceBillTypeName", isContFetched.getInvoiceBillTypeName()); + request.setAttribute("contAmt", isContFetched.getContAmt()); + request.setAttribute("workDesc", isContFetched.getWorkDesc()); + request.setAttribute("emdAmt", isContFetched.getEmdAmt()); + request.setAttribute("sdAmt", isContFetched.getSdAmt()); + request.setAttribute("asdAmt", isContFetched.getAsdAmt()); + } else { + usrOpr = "FAILED TO UPDATE CONTRACT " + contNum; + request.setAttribute("errorMessage", "Failed to update contract " + contNum + "."); + } + + logDetService.addLogDet(usrId, usrIPAddr, usrOpr.toUpperCase()); + request.getRequestDispatcher("upd_cont_res_display.jsp").forward(request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/UpdContRmrkServlet.java b/src/main/java/com/cont_mgmt/servlet/UpdContRmrkServlet.java new file mode 100644 index 0000000..5db1408 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/UpdContRmrkServlet.java @@ -0,0 +1,78 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.UpdContRmrkService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class UpdContRmrkServlet + */ +@WebServlet("/UpdContRmrkServlet") +public class UpdContRmrkServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the UpdContRmrkService + private UpdContRmrkService updContRmrkService = new UpdContRmrkService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String contNum = stringUtils.safeParam(request, "cont_num"); + Integer usrId = Integer.parseInt(request.getParameter("hid_usr_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String contRmrk = stringUtils.safeParam(request, "cont_rmrk"); + boolean flag = false; + String alertMessage = ""; + + try { + flag = updContRmrkService.updContRmrk(contRmrk, contNum, usrId); + if (flag) { + alertMessage = "Contract Remarks Updated for ITC No " + contNum + " successfully."; + logDetService.addLogDet(usrId, usrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildSuccessResponse(alertMessage)); + } else { + alertMessage = "Contract Remarks Not Updated for ITC No " + contNum; + logDetService.addLogDet(usrId, usrIPAddr, alertMessage.toUpperCase()); + response.getWriter().write(stringUtils.buildFailureResponse(alertMessage)); + } + } catch (SQLException | ClassNotFoundException | NullPointerException e) { + e.printStackTrace(); + logDetService.addLogDet(usrId, usrIPAddr, e.getMessage().toUpperCase()); + response.getWriter().write(stringUtils.buildFailureResponse( + "Failed to update the contract remarks for ITC No " + contNum + ".\\nError: " + e.getMessage())); + } + } +} diff --git a/src/main/java/com/cont_mgmt/servlet/UpdExtContDetServlet.java b/src/main/java/com/cont_mgmt/servlet/UpdExtContDetServlet.java new file mode 100644 index 0000000..825b5ee --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/UpdExtContDetServlet.java @@ -0,0 +1,142 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; + +import com.cont_mgmt.dto.Contract; +import com.cont_mgmt.service.ExtContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.UpdExtContDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; + +/** + * Servlet implementation class UpdExtContDetServlet + */ +@WebServlet("/UpdExtContDetServlet") +@MultipartConfig +public class UpdExtContDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call UpdExtContDetService + private UpdExtContDetService updExtContDetService = new UpdExtContDetService(); + + // Call the ExtContDetService + private ExtContDetService extContDetService = new ExtContDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String extNewContNum = ""; + String extVendName = stringUtils.safeParam(request, "hid_ext_vend_name"); + String extContNum = stringUtils.safeParam(request, "ext_cont_num").toUpperCase(); + String extContStartDate = stringUtils.safeParam(request, "ext_cont_start_date"); + String extContEndDate = stringUtils.safeParam(request, "ext_cont_end_date"); + Part extASFilePart = request.getPart("ext_cont_as_file"); + Part extAgreeFilePart = request.getPart("ext_cont_agree_file"); + Part extWOFilePart = request.getPart("ext_cont_wo_file"); + Double extContAmt = Double.parseDouble(request.getParameter("ext_cont_amt")); + Integer extInvoiceBillTypeId = Integer.parseInt(request.getParameter("ext_invoice_bill_type")); + Integer extUsrId = Integer.parseInt(request.getParameter("hid_ext_usr_id")); + String extUsrIPAddr = networkUtils.getClientIpAddr(request).trim(); + String extBasePath = request.getServletContext().getRealPath("/").trim(); + Integer extVendId = Integer.parseInt(request.getParameter("hid_ext_vend_id")); + Double extSDAmt = Double.parseDouble(request.getParameter("ext_sd_amt")); + String extASDAmt = stringUtils.safeParam(request, "ext_asd_amt"); + + try { + extNewContNum = updExtContDetService.updContDet(extContNum, extContStartDate, extContEndDate, extVendId, + extInvoiceBillTypeId, extContAmt, extASFilePart, extWOFilePart, extAgreeFilePart, extUsrId, + extBasePath, extVendName, extASDAmt, extSDAmt); + + if (extNewContNum != null && !extNewContNum.trim().isEmpty()) { + handleSuccessfulContract(request, response, extNewContNum, extUsrId, extUsrIPAddr); + } else { + handleFailedContract(request, response, extUsrId, extUsrIPAddr, extNewContNum); + } + } catch (SQLException | ClassNotFoundException | IOException e) { + handleException(request, response, extNewContNum, e, extUsrId, extUsrIPAddr); + } + } + + private void handleSuccessfulContract(HttpServletRequest request, HttpServletResponse response, String extContNum, + Integer extUsrId, String extUsrIPAddr) + throws ClassNotFoundException, SQLException, ServletException, IOException { + // TODO Auto-generated method stub + Contract isExtContFetched = extContDetService.getExtContDet(extContNum); + String usrOpr; + + if (isExtContFetched != null) { + usrOpr = "EXTENDED CONTRACT " + extContNum + "UPDATED SUCCESSFULLY"; + request.setAttribute("contNum", isExtContFetched.getContNum()); + request.setAttribute("contStartDate", isExtContFetched.getContStartDate()); + request.setAttribute("contEndDate", isExtContFetched.getContEndDate()); + request.setAttribute("invoiceBillTypeName", isExtContFetched.getInvoiceBillTypeName()); + request.setAttribute("contAmt", isExtContFetched.getContAmt()); + request.setAttribute("sdAmt", isExtContFetched.getSdAmt()); + request.setAttribute("asdAmt", isExtContFetched.getAsdAmt()); + } else { + usrOpr = "FAILED TO UPDATE CONTRACT " + extContNum; + request.setAttribute("errorMessage", "Failed to update contract " + extContNum + "."); + } + + logDetService.addLogDet(extUsrId, extUsrIPAddr, usrOpr.toUpperCase()); + request.getRequestDispatcher("upd_ext_cont_res_display.jsp").forward(request, response); + } + + private void handleFailedContract(HttpServletRequest request, HttpServletResponse response, Integer extUsrId, + String extUsrIPAddr, String extNewContNum) throws ServletException, IOException { + // TODO Auto-generated method stub + request.setAttribute("errorMessage", + "Failed to update extended contract " + extNewContNum + ". Please try again."); + logDetService.addLogDet(extUsrId, extUsrIPAddr, "FAILED TO UPDATE EXTENDED CONTRACT " + extNewContNum); + request.getRequestDispatcher("upd_ext_cont_res_display.jsp").forward(request, response); + } + + private void handleException(HttpServletRequest request, HttpServletResponse response, String extContNum, + Exception e, Integer extUsrId, String extUsrIPAddr) throws ServletException, IOException { + // TODO Auto-generated method stub + String errorMessage = "An error occurred while updating Extended ITC NO: " + extContNum + " " + e.getMessage(); + logDetService.addLogDet(extUsrId, extUsrIPAddr, errorMessage.toUpperCase()); + handleError(errorMessage, extUsrId, extUsrIPAddr, request, response); + } + + private void handleError(String errorMessage, Integer extUsrId, String extUsrIPAddr, HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + // TODO Auto-generated method stub + request.setAttribute("errorMessage", errorMessage); + logDetService.addLogDet(extUsrId, extUsrIPAddr, errorMessage.toUpperCase()); + request.getRequestDispatcher("upd_ext_cont_res_display.jsp").forward(request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/UserLoginDetServlet.java b/src/main/java/com/cont_mgmt/servlet/UserLoginDetServlet.java new file mode 100644 index 0000000..dd71c95 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/UserLoginDetServlet.java @@ -0,0 +1,114 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.text.ParseException; + +import com.cont_mgmt.dto.User; +import com.cont_mgmt.service.ExistContDetService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.service.UserLoginDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class UserLoginDetServlet + */ +@WebServlet("/UserLoginDetServlet") +public class UserLoginDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the UserLoginDetService and ExistContDetService + private UserLoginDetService userLoginDetService = new UserLoginDetService(); + private ExistContDetService existContDetService = new ExistContDetService(); + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Toggle for alternate day message sending (active/expired) in case both exist + private static boolean sendStatusToday = true; + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String usrName = stringUtils.safeParam(request, "usr_name"); + String usrPass = stringUtils.safeParam(request, "usr_pass"); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + boolean flag = false; + String alertMessage = null; + + try { + flag = userLoginDetService.findUserLoginDet(usrName, usrPass); + + if (flag) { + System.out.println(request.getServletContext().getRealPath("/")); + User isUserFetched = userLoginDetService.getUserLoginDet(usrName, usrPass); + if (isUserFetched != null) { + request.getSession().setAttribute("user", isUserFetched); // Store user object + String msg = existContDetService.getExpContDet(); + String lowerMsg = msg.toLowerCase(); + + // Flags to detect which type are present + boolean hasExp = lowerMsg.contains("about to expire"); + boolean hasExpd = lowerMsg.contains("expired"); + boolean hasAct = lowerMsg.contains("active"); + + if (lowerMsg.contains("no contracts")) { + alertMessage = msg; // If no contracts found + } else if (hasExp && !hasExpd && !hasAct) { + alertMessage = msg; // Only Expiring + } else if (hasExpd && !hasExp && !hasAct) { + alertMessage = msg; // Only Expired + } else if (hasAct && !hasExp && !hasExpd) { + alertMessage = msg; // Only Active + } else if (hasExp && (hasAct || hasExpd)) { + // Expiring + Active/Expired -> send only expiring + alertMessage = stringUtils.extractBlock(msg, "about to expire"); + } else if (hasAct && hasExpd && !hasExp) { // Active + Expired -> Send in alternate days + String actMsg = stringUtils.extractBlock(msg, "active"); + String expdMsg = stringUtils.extractBlock(msg, "expired"); + + if (sendStatusToday) { + alertMessage = actMsg; + } else { + alertMessage = expdMsg; + } + sendStatusToday = !sendStatusToday; // Toggle msg for next day + } else { + alertMessage = "No message could be generated"; // Fallback message if all conditions failed + } + logDetService.addLogDet(isUserFetched.getUserId(), usrIPAddr, "LOGIN SUCCESS"); + response.getWriter().write(stringUtils.buildLoginSuccessResponse(alertMessage)); + } else { + logDetService.addLogDet(0, usrIPAddr, "LOG IN FAILED"); + response.getWriter().write(stringUtils + .buildFailureResponse("Login failed. Wrong credentials entered or credentials not found.")); + } + } else { + logDetService.addLogDet(0, usrIPAddr, "LOG IN FAILED"); + response.getWriter().write(stringUtils + .buildFailureResponse("Login failed. Wrong credentials entered or credentials not found.")); + } + } catch (SQLException | ClassNotFoundException | ParseException e) { + String errorMessage = e.getMessage(); + response.getWriter().write(stringUtils.buildFailureResponse("Error: " + errorMessage)); + } + } +} diff --git a/src/main/java/com/cont_mgmt/servlet/UserLogoutDetServlet.java b/src/main/java/com/cont_mgmt/servlet/UserLogoutDetServlet.java new file mode 100644 index 0000000..bc77c4b --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/UserLogoutDetServlet.java @@ -0,0 +1,61 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; + +import com.cont_mgmt.dto.User; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +/** + * Servlet implementation class UserLogoutDetServlet + */ +@WebServlet("/UserLogoutDetServlet") +public class UserLogoutDetServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + HttpSession session = request.getSession(false); // Get the existing session (if any) + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + if (session != null) { + // Retrieve user details from session + User usr = (User) session.getAttribute("user"); + if (usr != null) { + logDetService.addLogDet(usr.getUserId(), usrIPAddr, "LOG OUT SUCCESS"); + } else { + logDetService.addLogDet(0, usrIPAddr, "LOGGED OUT AS USER IS NOT FOUND IN SESSION"); + } + } else { + logDetService.addLogDet(0, usrIPAddr, "LOGGED OUT DUE TO INVALID SESSION"); + } + response.sendRedirect("logout.jsp"); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ViewActFileMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ViewActFileMsgServlet.java new file mode 100644 index 0000000..73fe5d7 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ViewActFileMsgServlet.java @@ -0,0 +1,164 @@ +package com.cont_mgmt.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; + +import com.cont_mgmt.service.FileService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +/** + * Servlet implementation class ViewActFileMsgServlet + */ +@WebServlet("/ViewActFileMsgServlet") +public class ViewActFileMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the service to get the file content based on file type + private FileService fileService = new FileService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Retrieve the fileType and filePath from the POST body + String fileType = stringUtils.safeParam(request, "file_type"); + String filePath = stringUtils.safeParam(request, "file_path"); + String contNum = stringUtils.safeParam(request, "cont_num"); + Integer usrId = Integer.parseInt(request.getParameter("user_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + if (fileType == null || fileType.trim().equals("") || filePath == null || fileType.trim().equals("")) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "INVALID REQUEST PARAMETERS VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT"); + response.getWriter().write(""); + return; + } + + byte[] fileContent = null; + + try { + switch (fileType) { + case "LOA": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order-Ext": + fileContent = fileService.getFile(filePath); + break; + case "AS": + fileContent = fileService.getFile(filePath); + break; + case "AS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Bill": + fileContent = fileService.getFile(filePath); + break; + case "Bill-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Agreement": + fileContent = fileService.getFile(filePath); + break; + case "Agreement-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Invoice": + fileContent = fileService.getFile(filePath); + break; + case "Invoice-Ext": + fileContent = fileService.getFile(filePath); + break; + case "RTGS": + fileContent = fileService.getFile(filePath); + break; + case "RTGS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "EMD": + fileContent = fileService.getFile(filePath); + break; + case "SD": + fileContent = fileService.getFile(filePath); + break; + case "SD-Ext": + fileContent = fileService.getFile(filePath); + break; + case "ASD": + fileContent = fileService.getFile(filePath); + break; + case "ASD-Ext": + fileContent = fileService.getFile(filePath); + break; + default: + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "UNKNOWN FILE TYPE VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT"); + response.getWriter().write(""); + return; + } + + if (fileContent != null) { + logDetService.addLogDet(usrId, usrIPAddr, + fileType + " FILE FETCHED VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT"); + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "inline; filename=\"" + new File(filePath).getName() + "\""); + OutputStream os = response.getOutputStream(); + os.write(fileContent); + os.flush(); + os.close(); + } else { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, "FILE NOT FOUND VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT"); + response.getWriter().write(""); + } + } catch (FileNotFoundException fnfe) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, "FILE " + fileType.toUpperCase() + " NOT UPLOADED FOR ITC NO: " + + contNum.toUpperCase() + " VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT"); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // 400 + response.getWriter().write("Error: File " + fileType + " Not Uploaded for ITC No: " + contNum); + } catch (Exception e) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + e.getMessage().toUpperCase() + " VIA MESSAGE NOTIFICATION IN ACTIVE CONTRACT"); + response.getWriter().write(""); + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ViewExpFileMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ViewExpFileMsgServlet.java new file mode 100644 index 0000000..3f4a67a --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ViewExpFileMsgServlet.java @@ -0,0 +1,165 @@ +package com.cont_mgmt.servlet; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; + +import com.cont_mgmt.service.FileService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ViewExpFileMsgServlet + */ +@WebServlet("/ViewExpFileMsgServlet") +public class ViewExpFileMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the service to get the file content based on file type + private FileService fileService = new FileService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Retrieve the fileType and filePath from the POST body + String fileType = stringUtils.safeParam(request, "file_type"); + String filePath = stringUtils.safeParam(request, "file_path"); + String contNum = stringUtils.safeParam(request, "cont_num"); + Integer usrId = Integer.parseInt(request.getParameter("user_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + if (fileType == null || fileType.trim().equals("") || filePath == null || fileType.trim().equals("")) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "INVALID REQUEST PARAMETERS VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT"); + response.getWriter().write(""); + return; + } + + byte[] fileContent = null; + + try { + switch (fileType) { + case "LOA": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order-Ext": + fileContent = fileService.getFile(filePath); + break; + case "AS": + fileContent = fileService.getFile(filePath); + break; + case "AS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Bill": + fileContent = fileService.getFile(filePath); + break; + case "Bill-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Agreement": + fileContent = fileService.getFile(filePath); + break; + case "Agreement-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Invoice": + fileContent = fileService.getFile(filePath); + break; + case "Invoice-Ext": + fileContent = fileService.getFile(filePath); + break; + case "RTGS": + fileContent = fileService.getFile(filePath); + break; + case "RTGS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "EMD": + fileContent = fileService.getFile(filePath); + break; + case "SD": + fileContent = fileService.getFile(filePath); + break; + case "SD-Ext": + fileContent = fileService.getFile(filePath); + break; + case "ASD": + fileContent = fileService.getFile(filePath); + break; + case "ASD-Ext": + fileContent = fileService.getFile(filePath); + break; + default: + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "UNKNOWN FILE TYPE VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT"); + response.getWriter().write(""); + return; + } + + if (fileContent != null) { + logDetService.addLogDet(usrId, usrIPAddr, + fileType + " FILE FETCHED VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT"); + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "inline; filename=\"" + new File(filePath).getName() + "\""); + OutputStream os = response.getOutputStream(); + os.write(fileContent); + os.flush(); + os.close(); + } else { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "FILE NOT FOUND VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT"); + response.getWriter().write(""); + } + } catch (FileNotFoundException fnfe) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, "FILE " + fileType.toUpperCase() + " NOT UPLOADED FOR ITC NO: " + + contNum.toUpperCase() + " VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT"); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // 400 + response.getWriter().write("Error: File " + fileType + " Not Uploaded for ITC No: " + contNum); + } catch (Exception e) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + e.getMessage().toUpperCase() + " VIA MESSAGE NOTIFICATION IN EXPIRING CONTRACT"); + response.getWriter().write(""); + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ViewExpdFileMsgServlet.java b/src/main/java/com/cont_mgmt/servlet/ViewExpdFileMsgServlet.java new file mode 100644 index 0000000..b9a3908 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ViewExpdFileMsgServlet.java @@ -0,0 +1,165 @@ +package com.cont_mgmt.servlet; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; + +import com.cont_mgmt.service.FileService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +/** + * Servlet implementation class ViewExpdFileMsgServlet + */ +@WebServlet("/ViewExpdFileMsgServlet") +public class ViewExpdFileMsgServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the service to get the file content based on file type + private FileService fileService = new FileService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Retrieve the fileType and filePath from the POST body + String fileType = stringUtils.safeParam(request, "file_type"); + String filePath = stringUtils.safeParam(request, "file_path"); + String contNum = stringUtils.safeParam(request, "cont_num"); + Integer usrId = Integer.parseInt(request.getParameter("user_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + if (fileType == null || fileType.trim().equals("") || filePath == null || fileType.trim().equals("")) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "INVALID REQUEST PARAMETERS VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT"); + response.getWriter().write(""); + return; + } + + byte[] fileContent = null; + + try { + switch (fileType) { + case "LOA": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order-Ext": + fileContent = fileService.getFile(filePath); + break; + case "AS": + fileContent = fileService.getFile(filePath); + break; + case "AS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Bill": + fileContent = fileService.getFile(filePath); + break; + case "Bill-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Agreement": + fileContent = fileService.getFile(filePath); + break; + case "Agreement-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Invoice": + fileContent = fileService.getFile(filePath); + break; + case "Invoice-Ext": + fileContent = fileService.getFile(filePath); + break; + case "RTGS": + fileContent = fileService.getFile(filePath); + break; + case "RTGS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "EMD": + fileContent = fileService.getFile(filePath); + break; + case "SD": + fileContent = fileService.getFile(filePath); + break; + case "SD-Ext": + fileContent = fileService.getFile(filePath); + break; + case "ASD": + fileContent = fileService.getFile(filePath); + break; + case "ASD-Ext": + fileContent = fileService.getFile(filePath); + break; + default: + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "UNKNOWN FILE TYPE VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT"); + response.getWriter().write(""); + return; + } + + if (fileContent != null) { + logDetService.addLogDet(usrId, usrIPAddr, + fileType + " FILE FETCHED VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT"); + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "inline; filename=\"" + new File(filePath).getName() + "\""); + OutputStream os = response.getOutputStream(); + os.write(fileContent); + os.flush(); + os.close(); + } else { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "FILE NOT FOUND VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT"); + response.getWriter().write(""); + } + } catch (FileNotFoundException fnfe) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, "FILE " + fileType.toUpperCase() + " NOT UPLOADED FOR ITC NO: " + + contNum.toUpperCase() + " VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT"); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // 400 + response.getWriter().write("Error: File " + fileType + " Not Uploaded for ITC No: " + contNum); + } catch (Exception e) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + e.getMessage().toUpperCase() + " VIA MESSAGE NOTIFICATION IN EXPIRED CONTRACT"); + response.getWriter().write(""); + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/ViewFileServlet.java b/src/main/java/com/cont_mgmt/servlet/ViewFileServlet.java new file mode 100644 index 0000000..bdbb954 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/ViewFileServlet.java @@ -0,0 +1,160 @@ +package com.cont_mgmt.servlet; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; + +import com.cont_mgmt.service.FileService; +import com.cont_mgmt.service.LogDetService; +import com.cont_mgmt.util.NetworkUtils; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class ViewFileServlet + */ +@WebServlet("/ViewFileServlet") +public class ViewFileServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the NetworkUtils + private NetworkUtils networkUtils = new NetworkUtils(); + + // Call the LogDetService to insert log details + private LogDetService logDetService = new LogDetService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + // Call the service to get the file content based on file type + private FileService fileService = new FileService(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + // Retrieve the fileType and filePath from the POST body + String fileType = stringUtils.safeParam(request, "file_type"); + String filePath = stringUtils.safeParam(request, "file_path"); + String contNum = stringUtils.safeParam(request, "cont_num"); + Integer usrId = Integer.parseInt(request.getParameter("user_id")); + String usrIPAddr = networkUtils.getClientIpAddr(request).trim(); + + if (fileType == null || fileType.trim().equals("") || filePath == null || fileType.trim().equals("")) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, "INVALID REQUEST PARAMETERS"); + response.getWriter().write(""); + return; + } + + byte[] fileContent = null; + + try { + switch (fileType) { + case "LOA": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order": + fileContent = fileService.getFile(filePath); + break; + case "Work-Order-Ext": + fileContent = fileService.getFile(filePath); + break; + case "AS": + fileContent = fileService.getFile(filePath); + break; + case "AS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Bill": + fileContent = fileService.getFile(filePath); + break; + case "Bill-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Agreement": + fileContent = fileService.getFile(filePath); + break; + case "Agreement-Ext": + fileContent = fileService.getFile(filePath); + break; + case "Invoice": + fileContent = fileService.getFile(filePath); + break; + case "Invoice-Ext": + fileContent = fileService.getFile(filePath); + break; + case "RTGS": + fileContent = fileService.getFile(filePath); + break; + case "RTGS-Ext": + fileContent = fileService.getFile(filePath); + break; + case "EMD": + fileContent = fileService.getFile(filePath); + break; + case "SD": + fileContent = fileService.getFile(filePath); + break; + case "SD-Ext": + fileContent = fileService.getFile(filePath); + break; + case "ASD": + fileContent = fileService.getFile(filePath); + break; + case "ASD-Ext": + fileContent = fileService.getFile(filePath); + break; + default: + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, "UNKNOWN FILE TYPE"); + response.getWriter().write(""); + return; + } + + if (fileContent != null) { + logDetService.addLogDet(usrId, usrIPAddr, fileType + " file fetched"); + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "inline; filename=\"" + new File(filePath).getName() + "\""); + OutputStream os = response.getOutputStream(); + os.write(fileContent); + os.flush(); + os.close(); + } else { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, "FILE NOT FOUND"); + response.getWriter().write(""); + } + } catch (FileNotFoundException fnfe) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, + "FILE " + fileType.toUpperCase() + " NOT UPLOADED FOR ITC NO: " + contNum.toUpperCase()); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // 400 + response.getWriter().write("Error: File " + fileType + " Not Uploaded for ITC No: " + contNum); + } catch (Exception e) { + response.setContentType("text/html"); + logDetService.addLogDet(usrId, usrIPAddr, e.getMessage().toUpperCase()); + response.getWriter().write(""); + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/servlet/WorkTypeSearchServlet.java b/src/main/java/com/cont_mgmt/servlet/WorkTypeSearchServlet.java new file mode 100644 index 0000000..140c842 --- /dev/null +++ b/src/main/java/com/cont_mgmt/servlet/WorkTypeSearchServlet.java @@ -0,0 +1,77 @@ +package com.cont_mgmt.servlet; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONArray; + +import com.cont_mgmt.service.WorkTypeSearchService; +import com.cont_mgmt.util.StringUtils; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class WorkTypeSearchServlet + */ +@WebServlet("/WorkTypeSearchServlet") +public class WorkTypeSearchServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + // Call the WorkTypeSearchService + private WorkTypeSearchService workTypeSearchService = new WorkTypeSearchService(); + + // Call the StringUtils + private StringUtils stringUtils = new StringUtils(); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + String query = stringUtils.safeParam(request, "term"); + String searchType = stringUtils.safeParam(request, "searchType"); + + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + + if (query == null || query.trim().length() < 2 || searchType == null || searchType.trim().isEmpty()) { + response.getWriter().write(new JSONArray().toString()); + return; + } + + List suggestions = new ArrayList(); + try { + suggestions = workTypeSearchService.searchWorkType(query, searchType); + } catch (ClassNotFoundException cnfe) { + // TODO Auto-generated catch block + cnfe.printStackTrace(); + } catch (SQLException sqle) { + // TODO Auto-generated catch block + sqle.printStackTrace(); + } catch (IllegalArgumentException iae) { + iae.printStackTrace(); + } + + JSONArray jsonArray = new JSONArray(suggestions); + response.getWriter().write(jsonArray.toString()); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + // TODO Auto-generated method stub + doGet(request, response); + } + +} diff --git a/src/main/java/com/cont_mgmt/util/NetworkUtils.java b/src/main/java/com/cont_mgmt/util/NetworkUtils.java new file mode 100644 index 0000000..8cedb71 --- /dev/null +++ b/src/main/java/com/cont_mgmt/util/NetworkUtils.java @@ -0,0 +1,161 @@ +package com.cont_mgmt.util; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.URI; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +import javax.naming.Context; +import javax.naming.InitialContext; + +import org.json.JSONObject; + +import com.cont_mgmt.service.LogDetService; + +import jakarta.servlet.http.HttpServletRequest; + +public class NetworkUtils { + + private String shortIoApiKey; + private String serverIpAddr; + + public NetworkUtils() { + try { + serverIpAddr = InetAddress.getLocalHost().getHostAddress(); + // --- Lookup local environment entries from context.xml --- + Context initContext = (Context) new InitialContext().lookup("java:comp/env"); + shortIoApiKey = (String) initContext.lookup("shortio.api.key"); + if (shortIoApiKey == null || shortIoApiKey.isEmpty()) { + throw new RuntimeException("Short.io API key not configured in context.xml of Tomcat JNDI."); + } + } catch (Exception e) { + logDetService.addLogDet(-2, serverIpAddr, "Failed to lookup Short.io API key: " + e.getMessage()); + throw new RuntimeException("Failed to lookup Short.io API key: " + e.getMessage()); + } + } + + // Call the LogDetService + private LogDetService logDetService = new LogDetService(); + + public String getClientIpAddr(HttpServletRequest request) { + String ip = request.getHeader("X-Forwarded-For"); + + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + + // If multiple IPs are returned (from proxies), take the first one + if (ip != null && ip.contains(",")) { + ip = ip.split(",")[0].trim(); + } + + return ip; + } + + /** + * Utility method to short the given URL using Short.io API + */ + public String shortenURL(String longUrl, String custSlug) throws Exception { + // TODO Auto-generated method stub + String shortIoApiUrl = "https://api.short.io/links"; + String shortUrl = null; + String serverIp = InetAddress.getLocalHost().getHostAddress(); + + // Generate a UUID suffix + /* + * String uuidSuffix = UUID.randomUUID().toString().split("-")[0]; // first 8 + * characters String finalSlug = custSlug + "_" + uuidSuffix; + */ + + String finalSlug = custSlug; + + // Build the JSON payload + JSONObject payload = new JSONObject(); + payload.put("originalURL", longUrl); + // Customized sub-domain obtained from short.io domain + payload.put("domain", "gcc-contracts.s.gy"); + payload.put("path", finalSlug); + + String payloadData = payload.toString(); + + // Setup connection + URL urlCon = new URI(shortIoApiUrl).toURL(); + HttpURLConnection httpCon = (HttpURLConnection) urlCon.openConnection(); + httpCon.setRequestMethod("POST"); + httpCon.setRequestProperty("authorization", shortIoApiKey); + httpCon.setRequestProperty("Content-Type", "application/json"); + httpCon.setDoOutput(true); + + OutputStream os = null; + BufferedReader br = null; + // Send the payload + try { + os = httpCon.getOutputStream(); + byte[] inputByte = payloadData.getBytes(StandardCharsets.UTF_8); + os.write(inputByte); + os.flush(); + + // Read response (input stream for success, error stream for errors) + Integer resCode = httpCon.getResponseCode(); + InputStreamReader isr = new InputStreamReader( + resCode >= 200 && resCode < 300 ? httpCon.getInputStream() : httpCon.getErrorStream(), + StandardCharsets.UTF_8); + br = new BufferedReader(isr); + StringBuilder res = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + res.append(line.trim()); + } + + if (resCode >= 200 && resCode < 300) { + JSONObject jsonResponse = new JSONObject(res.toString()); + if (jsonResponse.has("shortURL")) { + shortUrl = jsonResponse.getString("shortURL"); + } + } else { + throw new RuntimeException("Failed to shorten URL: " + res.toString()); + } + + if (isr != null) { + isr.close(); + } + } catch (Exception e) { + System.out.println("Exception occurred in NetworkUtils shortenURL: " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, "Exception occurred in NetworkUtils shortenURL: " + e.getMessage()); + } finally { + if (os != null) { + try { + os.close(); + } catch (Exception e) { + System.out.println("Exception while closing output stream reader in NetworkUtils shortenURL: " + + e.getMessage()); + logDetService.addLogDet(-2, serverIp, + "Exception while closing output stream reader in NetworkUtils shortenURL: " + + e.getMessage()); + } + } + if (br != null) { + try { + br.close(); + } catch (Exception e) { + System.out.println( + "Exception while closing buffered reader in NetworkUtils shortenURL: " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, + "Exception while closing buffered reader in NetworkUtils shortenURL: " + e.getMessage()); + } + } + } + + return shortUrl; + } +} \ No newline at end of file diff --git a/src/main/java/com/cont_mgmt/util/ServletUtils.java b/src/main/java/com/cont_mgmt/util/ServletUtils.java new file mode 100644 index 0000000..f1df4a5 --- /dev/null +++ b/src/main/java/com/cont_mgmt/util/ServletUtils.java @@ -0,0 +1,97 @@ +package com.cont_mgmt.util; + +import java.io.IOException; + +import com.cont_mgmt.wrapper.BillDetListWrapper; +import com.cont_mgmt.wrapper.ContDetListWrapper; +import com.cont_mgmt.wrapper.VendDetListWrapper; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public class ServletUtils { + + // Helper method to forward the request + public void forwardRequest(HttpServletRequest request, HttpServletResponse response, String jspPath) + throws ServletException, IOException { + request.getRequestDispatcher(jspPath).forward(request, response); + } + + // Helper method to set error attribute + public void setErrorAttribute(HttpServletRequest request, String message) { + request.setAttribute("errorMessage", message); + } + + // Helper method to set attribute + public void setAttributes(HttpServletRequest request, BillDetListWrapper billListWrapper, + ContDetListWrapper contListWrapper, String vendName, String workDesc) { + request.setAttribute("billListWrapper", billListWrapper); + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + request.setAttribute("workDesc", workDesc); + } + + public void setAttributes(HttpServletRequest request, ContDetListWrapper contListWrapper, String vendName, + String workDesc) { + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + request.setAttribute("workDesc", workDesc); + } + + public void setAttributes(HttpServletRequest request, BillDetListWrapper billListWrapper, + ContDetListWrapper contListWrapper, String vendName) { + request.setAttribute("billListWrapper", billListWrapper); + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + } + + public void setAttributes(HttpServletRequest request, ContDetListWrapper contListWrapper, String vendName) { + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + } + + public void setAttributes(HttpServletRequest request, String reqSrc, BillDetListWrapper billListWrapper, + ContDetListWrapper contListWrapper, String vendName) { + request.setAttribute("billListWrapper", billListWrapper); + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + request.setAttribute("reqSrc", reqSrc); + } + + public void setAttributes(HttpServletRequest request, String reqSrc, ContDetListWrapper contListWrapper, + String vendName) { + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + request.setAttribute("reqSrc", reqSrc); + } + + public void setAttributes(HttpServletRequest request, VendDetListWrapper vendListWrapper, + ContDetListWrapper contListWrapper) { + request.setAttribute("vendListWrapper", vendListWrapper); + request.setAttribute("contListWrapper", contListWrapper); + } + + public void setAttributes(HttpServletRequest request, String reqSrc, BillDetListWrapper billListWrapper, + ContDetListWrapper contListWrapper, String vendName, String workDesc) { + request.setAttribute("billListWrapper", billListWrapper); + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + request.setAttribute("reqSrc", reqSrc); + request.setAttribute("workDesc", workDesc); + } + + public void setAttributes(HttpServletRequest request, String reqSrc, ContDetListWrapper contListWrapper, + String vendName, String workDesc) { + request.setAttribute("contListWrapper", contListWrapper); + request.setAttribute("vendName", vendName); + request.setAttribute("reqSrc", reqSrc); + request.setAttribute("workDesc", workDesc); + } + + // Helper method to set error message + public void setErrorMessage(HttpServletRequest request, String message) { + request.setAttribute("errorMessage", message); + } + +} diff --git a/src/main/java/com/cont_mgmt/util/StringUtils.java b/src/main/java/com/cont_mgmt/util/StringUtils.java new file mode 100644 index 0000000..2d69433 --- /dev/null +++ b/src/main/java/com/cont_mgmt/util/StringUtils.java @@ -0,0 +1,127 @@ +package com.cont_mgmt.util; + +import java.io.InputStream; +import java.net.InetAddress; +import java.util.List; +import java.util.Scanner; + +import com.cont_mgmt.service.LogDetService; + +import jakarta.servlet.http.HttpServletRequest; + +public class StringUtils { + + // Call the LogDetService + private LogDetService logDetService = new LogDetService(); + + private String serverIp; + + // Convert InputStream to String + public String convertInputStreamToString(InputStream inputStream) { + Scanner scanner = null; + try { + serverIp = InetAddress.getLocalHost().getHostAddress(); + scanner = new Scanner(inputStream, "UTF-8").useDelimiter("\\A"); + return scanner.hasNext() ? scanner.next() : ""; + } catch (Exception e) { + logDetService.addLogDet(-2, serverIp, + "Exception occurred in StringUtils convertInputStreamToString: " + e.getMessage()); + throw new RuntimeException(e); + } finally { + if (scanner != null) { + scanner.close(); + } + } + } + + // Helper method to extract the file name from Content-Disposition header + public String extractFileName(String contentDisposition) { + for (String content : contentDisposition.split(";")) { + if (content.trim().startsWith("filename")) { + return content.substring(content.indexOf('=') + 1).trim().replace("\"", ""); + } + } + return null; // If no file name is found + } + + /** + * Utility method to extract message block for given keyword + */ + public String extractBlock(String message, String keyword) { + // TODO Auto-generated method stub + String[] lines = message.split("\n"); + StringBuilder block = new StringBuilder(); + for (String line : lines) { + if (line.toLowerCase().contains(keyword.toLowerCase())) { + block.append(line).append("\n"); + } + } + return block.toString().trim(); + } + + // Helper method to check if a string is null or empty + public boolean isInvalidSelection(String str) { + return str == null || str.trim().isEmpty() || "0".equals(str.trim()); + } + + // Helper method to convert a string to uppercase, or return an empty string + // if null + public String getUpperCase(String str) { + return (str != null && !str.trim().isEmpty()) ? str.toUpperCase() : ""; + } + + // Helper method to return boolean value for a non-null list + public boolean hasData(List list) { + return list != null && !list.isEmpty(); + } + + // Helper method to return a non-null string + public String getNonNull(String str) { + return (str != null) ? str : ""; + } + + // Helper method to detect null values + public String safeParam(HttpServletRequest request, String param) { + String value = request.getParameter(param); + return value != null ? value.trim() : ""; + } + + /** + * Builds the success response script. + */ + public String buildSuccessResponse(String message) { + String alertMessage = escapeJavaScript(message); + return ""; + } + + /** + * Builds the success response script. + */ + public String buildLoginSuccessResponse(String message) { + String alertMessage = escapeJavaScript(message); + return ""; + } + + /** + * Builds a failure response script with a given message. + */ + public String buildFailureResponse(String message) { + String alertMessage = escapeJavaScript(message); + return ""; + } + + /** + * Escapes special characters in a string for safe inclusion in JavaScript. + */ + public String escapeJavaScript(String message) { + return message.replace("'", "\\'").replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "\\r"); + } + + public String escapeJavaScriptWithBackSlash(String message) { + return message.replace("\\", "\\\\") // Escape backslash first + .replace("'", "\\'").replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "\\r"); + } + +} diff --git a/src/main/java/com/cont_mgmt/util/TimeUtils.java b/src/main/java/com/cont_mgmt/util/TimeUtils.java new file mode 100644 index 0000000..fe0e955 --- /dev/null +++ b/src/main/java/com/cont_mgmt/util/TimeUtils.java @@ -0,0 +1,197 @@ +package com.cont_mgmt.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.URI; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; +import com.cont_mgmt.service.LogDetService; + +public class TimeUtils { + + // Call the LogDetService + private LogDetService logDetService = new LogDetService(); + + // List of time APIs to try sequentially + private static final String[] TIME_API_URLS = { "https://timeapi.io/api/Time/current/zone?timeZone=Asia/Kolkata", + "http://worldtimeapi.org/api/timezone/Asia/Kolkata" }; + + private String serverIp; + + /** + * Calculates delay until the given time (hrs:mins) in IST + * + * @throws Exception + */ + public long getDelayUntil(int hrs, int mins) throws Exception { + TimeZone tz = TimeZone.getTimeZone("Asia/Kolkata"); + + // Fetch HTTP time once + Date httpTime = getHTTPTime(); + + // Now calendar + Calendar now = Calendar.getInstance(tz); + now.setTime(httpTime); + + // Target calender + Calendar target = Calendar.getInstance(tz); + target.setTime(httpTime); + target.set(Calendar.HOUR_OF_DAY, hrs); + target.set(Calendar.MINUTE, mins); + target.set(Calendar.SECOND, 0); + target.set(Calendar.MILLISECOND, 0); + + // If the target time has already passed today, schedule for tomorrow + if (target.before(now)) { + target.add(Calendar.DAY_OF_MONTH, 1); + } + + return target.getTimeInMillis() - now.getTimeInMillis(); + } + + public String getExpiryDays(SimpleDateFormat sdf, Date currentDate, String contEndDate) throws ParseException { + // TODO Auto-generated method stub + Date endDate = null; + currentDate = sdf.parse(sdf.format(new Date())); + try { + endDate = sdf.parse(contEndDate); + } catch (ParseException pe) { + // TODO Auto-generated catch block + pe.printStackTrace(); + throw pe; + } + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); // Convert milliseconds to days + return String.valueOf(diffInDays); + } + + // Get exact current time with multiple APIs + fallback + public Date getHTTPTime() { + + try { + // Resolve IP Address + try { + serverIp = InetAddress.getLocalHost().getHostAddress(); + } catch (Exception e) { + System.out.println("Exception occurred in TimeUtils getHTTPTime: " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, "Exception occurred in TimeUtils getHTTPTime: " + e.getMessage()); + } + + for (String apiUrl : TIME_API_URLS) { + try { + Date time = fetchTimeFromApi(apiUrl, serverIp); + if (time != null) { + return time; // success + } + } catch (Exception e) { + System.out.println("Time API failed: " + apiUrl + " - " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, "Time API failed: " + apiUrl + " - " + e.getMessage()); + } + } + } catch (Exception e) { + System.out.println("All time APIs failed: " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, "All time APIs failed: " + e.getMessage()); + } + + // Fallback to local system time (adjust the minute as per requirements) + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.add(Calendar.MINUTE, 2); + return cal.getTime(); + } + + private Date fetchTimeFromApi(String apiUrl, String serverIp) throws Exception { + HttpURLConnection urlCon = null; + InputStream inStream = null; + try { + URL url = new URI(apiUrl).toURL(); + urlCon = (HttpURLConnection) url.openConnection(); + urlCon.setConnectTimeout(10000); // 10s connect timeout + urlCon.setReadTimeout(10000); // 10s read timeout + + inStream = urlCon.getInputStream(); + BufferedReader buffRead = new BufferedReader(new InputStreamReader(inStream, StandardCharsets.UTF_8)); + StringBuilder jsonResponse = new StringBuilder(); + String line; + while ((line = buffRead.readLine()) != null) { + jsonResponse.append(line.trim()); + } + + String dateTimeStr = parseDateTimeFromResponse(apiUrl, jsonResponse.toString(), serverIp); + if (dateTimeStr == null) { + return null; + } + + // Remove fractional seconds if present + dateTimeStr = dateTimeStr.replaceFirst("\\.\\d+", ""); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return sdf.parse(dateTimeStr); + } catch (Exception e) { + System.out.println("Exception occurred in TimeUtils fetchTimeFromApi: " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, + "Exception occurred in TimeUtils fetchTimeFromApi: " + e.getMessage()); + return null; // <--- getHTTPTime() ensures a local system time is returned + } finally { + if (inStream != null) { + inStream.close(); + } + if (urlCon != null) { + urlCon.disconnect(); + } + } + } + + private String parseDateTimeFromResponse(String apiUrl, String jsonResponse, String serverIp) { + try { + if (apiUrl.contains("timeapi.io")) { + // "dateTime":"2025-08-13T12:34:56.789+05:30" + return jsonResponse.split("\"dateTime\":\"")[1].split("\"")[0]; + } else if (apiUrl.contains("worldtimeapi.org")) { + // "datetime":"2025-08-13T12:34:56.789+05:30" + return jsonResponse.split("\"datetime\":\"")[1].split("\"")[0]; + } else if (apiUrl.contains("worldclockapi.com")) { + // "currentDateTime":"2025-08-13T12:34:56-05:00" + return jsonResponse.split("\"currentDateTime\":\"")[1].split("\"")[0]; + } + } catch (Exception e) { + System.out.println("Exception occurred in TimeUtils parseDateTimeFromResponse: " + e.getMessage()); + logDetService.addLogDet(-2, serverIp, + "Exception occurred in TimeUtils parseDateTimeFromResponse: " + e.getMessage()); + } + return null; + } + + // Always schedule for tomorrow at the given time (ignores today) + public Long getDelayUntilNextDay(int hrs, int mins) throws Exception { + // TODO Auto-generated method stub + TimeZone tz = TimeZone.getTimeZone("Asia/Kolkata"); + + // Fetch HTTP time once + Date httpTime = getHTTPTime(); + + // Now calendar + Calendar now = Calendar.getInstance(tz); + now.setTime(httpTime); + + // Target calendar -> tomorrow at given time + Calendar target = Calendar.getInstance(tz); + target.setTime(httpTime); + target.add(Calendar.DAY_OF_MONTH, 1); + target.set(Calendar.HOUR_OF_DAY, hrs); + target.set(Calendar.MINUTE, mins); + target.set(Calendar.SECOND, 0); + target.set(Calendar.MILLISECOND, 0); + + return target.getTimeInMillis() - now.getTimeInMillis(); + } +} diff --git a/src/main/java/com/cont_mgmt/util/WhatsAppMessageSender.java b/src/main/java/com/cont_mgmt/util/WhatsAppMessageSender.java new file mode 100644 index 0000000..1ad704c --- /dev/null +++ b/src/main/java/com/cont_mgmt/util/WhatsAppMessageSender.java @@ -0,0 +1,72 @@ +package com.cont_mgmt.util; + +import org.json.JSONObject; + +import com.cont_mgmt.dto.WhatsAppMessage; +import com.cont_mgmt.service.LogDetService; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.RequestBody; +import com.squareup.okhttp.Response; + +public class WhatsAppMessageSender { + + // Call the LogDetService + private LogDetService logDetService = new LogDetService(); + + private String idInstance; + private String apiTokenInstance; + + public WhatsAppMessageSender() { + super(); + } + + public WhatsAppMessageSender(String idInstance, String apiTokenInstance) { + super(); + this.idInstance = idInstance; + this.apiTokenInstance = apiTokenInstance; + } + + public void sendMsg(WhatsAppMessage whatsAppMessage, String serverIp) { + // TODO Auto-generated method stub + OkHttpClient okHttpClient = new OkHttpClient(); + String apiUrl = "https://7105.api.greenapi.com/waInstance" + idInstance + "/sendMessage/" + apiTokenInstance; + + MediaType mediaType = MediaType.parse("application/json"); + + for (String phone : whatsAppMessage.getPhone()) { + try { + JSONObject json = new JSONObject(); + json.put("chatId", phone + "@c.us"); + json.put("message", whatsAppMessage.getMsg()); + + RequestBody requestBody = RequestBody.create(mediaType, json.toString()); + Request request = new Request.Builder().url(apiUrl).post(requestBody).build(); + + Response response = okHttpClient.newCall(request).execute(); + String responseBody = response.body().string(); + + if (response.isSuccessful()) { + JSONObject jsonObject = new JSONObject(responseBody); + if (jsonObject.has("idMessage")) { + logDetService.addLogDet(-2, serverIp, + "WhatsApp message sent to " + phone + ". Response Code: " + response.code()); + } else { + logDetService.addLogDet(-2, serverIp, + "Unexpected response for " + phone + ". Response Code: " + response.code()); + } + } else { + logDetService.addLogDet(-2, serverIp, + "HTTP error in sending to " + phone + ". Response Code: " + response.code()); + } + + response.body().close(); // Close response body to free resources + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + +} diff --git a/src/main/java/com/cont_mgmt/wrapper/BillDetListWrapper.java b/src/main/java/com/cont_mgmt/wrapper/BillDetListWrapper.java new file mode 100644 index 0000000..1d6dcfc --- /dev/null +++ b/src/main/java/com/cont_mgmt/wrapper/BillDetListWrapper.java @@ -0,0 +1,20 @@ +package com.cont_mgmt.wrapper; + +import java.util.List; + +import com.cont_mgmt.dto.Bill; + +public class BillDetListWrapper { + + private List billDetList; + + public BillDetListWrapper(List billDetList) { + super(); + this.billDetList = billDetList; + } + + public List getBillDetList() { + return billDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/wrapper/BillStatDetListWrapper.java b/src/main/java/com/cont_mgmt/wrapper/BillStatDetListWrapper.java new file mode 100644 index 0000000..da345d8 --- /dev/null +++ b/src/main/java/com/cont_mgmt/wrapper/BillStatDetListWrapper.java @@ -0,0 +1,20 @@ +package com.cont_mgmt.wrapper; + +import java.util.List; + +import com.cont_mgmt.dto.BillStat; + +public class BillStatDetListWrapper { + + private List billStatDetList; + + public List getBillStatDetList() { + return billStatDetList; + } + + public BillStatDetListWrapper(List billStatDetList) { + super(); + this.billStatDetList = billStatDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/wrapper/ContDetListWrapper.java b/src/main/java/com/cont_mgmt/wrapper/ContDetListWrapper.java new file mode 100644 index 0000000..84518ce --- /dev/null +++ b/src/main/java/com/cont_mgmt/wrapper/ContDetListWrapper.java @@ -0,0 +1,20 @@ +package com.cont_mgmt.wrapper; + +import java.util.List; + +import com.cont_mgmt.dto.Contract; + +public class ContDetListWrapper { + + private List contList; + + public List getContList() { + return contList; + } + + public ContDetListWrapper(List contList) { + super(); + this.contList = contList; + } + +} diff --git a/src/main/java/com/cont_mgmt/wrapper/InvoiceBillTypeDetListWrapper.java b/src/main/java/com/cont_mgmt/wrapper/InvoiceBillTypeDetListWrapper.java new file mode 100644 index 0000000..6df639c --- /dev/null +++ b/src/main/java/com/cont_mgmt/wrapper/InvoiceBillTypeDetListWrapper.java @@ -0,0 +1,20 @@ +package com.cont_mgmt.wrapper; + +import java.util.List; + +import com.cont_mgmt.dto.InvoiceBillType; + +public class InvoiceBillTypeDetListWrapper { + + private List invoiceBillTypeDetList; + + public InvoiceBillTypeDetListWrapper(List invoiceBillTypeDetList) { + super(); + this.invoiceBillTypeDetList = invoiceBillTypeDetList; + } + + public List getInvoiceBillTypeDetList() { + return invoiceBillTypeDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/wrapper/ProdCatDetListWrapper.java b/src/main/java/com/cont_mgmt/wrapper/ProdCatDetListWrapper.java new file mode 100644 index 0000000..4fe477c --- /dev/null +++ b/src/main/java/com/cont_mgmt/wrapper/ProdCatDetListWrapper.java @@ -0,0 +1,20 @@ +package com.cont_mgmt.wrapper; + +import java.util.List; + +import com.cont_mgmt.dto.ProdCat; + +public class ProdCatDetListWrapper { + + private List prodCatDetList; + + public List getProdCatDetList() { + return prodCatDetList; + } + + public ProdCatDetListWrapper(List prodCatDetList) { + super(); + this.prodCatDetList = prodCatDetList; + } + +} diff --git a/src/main/java/com/cont_mgmt/wrapper/VendDetListWrapper.java b/src/main/java/com/cont_mgmt/wrapper/VendDetListWrapper.java new file mode 100644 index 0000000..2452896 --- /dev/null +++ b/src/main/java/com/cont_mgmt/wrapper/VendDetListWrapper.java @@ -0,0 +1,20 @@ +package com.cont_mgmt.wrapper; + +import java.util.List; + +import com.cont_mgmt.dto.Vendor; + +public class VendDetListWrapper { + + public VendDetListWrapper(List vendList) { + super(); + this.vendList = vendList; + } + + private List vendList; + + public List getVendList() { + return vendList; + } + +} diff --git a/src/main/webapp/META-INF/MANIFEST.MF b/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml new file mode 100644 index 0000000..521aee3 --- /dev/null +++ b/src/main/webapp/META-INF/context.xml @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/lib/commons-dbcp-1.4.jar b/src/main/webapp/WEB-INF/lib/commons-dbcp-1.4.jar new file mode 100644 index 0000000..c4c1c4f Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/commons-dbcp-1.4.jar differ diff --git a/src/main/webapp/WEB-INF/lib/commons-lang3-3.4.jar b/src/main/webapp/WEB-INF/lib/commons-lang3-3.4.jar new file mode 100644 index 0000000..b0fcb34 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/commons-lang3-3.4.jar differ diff --git a/src/main/webapp/WEB-INF/lib/commons-logging-1.1.1.jar b/src/main/webapp/WEB-INF/lib/commons-logging-1.1.1.jar new file mode 100644 index 0000000..1deef14 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/commons-logging-1.1.1.jar differ diff --git a/src/main/webapp/WEB-INF/lib/commons-pool-1.6.jar b/src/main/webapp/WEB-INF/lib/commons-pool-1.6.jar new file mode 100644 index 0000000..72ca75a Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/commons-pool-1.6.jar differ diff --git a/src/main/webapp/WEB-INF/lib/commons-text-1.1.jar b/src/main/webapp/WEB-INF/lib/commons-text-1.1.jar new file mode 100644 index 0000000..73fb4ae Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/commons-text-1.1.jar differ diff --git a/src/main/webapp/WEB-INF/lib/guava-19.0.jar b/src/main/webapp/WEB-INF/lib/guava-19.0.jar new file mode 100644 index 0000000..b175ca8 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/guava-19.0.jar differ diff --git a/src/main/webapp/WEB-INF/lib/itext-5.0.5.jar b/src/main/webapp/WEB-INF/lib/itext-5.0.5.jar new file mode 100644 index 0000000..15fd870 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/itext-5.0.5.jar differ diff --git a/src/main/webapp/WEB-INF/lib/json.jar b/src/main/webapp/WEB-INF/lib/json.jar new file mode 100644 index 0000000..51ece48 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/json.jar differ diff --git a/src/main/webapp/WEB-INF/lib/ojdbc11.jar b/src/main/webapp/WEB-INF/lib/ojdbc11.jar new file mode 100644 index 0000000..af3787c Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/ojdbc11.jar differ diff --git a/src/main/webapp/WEB-INF/lib/okhttp-2.7.5.jar b/src/main/webapp/WEB-INF/lib/okhttp-2.7.5.jar new file mode 100644 index 0000000..e6df064 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/okhttp-2.7.5.jar differ diff --git a/src/main/webapp/WEB-INF/lib/okio-1.6.0.jar b/src/main/webapp/WEB-INF/lib/okio-1.6.0.jar new file mode 100644 index 0000000..c87be59 Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/okio-1.6.0.jar differ diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..1be1948 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + ContractManagementSystem + + index.html + index.jsp + index.htm + default.html + default.jsp + default.htm + login.jsp + + + + Oracle DB Connection Details for Contract Management System + jdbc/ContractDB + javax.sql.DataSource + Container + + \ No newline at end of file diff --git a/src/main/webapp/act_cont_det_display_msg.jsp b/src/main/webapp/act_cont_det_display_msg.jsp new file mode 100644 index 0000000..a8674a8 --- /dev/null +++ b/src/main/webapp/act_cont_det_display_msg.jsp @@ -0,0 +1,257 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="java.util.concurrent.TimeUnit"%> +<%@ page language="java" import="java.text.SimpleDateFormat"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtBillDetService"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtContDetService"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract,org.json.*"%> +<% +// Call the ExtContDetService + ExtContDetService extContDetService = new ExtContDetService(); + + // Call the ExtBillDetService to fetch extension due amount + ExtBillDetService extBillDetService = new ExtBillDetService(); + + String errorMessage = ""; + JSONArray contractsJsonArray = (JSONArray) session.getAttribute("activeContractsJson"); + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("fail".equals(status)) { + JSONObject errorMessageObject = contractsJsonArray.getJSONObject(0); + errorMessage = errorMessageObject.optString("errorMessage"); + } + } else { + errorMessage = "Unable to fetch active contracts"; + } +%> + + + + + +Contract Management System + + + +<%@include file="includes/header.jsp"%> + + +
+
+

Active Contracts Via

+

Message Notifications

+ <% + if (errorMessage != null && !errorMessage.equals("")) { + %> +
+

<%=errorMessage%> +

+
+ <% + } else { + %> +
+ +
+ +
+ + +
+
+ +
+ +
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + <% + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + Date currentDate = sdf.parse(sdf.format(new Date())); + int daysThreshold = 60; // Days before expiry + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i ++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); + String contNum = contractObject.optString("contNum"); + String vendName = contractObject.optString("vendName").replace("-","/"); + Integer isExtendedFlag = contractObject.optInt("isExt"); + String contStartDate; + String contEndDate; + String extContStartDate = null; + String extContEndDate = null; + Double extContAmt = null; + Double extAmtDue = null; + if (isExtendedFlag == 1) { + Contract extCont = extContDetService.getExtContDet(contNum); + contStartDate = extCont.getContStartDate(); + contEndDate = extCont.getContEndDate(); + extContStartDate = extCont.getContStartDate(); + extContEndDate = extCont.getContEndDate(); + extContAmt = extCont.getContAmt(); + extAmtDue = extBillDetService.getTotAmtDueByExtContNum(contNum); + } + + contStartDate = contractObject.optString("contStartDate"); + contEndDate = contractObject.optString("contEndDate"); + Double contAmt = contractObject.optDouble("contAmt"); + String workDesc = contractObject.optString("workDesc"); + Double amtDue = contractObject.optDouble("amtDue"); + + // Parse dates + Date endDate = sdf.parse(contEndDate); + Date startDate = sdf.parse(contStartDate); + + // Extract year using Calendar + Calendar startCal = Calendar.getInstance(); + startCal.setTime(startDate); + int startYear = startCal.get(Calendar.YEAR); + + Calendar endCal = Calendar.getInstance(); + endCal.setTime(endDate); + int endYear = endCal.get(Calendar.YEAR); + + // Construct financialYear + String financialYear = startYear + " - " + endYear; + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); // Convert milliseconds to days + %> + + + + + + + + + + + + + <% } + } + } + } + %> + +
S.NoITC.NoContractorFinancial YearContract Start DateContract End DateDays ActiveWork DescriptionWork Order AmountBalance To Be Claimed
<%= contNum %><%= vendName %><%= financialYear %> + <% + if (isExtendedFlag == 1) { + out.println(contStartDate); %> +
+ <% out.println("Ext.Date: " + + extContStartDate); %> + <% } else { + out.println(contStartDate); + } %> +
+ <% + if (isExtendedFlag == 1) { + out.println(contEndDate); %> +
+ <% out.println("Ext.Date: " + + extContEndDate); %> + <% } else { + out.println(contEndDate); + } %> +
<% if (diffInDays > 1) { + out.println(diffInDays + + " Days Active"); + } else if (diffInDays >= 0 && diffInDays <= 1) { + out.println(diffInDays + + " Day Active"); + } %> + <%= workDesc %>₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", contAmt)); + %>
+ <% out.println("Ext. Work Order Amount: ₹ " + + String.format("%,.2f", extContAmt));%> + + <% } else { + out.println(String.format("%,.2f", contAmt)); + } %> +
₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", + (amtDue + extAmtDue))); + %>
+ <% out.println("Amount Due: ₹ " + + String.format("%,.2f", amtDue));%> +
+ + <% out.println("Ext.Amount Due: ₹ " + + String.format("%,.2f", extAmtDue));%> + + <% } else { + out.println(String.format("%,.2f", amtDue)); + } %> +
+
+ <%@include file="export_pdf.html"%> +   +
+
+
+
+ + <% if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); %> +
" style="display:none;" + action="ExistActBillDetMsgServlet" method="post" > + "> + "> +
+ <% } + } + } + %> +
+
+ <%@include file="includes/footer.jsp"%> + + + \ No newline at end of file diff --git a/src/main/webapp/body-images/failure.png b/src/main/webapp/body-images/failure.png new file mode 100644 index 0000000..68bc535 Binary files /dev/null and b/src/main/webapp/body-images/failure.png differ diff --git a/src/main/webapp/body-images/success.png b/src/main/webapp/body-images/success.png new file mode 100644 index 0000000..5861d79 Binary files /dev/null and b/src/main/webapp/body-images/success.png differ diff --git a/src/main/webapp/bootstrap-5.3.2/css/bootstrap.min.css b/src/main/webapp/bootstrap-5.3.2/css/bootstrap.min.css new file mode 100644 index 0000000..06ef212 --- /dev/null +++ b/src/main/webapp/bootstrap-5.3.2/css/bootstrap.min.css @@ -0,0 +1,11794 @@ +@charset "UTF-8"; /*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root, +[data-bs-theme="light"] { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-primary-text-emphasis: #052c65; + --bs-secondary-text-emphasis: #2b2f32; + --bs-success-text-emphasis: #0a3622; + --bs-info-text-emphasis: #055160; + --bs-warning-text-emphasis: #664d03; + --bs-danger-text-emphasis: #58151c; + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: #cfe2ff; + --bs-secondary-bg-subtle: #e2e3e5; + --bs-success-bg-subtle: #d1e7dd; + --bs-info-bg-subtle: #cff4fc; + --bs-warning-bg-subtle: #fff3cd; + --bs-danger-bg-subtle: #f8d7da; + --bs-light-bg-subtle: #fcfcfd; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #9ec5fe; + --bs-secondary-border-subtle: #c4c8cb; + --bs-success-border-subtle: #a3cfbb; + --bs-info-border-subtle: #9eeaf9; + --bs-warning-border-subtle: #ffe69c; + --bs-danger-border-subtle: #f1aeb5; + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.15), + rgba(255, 255, 255, 0) + ); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(33, 37, 41, 0.75); + --bs-secondary-color-rgb: 33, 37, 41; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(33, 37, 41, 0.5); + --bs-tertiary-color-rgb: 33, 37, 41; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: #0a58ca; + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-color: #212529; + --bs-highlight-bg: #fff3cd; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545; +} +[data-bs-theme="dark"] { + /* color-scheme: dark; */ + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: #2b3035; + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: #6ea8fe; + --bs-secondary-text-emphasis: #a7acb1; + --bs-success-text-emphasis: #75b798; + --bs-info-text-emphasis: #6edff6; + --bs-warning-text-emphasis: #ffda6a; + --bs-danger-text-emphasis: #ea868f; + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #031633; + --bs-secondary-bg-subtle: #161719; + --bs-success-bg-subtle: #051b11; + --bs-info-bg-subtle: #032830; + --bs-warning-bg-subtle: #332701; + --bs-danger-bg-subtle: #2c0b0e; + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: #084298; + --bs-secondary-border-subtle: #41464b; + --bs-success-border-subtle: #0f5132; + --bs-info-border-subtle: #087990; + --bs-warning-border-subtle: #997404; + --bs-danger-border-subtle: #842029; + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-heading-color: inherit; + --bs-link-color: #6ea8fe; + --bs-link-hover-color: #8bb9fe; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: #e685b5; + --bs-highlight-color: #dee2e6; + --bs-highlight-bg: #664d03; + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #75b798; + --bs-form-valid-border-color: #75b798; + --bs-form-invalid-color: #ea868f; + --bs-form-invalid-border-color: #ea868f; +} +*, +::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; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: 0.25; +} +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; + color: var(--bs-heading-color); +} +.h1, +h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + .h1, + h1 { + font-size: 2.5rem; + } +} +.h2, +h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + .h2, + h2 { + font-size: 2rem; + } +} +.h3, +h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + .h3, + h3 { + font-size: 1.75rem; + } +} +.h4, +h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + .h4, + h4 { + font-size: 1.5rem; + } +} +.h5, +h5 { + font-size: 1.25rem; +} +.h6, +h6 { + font-size: 1rem; +} +p { + margin-top: 0; + margin-bottom: 1rem; +} +abbr[title] { + -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: 0.5rem; + margin-left: 0; +} +blockquote { + margin: 0 0 1rem; +} +b, +strong { + font-weight: bolder; +} +.small, +small { + font-size: 0.875em; +} +.mark, +mark { + padding: 0.1875em; + color: var(--bs-highlight-color); + background-color: var(--bs-highlight-bg); +} +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline; +} +a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); +} +a:not([href]):not([class]), +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} +code, +kbd, +pre, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} +figure { + margin: 0 0 1rem; +} +img, +svg { + vertical-align: middle; +} +table { + caption-side: bottom; + border-collapse: collapse; +} +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-secondary-color); + 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]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not( + [type="week"] + ):not([type="time"])::-webkit-calendar-picker-indicator { + display: none !important; +} +[type="button"], +[type="reset"], +[type="submit"], +button { + -webkit-appearance: button; + 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: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} +::-webkit-datetime-edit-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"] { + -webkit-appearance: textfield; + appearance: textfield; + outline-offset: -2px; +} +::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-color-swatch-wrapper { + padding: 0; +} +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} +::file-selector-button { + font: inherit; + -webkit-appearance: button; + 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: 0.5rem; +} +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} +.img-fluid { + max-width: 100%; + height: auto; +} +.img-thumbnail { + padding: 0.25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + max-width: 100%; + height: auto; +} +.figure { + display: inline-block; +} +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} +.figure-caption { + font-size: 0.875em; + color: var(--bs-secondary-color); +} +.container, +.container-fluid, +.container-lg, +.container-md, +.container-sm, +.container-xl, +.container-xxl { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + 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; + } +} +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} +.col { + flex: 1 0 0%; +} +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.33333333%; +} +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.66666667%; +} +.col-auto { + flex: 0 0 auto; + width: auto; +} +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} +.col-3 { + flex: 0 0 auto; + width: 25%; +} +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} +.col-6 { + flex: 0 0 auto; + width: 50%; +} +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} +.col-9 { + flex: 0 0 auto; + width: 75%; +} +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} +.col-12 { + flex: 0 0 auto; + width: 100%; +} +.offset-1 { + margin-left: 8.33333333%; +} +.offset-2 { + margin-left: 16.66666667%; +} +.offset-3 { + margin-left: 25%; +} +.offset-4 { + margin-left: 33.33333333%; +} +.offset-5 { + margin-left: 41.66666667%; +} +.offset-6 { + margin-left: 50%; +} +.offset-7 { + margin-left: 58.33333333%; +} +.offset-8 { + margin-left: 66.66666667%; +} +.offset-9 { + margin-left: 75%; +} +.offset-10 { + margin-left: 83.33333333%; +} +.offset-11 { + margin-left: 91.66666667%; +} +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: var(--bs-emphasis-color); + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-emphasis-color); + --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); + --bs-table-active-color: var(--bs-emphasis-color); + --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); + --bs-table-hover-color: var(--bs-emphasis-color); + --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); + width: 100%; + margin-bottom: 1rem; + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + color: var( + --bs-table-color-state, + var(--bs-table-color-type, var(--bs-table-color)) + ); + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px + var( + --bs-table-bg-state, + var(--bs-table-bg-type, var(--bs-table-accent-bg)) + ); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; +} +.caption-top { + caption-side: top; +} +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} +.table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width); +} +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-striped-columns > :not(caption) > tr > :nth-child(2n) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-active { + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg); +} +.table-hover > tbody > tr:hover > * { + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg); +} +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #cfe2ff; + --bs-table-border-color: #a6b5cc; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e2e3e5; + --bs-table-border-color: #b5b6b7; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #a7b9b1; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #a6c3ca; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #ccc2a4; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #c6acae; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #c6c7c8; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #4d5154; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} +.col-form-label { + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} +.col-form-label-lg { + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); + font-size: 1.25rem; +} +.col-form-label-sm { + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); + font-size: 0.875rem; +} +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-secondary-color); +} +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type="file"] { + overflow: hidden; +} +.form-control[type="file"]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0; +} +.form-control::-webkit-datetime-edit { + display: block; + padding: 0; +} +.form-control::-moz-placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@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: var(--bs-secondary-bg); +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg); +} +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0; +} +.form-control-plaintext:focus { + outline: 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 + 0.5rem + calc(var(--bs-border-width) * 2)); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +textarea.form-control { + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color::-webkit-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), + var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], +.form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: var(--bs-secondary-bg); +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color); +} +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +[data-bs-theme="dark"] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} +.form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + flex-shrink: 0; + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + /* print-color-adjust: exact; */ +} +.form-check-input[type="checkbox"] { + border-radius: 0.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 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type="checkbox"] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type="radio"] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type="checkbox"]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input:disabled ~ .form-check-label, +.form-check-input[disabled] ~ .form-check-label { + cursor: default; + opacity: 0.5; +} +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check:disabled + .btn, +.btn-check[disabled] + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} +[data-bs-theme="dark"] + .form-switch + .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); +} +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + -webkit-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@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: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + -moz-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@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: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color); +} +.form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color); +} +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control-plaintext::-moz-placeholder, +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control-plaintext::placeholder, +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control-plaintext:not(:-moz-placeholder-shown), +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown), +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control-plaintext:-webkit-autofill, +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > .form-control-plaintext ~ label::after, +.form-floating > .form-control:focus ~ label::after, +.form-floating > .form-control:not(:placeholder-shown) ~ label::after, +.form-floating > .form-select ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > .form-control:-webkit-autofill ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; +} +.form-floating > .form-control:disabled ~ label, +.form-floating > :disabled ~ label { + color: #6c757d; +} +.form-floating > .form-control:disabled ~ label::after, +.form-floating > :disabled ~ label::after { + background-color: var(--bs-secondary-bg); +} +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-floating, +.input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-floating:focus-within, +.input-group > .form-select:focus { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); +} +.input-group-lg > .btn, +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.input-group-sm > .btn, +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3), +.input-group:not(.has-validation) + > .form-floating:not(:last-child) + > .form-control, +.input-group:not(.has-validation) + > .form-floating:not(:last-child) + > .form-select, +.input-group:not(.has-validation) + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ) { + 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 + > .form-floating:nth-last-child(n + 3) + > .form-control, +.input-group.has-validation + > .form-floating:nth-last-child(n + 3) + > .form-select, +.input-group.has-validation + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group + > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not( + .valid-feedback + ):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: calc(var(--bs-border-width) * -1); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-valid-color); +} +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius); +} +.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: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-valid:focus, +.was-validated .form-control:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-valid, +.was-validated .form-select:valid { + border-color: var(--bs-form-valid-border-color); +} +.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"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-valid:focus, +.was-validated .form-select:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.form-control-color.is-valid, +.was-validated .form-control-color:valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.form-check-input.is-valid, +.was-validated .form-check-input:valid { + border-color: var(--bs-form-valid-border-color); +} +.form-check-input.is-valid:checked, +.was-validated .form-check-input:valid:checked { + background-color: var(--bs-form-valid-color); +} +.form-check-input.is-valid:focus, +.was-validated .form-check-input:valid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.form-check-input.is-valid ~ .form-check-label, +.was-validated .form-check-input:valid ~ .form-check-label { + color: var(--bs-form-valid-color); +} +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} +.input-group > .form-control:not(:focus).is-valid, +.input-group > .form-floating:not(:focus-within).is-valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-control:not(:focus):valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.was-validated .input-group > .form-select:not(:focus):valid { + z-index: 3; +} +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-invalid-color); +} +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius); +} +.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: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-invalid:focus, +.was-validated .form-control:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-invalid, +.was-validated .form-select:invalid { + border-color: var(--bs-form-invalid-border-color); +} +.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"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-invalid:focus, +.was-validated .form-select:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.form-control-color.is-invalid, +.was-validated .form-control-color:invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.form-check-input.is-invalid, +.was-validated .form-check-input:invalid { + border-color: var(--bs-form-invalid-border-color); +} +.form-check-input.is-invalid:checked, +.was-validated .form-check-input:invalid:checked { + background-color: var(--bs-form-invalid-color); +} +.form-check-input.is-invalid:focus, +.was-validated .form-check-input:invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.form-check-input.is-invalid ~ .form-check-label, +.was-validated .form-check-input:invalid ~ .form-check-label { + color: var(--bs-form-invalid-color); +} +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} +.input-group > .form-control:not(:focus).is-invalid, +.input-group > .form-floating:not(:focus-within).is-invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-control:not(:focus):invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.was-validated .input-group > .form-select:not(:focus):invalid { + z-index: 4; +} +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), + 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem + rgba(var(--bs-btn-focus-shadow-rgb), 0.5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, +.btn.active, +.btn.show, +.btn:first-child:active, +:not(.btn-check) + .btn:active { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, +.btn.active:focus-visible, +.btn.show:focus-visible, +.btn:first-child:active:focus-visible, +:not(.btn-check) + .btn:active:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn.disabled, +.btn:disabled, +fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0a58ca; + --bs-btn-active-border-color: #0a53be; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd; +} +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5c636a; + --bs-btn-hover-border-color: #565e64; + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #565e64; + --bs-btn-active-border-color: #51585e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d; +} +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} +.btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none; +} +.btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none; +} +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} +.btn-group-lg > .btn, +.btn-lg { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); +} +.btn-group-sm > .btn, +.btn-sm { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); +} +.fade { + transition: opacity 0.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 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} +.dropdown, +.dropdown-center, +.dropend, +.dropstart, +.dropup, +.dropup-center { + position: relative; +} +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc( + var(--bs-border-radius) - var(--bs-border-width) + ); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: var(--bs-box-shadow); + --bs-dropdown-link-color: var(--bs-body-color); + --bs-dropdown-link-hover-color: var(--bs-body-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid + var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0); +} +.dropdown-item:focus, +.dropdown-item:hover { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, +.dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, +.dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} +.dropdown-menu.show { + display: block; +} +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) + var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group-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 { + border-radius: var(--bs-border-radius); +} +.btn-group > .btn-group:not(:first-child), +.btn-group > :not(.btn-check:first-child) + .btn { + margin-left: calc(var(--bs-border-width) * -1); +} +.btn-group > .btn-group:not(:last-child) > .btn, +.btn-group > .btn.dropdown-toggle-split:first-child, +.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: 0.5625rem; + padding-left: 0.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: 0.375rem; + padding-left: 0.375rem; +} +.btn-group-lg > .btn + .dropdown-toggle-split, +.btn-lg + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.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: calc(var(--bs-border-width) * -1); +} +.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 { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: 0 0; + border: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:focus, +.nav-link:hover { + color: var(--bs-nav-link-hover-color); +} +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.nav-link.disabled, +.nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} +.nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) + var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) + var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid + var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:focus, +.nav-tabs .nav-link:hover { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd; +} +.nav-pills .nav-link { + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); +} +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; +} +.nav-underline .nav-link:focus, +.nav-underline .nav-link:hover { + border-bottom-color: currentcolor; +} +.nav-underline .nav-link.active, +.nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; +} +.nav-fill .nav-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 { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-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: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:focus, +.navbar-brand:hover { + color: var(--bs-navbar-brand-hover-color); +} +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link.active, +.navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:focus, +.navbar-text a:hover { + color: var(--bs-navbar-active-color); +} +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) + var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); +} +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} +.navbar-dark, +.navbar[data-bs-theme="dark"] { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +[data-bs-theme="dark"] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color); +} +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; + color: var(--bs-card-subtitle-color); +} +.card-text:last-child { + margin-bottom: 0; +} +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius) 0 0; +} +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius); +} +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); +} +.card-img, +.card-img-bottom, +.card-img-top { + width: 100%; +} +.card-img, +.card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card-img, +.card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-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 { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%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"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-border-color: #86b7fe; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle); +} +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 + var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} +.accordion-header { + margin-bottom: 0; +} +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid + var(--bs-accordion-border-color); +} +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-body { + padding: var(--bs-accordion-body-padding-y) + var(--bs-accordion-body-padding-x); +} +.accordion-flush .accordion-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, +.accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0; +} +[data-bs-theme="dark"] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/"); +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none; +} +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid + var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.active > .page-link, +.page-link.active { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.disabled > .page-link, +.page-link.disabled { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} +.page-item:not(:first-child) .page-link { + margin-left: calc(var(--bs-border-width) * -1); +} +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); +} +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); +} +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} +.alert-heading { + color: inherit; +} +.alert-link { + font-weight: 700; + color: var(--bs-alert-link-color); +} +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} +.alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); +} +.alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); +} +.alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); +} +.alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); +} +.alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); +} +.alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); +} +.alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); +} +.alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); +} +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress, +.progress-stacked { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #0d6efd; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); +} +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} +.progress-bar-striped { + background-image: linear-gradient( + 45deg, + rgba(255, 255, 255, 0.15) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.15) 50%, + rgba(255, 255, 255, 0.15) 75%, + transparent 75%, + transparent + ); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} +.progress-stacked > .progress { + overflow: visible; +} +.progress-stacked > .progress > .progress-bar { + width: 100%; +} +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} +.list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #0d6efd; + --bs-list-group-active-border-color: #0d6efd; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); +} +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:focus, +.list-group-item-action:hover { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) + var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid + var(--bs-list-group-border-color); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, +.list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} +.list-group-item-primary { + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); +} +.list-group-item-secondary { + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); +} +.list-group-item-success { + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis); +} +.list-group-item-info { + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis); +} +.list-group-item-warning { + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); +} +.list-group-item-danger { + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); +} +.list-group-item-light { + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis); +} +.list-group-item-dark { + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); +} +.btn-close { + --bs-btn-close-color: #000; + --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.5; + --bs-btn-close-hover-opacity: 0.75; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; + --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + border: 0; + border-radius: 0.375rem; + opacity: var(--bs-btn-close-opacity); +} +.btn-close:hover { + color: var(--bs-btn-close-color); + text-decoration: none; + opacity: var(--bs-btn-close-hover-opacity); +} +.btn-close:focus { + outline: 0; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity); +} +.btn-close.disabled, +.btn-close:disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: var(--bs-btn-close-disabled-opacity); +} +.btn-close-white { + filter: var(--bs-btn-close-white-filter); +} +[data-bs-theme="dark"] .btn-close { + filter: var(--bs-btn-close-white-filter); +} +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid + var(--bs-toast-header-border-color); + border-top-left-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); + border-top-right-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: var(--bs-box-shadow-sm); + --bs-modal-inner-border-radius: calc( + var(--bs-border-radius-lg) - (var(--bs-border-width)) + ); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; +} +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid + var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) + calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) + calc(-0.5 * var(--bs-modal-header-padding-x)) + calc(-0.5 * var(--bs-modal-header-padding-y)) auto; +} +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid + var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: var(--bs-box-shadow); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-footer, +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-footer, + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-footer, + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-footer, + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-footer, + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-footer, + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + margin: var(--bs-tooltip-margin); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow, +.bs-tooltip-top .tooltip-arrow { + bottom: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before, +.bs-tooltip-top .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) + calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow, +.bs-tooltip-end .tooltip-arrow { + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before, +.bs-tooltip-end .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) + 0; + border-right-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow, +.bs-tooltip-bottom .tooltip-arrow { + top: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before, +.bs-tooltip-bottom .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow, +.bs-tooltip-start .tooltip-arrow { + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before, +.bs-tooltip-start .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 + calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); +} +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc( + var(--bs-border-radius-lg) - var(--bs-border-width) + ); + --bs-popover-box-shadow: var(--bs-box-shadow); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: inherit; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::after, +.popover .popover-arrow::before { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow, +.bs-popover-top > .popover-arrow { + bottom: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::after, +.bs-popover-top > .popover-arrow::before { + border-width: var(--bs-popover-arrow-height) + calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after, +.bs-popover-top > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow, +.bs-popover-end > .popover-arrow { + left: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::after, +.bs-popover-end > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) + 0; +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after, +.bs-popover-end > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow, +.bs-popover-bottom > .popover-arrow { + top: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::after, +.bs-popover-bottom > .popover-arrow::before { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after, +.bs-popover-bottom > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.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: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-header-bg); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow, +.bs-popover-start > .popover-arrow { + right: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::after, +.bs-popover-start > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 + calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after, +.bs-popover-start > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} +.popover-header { + padding: var(--bs-popover-header-padding-y) + var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); +} +.popover-header:empty { + display: none; +} +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} +.carousel { + position: relative; +} +.carousel.pointer-event { + touch-action: pan-y; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.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 0.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: 0.5; + transition: opacity 0.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: 0.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%; +} +.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: 0.5; + transition: opacity 0.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; +} +[data-bs-theme="dark"] .carousel .carousel-control-next-icon, +[data-bs-theme="dark"] .carousel .carousel-control-prev-icon, +[data-bs-theme="dark"].carousel .carousel-control-next-icon, +[data-bs-theme="dark"].carousel .carousel-control-prev-icon { + filter: invert(1) grayscale(100); +} +[data-bs-theme="dark"] .carousel .carousel-indicators [data-bs-target], +[data-bs-theme="dark"].carousel .carousel-indicators [data-bs-target] { + background-color: #000; +} +[data-bs-theme="dark"] .carousel .carousel-caption, +[data-bs-theme="dark"].carousel .carousel-caption { + color: #000; +} +.spinner-border, +.spinner-grow { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite + var(--bs-spinner-animation-name); +} +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, +.offcanvas-lg, +.offcanvas-md, +.offcanvas-sm, +.offcanvas-xl, +.offcanvas-xxl { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5; +} +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-sm.show:not(.hiding), + .offcanvas-sm.showing { + transform: none; + } + .offcanvas-sm.hiding, + .offcanvas-sm.show, + .offcanvas-sm.showing { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-md.show:not(.hiding), + .offcanvas-md.showing { + transform: none; + } + .offcanvas-md.hiding, + .offcanvas-md.show, + .offcanvas-md.showing { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-lg.show:not(.hiding), + .offcanvas-lg.showing { + transform: none; + } + .offcanvas-lg.hiding, + .offcanvas-lg.show, + .offcanvas-lg.showing { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xl.show:not(.hiding), + .offcanvas-xl.showing { + transform: none; + } + .offcanvas-xl.hiding, + .offcanvas-xl.show, + .offcanvas-xl.showing { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xxl.show:not(.hiding), + .offcanvas-xxl.showing { + transform: none; + } + .offcanvas-xxl.hiding, + .offcanvas-xxl.show, + .offcanvas-xxl.showing { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.show:not(.hiding), +.offcanvas.showing { + transform: none; +} +.offcanvas.hiding, +.offcanvas.show, +.offcanvas.showing { + visibility: visible; +} +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) + calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); +} +.offcanvas-title { + margin-bottom: 0; + line-height: var(--bs-offcanvas-title-line-height); +} +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} +.placeholder-xs { + min-height: 0.6em; +} +.placeholder-sm { + min-height: 0.8em; +} +.placeholder-lg { + min-height: 1.2em; +} +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} +@keyframes placeholder-glow { + 50% { + opacity: 0.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%; + animation: placeholder-wave 2s linear infinite; +} +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} +.text-bg-primary { + color: #fff !important; + background-color: RGBA( + var(--bs-primary-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-secondary { + color: #fff !important; + background-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-success { + color: #fff !important; + background-color: RGBA( + var(--bs-success-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-info { + color: #000 !important; + background-color: RGBA( + var(--bs-info-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-warning { + color: #000 !important; + background-color: RGBA( + var(--bs-warning-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-danger { + color: #fff !important; + background-color: RGBA( + var(--bs-danger-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-light { + color: #000 !important; + background-color: RGBA( + var(--bs-light-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-dark { + color: #fff !important; + background-color: RGBA( + var(--bs-dark-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.link-primary { + color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-primary:focus, +.link-primary:hover { + color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 10, + 88, + 202, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 10, + 88, + 202, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-secondary { + color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-secondary:focus, +.link-secondary:hover { + color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 86, + 94, + 100, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 86, + 94, + 100, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-success { + color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-success-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-success-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-success:focus, +.link-success:hover { + color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 20, + 108, + 67, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 20, + 108, + 67, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-info { + color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-info-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-info-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-info:focus, +.link-info:hover { + color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 61, + 213, + 243, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 61, + 213, + 243, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-warning { + color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-warning:focus, +.link-warning:hover { + color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 255, + 205, + 57, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 255, + 205, + 57, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-danger { + color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-danger:focus, +.link-danger:hover { + color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 176, + 42, + 55, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 176, + 42, + 55, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-light { + color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-light-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-light-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-light:focus, +.link-light:hover { + color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 249, + 250, + 251, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 249, + 250, + 251, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-dark { + color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-dark:focus, +.link-dark:hover { + color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 26, + 30, + 33, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 26, + 30, + 33, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-body-emphasis { + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 1) + ) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-body-emphasis:focus, +.link-body-emphasis:hover { + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 0.75) + ) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ) !important; +} +.focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) + var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) + var(--bs-focus-ring-color); +} +.icon-link { + display: inline-flex; + gap: 0.375rem; + align-items: center; + -webkit-text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-opacity, 0.5) + ); + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-opacity, 0.5) + ); + text-underline-offset: 0.25em; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: 0.2s ease-in-out transform; +} +@media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none; + } +} +.icon-link-hover:focus-visible > .bi, +.icon-link-hover:hover > .bi { + transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); +} +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; +} +.sticky-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; +} +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} +.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption), +.visually-hidden:not(caption) { + position: absolute !important; +} +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.vr { + display: inline-block; + align-self: stretch; + width: var(--bs-border-width); + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; +} +.align-baseline { + vertical-align: baseline !important; +} +.align-top { + vertical-align: top !important; +} +.align-middle { + vertical-align: middle !important; +} +.align-bottom { + vertical-align: bottom !important; +} +.align-text-bottom { + vertical-align: text-bottom !important; +} +.align-text-top { + vertical-align: text-top !important; +} +.float-start { + float: left !important; +} +.float-end { + float: right !important; +} +.float-none { + float: none !important; +} +.object-fit-contain { + -o-object-fit: contain !important; + object-fit: contain !important; +} +.object-fit-cover { + -o-object-fit: cover !important; + object-fit: cover !important; +} +.object-fit-fill { + -o-object-fit: fill !important; + object-fit: fill !important; +} +.object-fit-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; +} +.object-fit-none { + -o-object-fit: none !important; + object-fit: none !important; +} +.opacity-0 { + opacity: 0 !important; +} +.opacity-25 { + opacity: 0.25 !important; +} +.opacity-50 { + opacity: 0.5 !important; +} +.opacity-75 { + opacity: 0.75 !important; +} +.opacity-100 { + opacity: 1 !important; +} +.overflow-auto { + overflow: auto !important; +} +.overflow-hidden { + overflow: hidden !important; +} +.overflow-visible { + overflow: visible !important; +} +.overflow-scroll { + overflow: scroll !important; +} +.overflow-x-auto { + overflow-x: auto !important; +} +.overflow-x-hidden { + overflow-x: hidden !important; +} +.overflow-x-visible { + overflow-x: visible !important; +} +.overflow-x-scroll { + overflow-x: scroll !important; +} +.overflow-y-auto { + overflow-y: auto !important; +} +.overflow-y-hidden { + overflow-y: hidden !important; +} +.overflow-y-visible { + overflow-y: visible !important; +} +.overflow-y-scroll { + overflow-y: scroll !important; +} +.d-inline { + display: inline !important; +} +.d-inline-block { + display: inline-block !important; +} +.d-block { + display: block !important; +} +.d-grid { + display: grid !important; +} +.d-inline-grid { + display: inline-grid !important; +} +.d-table { + display: table !important; +} +.d-table-row { + display: table-row !important; +} +.d-table-cell { + display: table-cell !important; +} +.d-flex { + display: flex !important; +} +.d-inline-flex { + display: inline-flex !important; +} +.d-none { + display: none !important; +} +.shadow { + box-shadow: var(--bs-box-shadow) !important; +} +.shadow-sm { + box-shadow: var(--bs-box-shadow-sm) !important; +} +.shadow-lg { + box-shadow: var(--bs-box-shadow-lg) !important; +} +.shadow-none { + box-shadow: none !important; +} +.focus-ring-primary { + --bs-focus-ring-color: rgba( + var(--bs-primary-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-secondary { + --bs-focus-ring-color: rgba( + var(--bs-secondary-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-success { + --bs-focus-ring-color: rgba( + var(--bs-success-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-info { + --bs-focus-ring-color: rgba( + var(--bs-info-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-warning { + --bs-focus-ring-color: rgba( + var(--bs-warning-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-danger { + --bs-focus-ring-color: rgba( + var(--bs-danger-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-light { + --bs-focus-ring-color: rgba( + var(--bs-light-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-dark { + --bs-focus-ring-color: rgba( + var(--bs-dark-rgb), + var(--bs-focus-ring-opacity) + ); +} +.position-static { + position: static !important; +} +.position-relative { + position: relative !important; +} +.position-absolute { + position: absolute !important; +} +.position-fixed { + position: fixed !important; +} +.position-sticky { + position: -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: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-0 { + border: 0 !important; +} +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-top-0 { + border-top: 0 !important; +} +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-end-0 { + border-right: 0 !important; +} +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-bottom-0 { + border-bottom: 0 !important; +} +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-start-0 { + border-left: 0 !important; +} +.border-primary { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-primary-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-secondary-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-success { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-success-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} +.border-warning { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-warning-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-danger { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-danger-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-light { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-light-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} +.border-black { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-black-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-white { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-white-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; +} +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; +} +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; +} +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; +} +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; +} +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; +} +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; +} +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important; +} +.border-1 { + border-width: 1px !important; +} +.border-2 { + border-width: 2px !important; +} +.border-3 { + border-width: 3px !important; +} +.border-4 { + border-width: 4px !important; +} +.border-5 { + border-width: 5px !important; +} +.border-opacity-10 { + --bs-border-opacity: 0.1; +} +.border-opacity-25 { + --bs-border-opacity: 0.25; +} +.border-opacity-50 { + --bs-border-opacity: 0.5; +} +.border-opacity-75 { + --bs-border-opacity: 0.75; +} +.border-opacity-100 { + --bs-border-opacity: 1; +} +.w-25 { + width: 25% !important; +} +.w-50 { + width: 50% !important; +} +.w-75 { + width: 75% !important; +} +.w-100 { + width: 100% !important; +} +.w-auto { + width: auto !important; +} +.mw-100 { + max-width: 100% !important; +} +.vw-100 { + width: 100vw !important; +} +.min-vw-100 { + min-width: 100vw !important; +} +.h-25 { + height: 25% !important; +} +.h-50 { + height: 50% !important; +} +.h-75 { + height: 75% !important; +} +.h-100 { + height: 100% !important; +} +.h-auto { + height: auto !important; +} +.mh-100 { + max-height: 100% !important; +} +.vh-100 { + height: 100vh !important; +} +.min-vh-100 { + min-height: 100vh !important; +} +.flex-fill { + flex: 1 1 auto !important; +} +.flex-row { + flex-direction: row !important; +} +.flex-column { + flex-direction: column !important; +} +.flex-row-reverse { + flex-direction: row-reverse !important; +} +.flex-column-reverse { + flex-direction: column-reverse !important; +} +.flex-grow-0 { + flex-grow: 0 !important; +} +.flex-grow-1 { + flex-grow: 1 !important; +} +.flex-shrink-0 { + flex-shrink: 0 !important; +} +.flex-shrink-1 { + flex-shrink: 1 !important; +} +.flex-wrap { + flex-wrap: wrap !important; +} +.flex-nowrap { + flex-wrap: nowrap !important; +} +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-start { + justify-content: flex-start !important; +} +.justify-content-end { + justify-content: flex-end !important; +} +.justify-content-center { + justify-content: center !important; +} +.justify-content-between { + justify-content: space-between !important; +} +.justify-content-around { + justify-content: space-around !important; +} +.justify-content-evenly { + justify-content: space-evenly !important; +} +.align-items-start { + align-items: flex-start !important; +} +.align-items-end { + align-items: flex-end !important; +} +.align-items-center { + align-items: center !important; +} +.align-items-baseline { + align-items: baseline !important; +} +.align-items-stretch { + align-items: stretch !important; +} +.align-content-start { + align-content: flex-start !important; +} +.align-content-end { + align-content: flex-end !important; +} +.align-content-center { + align-content: center !important; +} +.align-content-between { + align-content: space-between !important; +} +.align-content-around { + align-content: space-around !important; +} +.align-content-stretch { + align-content: stretch !important; +} +.align-self-auto { + align-self: auto !important; +} +.align-self-start { + align-self: flex-start !important; +} +.align-self-end { + align-self: flex-end !important; +} +.align-self-center { + align-self: center !important; +} +.align-self-baseline { + align-self: baseline !important; +} +.align-self-stretch { + align-self: stretch !important; +} +.order-first { + order: -1 !important; +} +.order-0 { + order: 0 !important; +} +.order-1 { + order: 1 !important; +} +.order-2 { + order: 2 !important; +} +.order-3 { + order: 3 !important; +} +.order-4 { + order: 4 !important; +} +.order-5 { + order: 5 !important; +} +.order-last { + order: 6 !important; +} +.m-0 { + margin: 0 !important; +} +.m-1 { + margin: 0.25rem !important; +} +.m-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; +} +.mt-2 { + margin-top: 0.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: 0.25rem !important; +} +.me-2 { + margin-right: 0.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: 0.25rem !important; +} +.mb-2 { + margin-bottom: 0.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: 0.25rem !important; +} +.ms-2 { + margin-left: 0.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: 0.25rem !important; +} +.p-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; +} +.pt-2 { + padding-top: 0.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: 0.25rem !important; +} +.pe-2 { + padding-right: 0.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: 0.25rem !important; +} +.pb-2 { + padding-bottom: 0.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: 0.25rem !important; +} +.ps-2 { + padding-left: 0.5rem !important; +} +.ps-3 { + padding-left: 1rem !important; +} +.ps-4 { + padding-left: 1.5rem !important; +} +.ps-5 { + padding-left: 3rem !important; +} +.gap-0 { + gap: 0 !important; +} +.gap-1 { + gap: 0.25rem !important; +} +.gap-2 { + gap: 0.5rem !important; +} +.gap-3 { + gap: 1rem !important; +} +.gap-4 { + gap: 1.5rem !important; +} +.gap-5 { + gap: 3rem !important; +} +.row-gap-0 { + row-gap: 0 !important; +} +.row-gap-1 { + row-gap: 0.25rem !important; +} +.row-gap-2 { + row-gap: 0.5rem !important; +} +.row-gap-3 { + row-gap: 1rem !important; +} +.row-gap-4 { + row-gap: 1.5rem !important; +} +.row-gap-5 { + row-gap: 3rem !important; +} +.column-gap-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; +} +.column-gap-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; +} +.column-gap-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; +} +.column-gap-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; +} +.column-gap-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; +} +.column-gap-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; +} +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} +.fs-5 { + font-size: 1.25rem !important; +} +.fs-6 { + font-size: 1rem !important; +} +.fst-italic { + font-style: italic !important; +} +.fst-normal { + font-style: normal !important; +} +.fw-lighter { + font-weight: lighter !important; +} +.fw-light { + font-weight: 300 !important; +} +.fw-normal { + font-weight: 400 !important; +} +.fw-medium { + font-weight: 500 !important; +} +.fw-semibold { + font-weight: 600 !important; +} +.fw-bold { + font-weight: 700 !important; +} +.fw-bolder { + font-weight: bolder !important; +} +.lh-1 { + line-height: 1 !important; +} +.lh-sm { + line-height: 1.25 !important; +} +.lh-base { + line-height: 1.5 !important; +} +.lh-lg { + line-height: 2 !important; +} +.text-start { + text-align: left !important; +} +.text-end { + text-align: right !important; +} +.text-center { + text-align: center !important; +} +.text-decoration-none { + text-decoration: none !important; +} +.text-decoration-underline { + text-decoration: underline !important; +} +.text-decoration-line-through { + text-decoration: line-through !important; +} +.text-lowercase { + text-transform: lowercase !important; +} +.text-uppercase { + text-transform: uppercase !important; +} +.text-capitalize { + text-transform: capitalize !important; +} +.text-wrap { + white-space: normal !important; +} +.text-nowrap { + white-space: nowrap !important; +} +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} +.text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; +} +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important; +} +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} +.text-opacity-25 { + --bs-text-opacity: 0.25; +} +.text-opacity-50 { + --bs-text-opacity: 0.5; +} +.text-opacity-75 { + --bs-text-opacity: 0.75; +} +.text-opacity-100 { + --bs-text-opacity: 1; +} +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; +} +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; +} +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; +} +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; +} +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; +} +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; +} +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; +} +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; +} +.link-opacity-10 { + --bs-link-opacity: 0.1; +} +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; +} +.link-opacity-25 { + --bs-link-opacity: 0.25; +} +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; +} +.link-opacity-50 { + --bs-link-opacity: 0.5; +} +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; +} +.link-opacity-75 { + --bs-link-opacity: 0.75; +} +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; +} +.link-opacity-100 { + --bs-link-opacity: 1; +} +.link-opacity-100-hover:hover { + --bs-link-opacity: 1; +} +.link-offset-1 { + text-underline-offset: 0.125em !important; +} +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; +} +.link-offset-2 { + text-underline-offset: 0.25em !important; +} +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; +} +.link-offset-3 { + text-underline-offset: 0.375em !important; +} +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; +} +.link-underline-primary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-secondary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-success { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-info { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-warning { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-danger { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-light { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-dark { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1; +} +.link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1; +} +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-primary-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-secondary-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-success-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-warning-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-danger-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-light-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-black-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-white-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-body-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-secondary-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-tertiary-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} +.bg-opacity-100 { + --bs-bg-opacity: 1; +} +.bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; +} +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; +} +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; +} +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; +} +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; +} +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; +} +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; +} +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; +} +.bg-gradient { + background-image: var(--bs-gradient) !important; +} +.user-select-all { + -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: var(--bs-border-radius) !important; +} +.rounded-0 { + border-radius: 0 !important; +} +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-circle { + border-radius: 50% !important; +} +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; +} +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; +} +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; +} +.visible { + visibility: visible !important; +} +.invisible { + visibility: hidden !important; +} +.z-n1 { + z-index: -1 !important; +} +.z-0 { + z-index: 0 !important; +} +.z-1 { + z-index: 1 !important; +} +.z-2 { + z-index: 2 !important; +} +.z-3 { + z-index: 3 !important; +} +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .object-fit-sm-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-sm-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-sm-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-sm-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-sm-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-inline-grid { + display: inline-grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-sm-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .row-gap-sm-0 { + row-gap: 0 !important; + } + .row-gap-sm-1 { + row-gap: 0.25rem !important; + } + .row-gap-sm-2 { + row-gap: 0.5rem !important; + } + .row-gap-sm-3 { + row-gap: 1rem !important; + } + .row-gap-sm-4 { + row-gap: 1.5rem !important; + } + .row-gap-sm-5 { + row-gap: 3rem !important; + } + .column-gap-sm-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-sm-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-sm-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-sm-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-sm-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-sm-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .object-fit-md-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-md-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-md-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-md-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-md-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-inline-grid { + display: inline-grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-md-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .row-gap-md-0 { + row-gap: 0 !important; + } + .row-gap-md-1 { + row-gap: 0.25rem !important; + } + .row-gap-md-2 { + row-gap: 0.5rem !important; + } + .row-gap-md-3 { + row-gap: 1rem !important; + } + .row-gap-md-4 { + row-gap: 1.5rem !important; + } + .row-gap-md-5 { + row-gap: 3rem !important; + } + .column-gap-md-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-md-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-md-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-md-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-md-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-md-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .object-fit-lg-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-lg-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-lg-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-lg-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-lg-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-inline-grid { + display: inline-grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-lg-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .row-gap-lg-0 { + row-gap: 0 !important; + } + .row-gap-lg-1 { + row-gap: 0.25rem !important; + } + .row-gap-lg-2 { + row-gap: 0.5rem !important; + } + .row-gap-lg-3 { + row-gap: 1rem !important; + } + .row-gap-lg-4 { + row-gap: 1.5rem !important; + } + .row-gap-lg-5 { + row-gap: 3rem !important; + } + .column-gap-lg-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-lg-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-lg-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-lg-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-lg-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-lg-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .object-fit-xl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-inline-grid { + display: inline-grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-xl-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .row-gap-xl-0 { + row-gap: 0 !important; + } + .row-gap-xl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xl-3 { + row-gap: 1rem !important; + } + .row-gap-xl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xl-5 { + row-gap: 3rem !important; + } + .column-gap-xl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .object-fit-xxl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xxl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xxl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xxl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xxl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-inline-grid { + display: inline-grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .row-gap-xxl-0 { + row-gap: 0 !important; + } + .row-gap-xxl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xxl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xxl-3 { + row-gap: 1rem !important; + } + .row-gap-xxl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xxl-5 { + row-gap: 3rem !important; + } + .column-gap-xxl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xxl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xxl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xxl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xxl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xxl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-inline-grid { + display: inline-grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/src/main/webapp/bootstrap-5.3.2/js/bootstrap.min.js b/src/main/webapp/bootstrap-5.3.2/js/bootstrap.min.js new file mode 100644 index 0000000..3593c40 --- /dev/null +++ b/src/main/webapp/bootstrap-5.3.2/js/bootstrap.min.js @@ -0,0 +1,2212 @@ +/*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 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(require("@popperjs/core")) : "function" == typeof define && define.amd ? define(["@popperjs/core"], e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).bootstrap = e(t.Popper) +}(this, (function(t) { + "use strict"; + + function e(t) { + const e = Object.create(null, { + [Symbol.toStringTag]: { + value: "Module" + } + }); + if (t) + for (const i in t) + if ("default" !== i) { + const s = Object.getOwnPropertyDescriptor(t, i); + Object.defineProperty(e, i, s.get ? s : { + enumerable: !0, + get: () => t[i] + }) + } return e.default = t, Object.freeze(e) + } + const i = e(t), + s = new Map, + n = { + set(t, e, i) { + s.has(t) || s.set(t, new Map); + const n = s.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) => s.has(t) && s.get(t).get(e) || null, + remove(t, e) { + if (!s.has(t)) return; + const i = s.get(t); + i.delete(e), 0 === i.size && s.delete(t) + } + }, + o = "transitionend", + r = t => (t && window.CSS && window.CSS.escape && (t = t.replace(/#([^\s"#']+)/g, ((t, e) => `#${CSS.escape(e)}`))), t), + a = t => { + t.dispatchEvent(new Event(o)) + }, + l = t => !(!t || "object" != typeof t) && (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), + c = t => l(t) ? t.jquery ? t[0] : t : "string" == typeof t && t.length > 0 ? document.querySelector(r(t)) : null, + h = t => { + if (!l(t) || 0 === t.getClientRects().length) return !1; + const e = "visible" === getComputedStyle(t).getPropertyValue("visibility"), + i = t.closest("details:not([open])"); + if (!i) return e; + if (i !== t) { + const e = t.closest("summary"); + if (e && e.parentNode !== i) return !1; + if (null === e) return !1 + } + return e + }, + d = t => !t || t.nodeType !== Node.ELEMENT_NODE || !!t.classList.contains("disabled") || (void 0 !== t.disabled ? t.disabled : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")), + u = 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 ? u(t.parentNode) : null + }, + _ = () => { }, + g = t => { + t.offsetHeight + }, + f = () => window.jQuery && !document.body.hasAttribute("data-bs-no-jquery") ? window.jQuery : null, + m = [], + p = () => "rtl" === document.documentElement.dir, + b = t => { + var e; + e = () => { + const e = f(); + if (e) { + const i = t.NAME, + s = e.fn[i]; + e.fn[i] = t.jQueryInterface, e.fn[i].Constructor = t, e.fn[i].noConflict = () => (e.fn[i] = s, t.jQueryInterface) + } + }, "loading" === document.readyState ? (m.length || document.addEventListener("DOMContentLoaded", (() => { + for (const t of m) t() + })), m.push(e)) : e() + }, + v = (t, e = [], i = t) => "function" == typeof t ? t(...e) : i, + y = (t, e, i = !0) => { + if (!i) return void v(t); + const s = (t => { + if (!t) return 0; + let { + transitionDuration: e, + transitionDelay: i + } = window.getComputedStyle(t); + const s = Number.parseFloat(e), + n = Number.parseFloat(i); + return s || n ? (e = e.split(",")[0], i = i.split(",")[0], 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) : 0 + })(e) + 5; + let n = !1; + const r = ({ + target: i + }) => { + i === e && (n = !0, e.removeEventListener(o, r), v(t)) + }; + e.addEventListener(o, r), setTimeout((() => { + n || a(e) + }), s) + }, + w = (t, e, i, s) => { + const n = t.length; + let o = t.indexOf(e); + return -1 === o ? !i && s ? t[n - 1] : t[0] : (o += i ? 1 : -1, s && (o = (o + n) % n), t[Math.max(0, Math.min(o, n - 1))]) + }, + A = /[^.]*(?=\..*)\.|.*/, + E = /\..*/, + C = /::\d+$/, + T = {}; + let k = 1; + const $ = { + mouseenter: "mouseover", + mouseleave: "mouseout" + }, + S = 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}::${k++}` || t.uidEvent || k++ + } + + function O(t) { + const e = L(t); + return t.uidEvent = e, T[e] = T[e] || {}, T[e] + } + + function I(t, e, i = null) { + return Object.values(t).find((t => t.callable === e && t.delegationSelector === i)) + } + + function D(t, e, i) { + const s = "string" == typeof e, + n = s ? i : e || i; + let o = M(t); + return S.has(o) || (o = t), [s, n, o] + } + + function N(t, e, i, s, n) { + if ("string" != typeof e || !t) return; + let [o, r, a] = D(e, i, s); + if (e in $) { + const t = t => function(e) { + if (!e.relatedTarget || e.relatedTarget !== e.delegateTarget && !e.delegateTarget.contains(e.relatedTarget)) return t.call(this, e) + }; + r = t(r) + } + const l = O(t), + c = l[a] || (l[a] = {}), + h = I(c, r, o ? i : null); + if (h) return void (h.oneOff = h.oneOff && n); + const d = L(r, e.replace(A, "")), + u = o ? function(t, e, i) { + return function s(n) { + const o = t.querySelectorAll(e); + for (let { + target: r + } = n; r && r !== this; r = r.parentNode) + for (const a of o) + if (a === r) return F(n, { + delegateTarget: r + }), s.oneOff && j.off(t, n.type, e, i), i.apply(r, [n]) + } + }(t, i, r) : function(t, e) { + return function i(s) { + return F(s, { + delegateTarget: t + }), i.oneOff && j.off(t, s.type, e), e.apply(t, [s]) + } + }(t, r); + u.delegationSelector = o ? i : null, u.callable = r, u.oneOff = n, u.uidEvent = d, c[d] = u, t.addEventListener(a, u, o) + } + + function P(t, e, i, s, n) { + const o = I(e[i], s, n); + o && (t.removeEventListener(i, o, Boolean(n)), delete e[i][o.uidEvent]) + } + + function x(t, e, i, s) { + const n = e[i] || {}; + for (const [o, r] of Object.entries(n)) o.includes(s) && P(t, e, i, r.callable, r.delegationSelector) + } + + function M(t) { + return t = t.replace(E, ""), $[t] || t + } + const j = { + on(t, e, i, s) { + N(t, e, i, s, !1) + }, + one(t, e, i, s) { + N(t, e, i, s, !0) + }, + off(t, e, i, s) { + if ("string" != typeof e || !t) return; + const [n, o, r] = D(e, i, s), a = r !== e, l = O(t), c = l[r] || {}, h = e.startsWith("."); + if (void 0 === o) { + if (h) + for (const i of Object.keys(l)) x(t, l, i, e.slice(1)); + for (const [i, s] of Object.entries(c)) { + const n = i.replace(C, ""); + a && !e.includes(n) || P(t, l, r, s.callable, s.delegationSelector) + } + } else { + if (!Object.keys(c).length) return; + P(t, l, r, o, n ? i : null) + } + }, + trigger(t, e, i) { + if ("string" != typeof e || !t) return null; + const s = f(); + let n = null, + o = !0, + r = !0, + a = !1; + e !== M(e) && s && (n = s.Event(e, i), s(t).trigger(n), o = !n.isPropagationStopped(), r = !n.isImmediatePropagationStopped(), a = n.isDefaultPrevented()); + const l = F(new Event(e, { + bubbles: o, + cancelable: !0 + }), i); + return a && l.preventDefault(), r && t.dispatchEvent(l), l.defaultPrevented && n && n.preventDefault(), l + } + }; + + function F(t, e = {}) { + for (const [i, s] of Object.entries(e)) try { + t[i] = s + } catch (e) { + Object.defineProperty(t, i, { + configurable: !0, + get: () => s + }) + } + return t + } + + function z(t) { + if ("true" === t) return !0; + if ("false" === t) return !1; + if (t === Number(t).toString()) return Number(t); + if ("" === t || "null" === t) return null; + if ("string" != typeof t) return t; + try { + return JSON.parse(decodeURIComponent(t)) + } catch (e) { + return t + } + } + + function H(t) { + return t.replace(/[A-Z]/g, (t => `-${t.toLowerCase()}`)) + } + const B = { + setDataAttribute(t, e, i) { + t.setAttribute(`data-bs-${H(e)}`, i) + }, + removeDataAttribute(t, e) { + t.removeAttribute(`data-bs-${H(e)}`) + }, + getDataAttributes(t) { + if (!t) return {}; + const e = {}, + i = Object.keys(t.dataset).filter((t => t.startsWith("bs") && !t.startsWith("bsConfig"))); + for (const s of i) { + let i = s.replace(/^bs/, ""); + i = i.charAt(0).toLowerCase() + i.slice(1, i.length), e[i] = z(t.dataset[s]) + } + return e + }, + getDataAttribute: (t, e) => z(t.getAttribute(`data-bs-${H(e)}`)) + }; + class q { + static get Default() { + return {} + } + static get DefaultType() { + return {} + } + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!') + } + _getConfig(t) { + return t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t + } + _configAfterMerge(t) { + return t + } + _mergeConfigObj(t, e) { + const i = l(e) ? B.getDataAttribute(e, "config") : {}; + return { + ...this.constructor.Default, + ..."object" == typeof i ? i : {}, + ...l(e) ? B.getDataAttributes(e) : {}, + ..."object" == typeof t ? t : {} + } + } + _typeCheckConfig(t, e = this.constructor.DefaultType) { + for (const [s, n] of Object.entries(e)) { + const e = t[s], + o = l(e) ? "element" : null == (i = e) ? `${i}` : Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase(); + if (!new RegExp(n).test(o)) throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${s}" provided type "${o}" but expected type "${n}".`) + } + var i + } + } + class W extends q { + constructor(t, e) { + super(), (t = c(t)) && (this._element = t, this._config = this._getConfig(e), n.set(this._element, this.constructor.DATA_KEY, this)) + } + dispose() { + n.remove(this._element, this.constructor.DATA_KEY), j.off(this._element, this.constructor.EVENT_KEY); + for (const t of Object.getOwnPropertyNames(this)) this[t] = null + } + _queueCallback(t, e, i = !0) { + y(t, e, i) + } + _getConfig(t) { + return t = this._mergeConfigObj(t, this._element), t = this._configAfterMerge(t), this._typeCheckConfig(t), t + } + static getInstance(t) { + return n.get(c(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.3.2" + } + static get DATA_KEY() { + return `bs.${this.NAME}` + } + static get EVENT_KEY() { + return `.${this.DATA_KEY}` + } + static eventName(t) { + return `${t}${this.EVENT_KEY}` + } + } + const R = 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 ? r(i.trim()) : null + } + return e + }, + K = { + 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 s = t.parentNode.closest(e); + for (; s;) i.push(s), s = s.parentNode.closest(e); + 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 => !d(t) && h(t))) + }, + getSelectorFromElement(t) { + const e = R(t); + return e && K.findOne(e) ? e : null + }, + getElementFromSelector(t) { + const e = R(t); + return e ? K.findOne(e) : null + }, + getMultipleElementsFromSelector(t) { + const e = R(t); + return e ? K.find(e) : [] + } + }, + V = (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(), d(this)) return; + const n = K.getElementFromSelector(this) || this.closest(`.${s}`); + t.getOrCreateInstance(n)[e]() + })) + }, + Q = ".bs.alert", + X = `close${Q}`, + Y = `closed${Q}`; + class U extends W { + static get NAME() { + return "alert" + } + close() { + if (j.trigger(this._element, X).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, Y), this.dispose() + } + static jQueryInterface(t) { + return this.each((function() { + const e = U.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) + } + })) + } + } + V(U, "close"), b(U); + const G = '[data-bs-toggle="button"]'; + class J extends W { + 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 = J.getOrCreateInstance(this); + "toggle" === t && e[t]() + })) + } + } + j.on(document, "click.bs.button.data-api", G, (t => { + t.preventDefault(); + const e = t.target.closest(G); + J.getOrCreateInstance(e).toggle() + })), b(J); + const Z = ".bs.swipe", + tt = `touchstart${Z}`, + et = `touchmove${Z}`, + it = `touchend${Z}`, + st = `pointerdown${Z}`, + nt = `pointerup${Z}`, + ot = { + endCallback: null, + leftCallback: null, + rightCallback: null + }, + rt = { + endCallback: "(function|null)", + leftCallback: "(function|null)", + rightCallback: "(function|null)" + }; + class at extends q { + constructor(t, e) { + super(), this._element = t, t && at.isSupported() && (this._config = this._getConfig(e), this._deltaX = 0, this._supportPointerEvents = Boolean(window.PointerEvent), this._initEvents()) + } + static get Default() { + return ot + } + static get DefaultType() { + return rt + } + static get NAME() { + return "swipe" + } + dispose() { + j.off(this._element, Z) + } + _start(t) { + this._supportPointerEvents ? this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX) : this._deltaX = t.touches[0].clientX + } + _end(t) { + this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX - this._deltaX), this._handleSwipe(), v(this._config.endCallback) + } + _move(t) { + this._deltaX = t.touches && t.touches.length > 1 ? 0 : t.touches[0].clientX - this._deltaX + } + _handleSwipe() { + const t = Math.abs(this._deltaX); + if (t <= 40) return; + const e = t / this._deltaX; + this._deltaX = 0, e && v(e > 0 ? this._config.rightCallback : this._config.leftCallback) + } + _initEvents() { + this._supportPointerEvents ? (j.on(this._element, st, (t => this._start(t))), j.on(this._element, nt, (t => this._end(t))), this._element.classList.add("pointer-event")) : (j.on(this._element, tt, (t => this._start(t))), j.on(this._element, et, (t => this._move(t))), j.on(this._element, it, (t => this._end(t)))) + } + _eventIsPointerPenTouch(t) { + return this._supportPointerEvents && ("pen" === t.pointerType || "touch" === t.pointerType) + } + static isSupported() { + return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0 + } + } + const lt = ".bs.carousel", + ct = ".data-api", + ht = "next", + dt = "prev", + ut = "left", + _t = "right", + gt = `slide${lt}`, + ft = `slid${lt}`, + mt = `keydown${lt}`, + pt = `mouseenter${lt}`, + bt = `mouseleave${lt}`, + vt = `dragstart${lt}`, + yt = `load${lt}${ct}`, + wt = `click${lt}${ct}`, + At = "carousel", + Et = "active", + Ct = ".active", + Tt = ".carousel-item", + kt = Ct + Tt, + $t = { + ArrowLeft: _t, + ArrowRight: ut + }, + St = { + interval: 5e3, + keyboard: !0, + pause: "hover", + ride: !1, + touch: !0, + wrap: !0 + }, + Lt = { + interval: "(number|boolean)", + keyboard: "boolean", + pause: "(string|boolean)", + ride: "(boolean|string)", + touch: "boolean", + wrap: "boolean" + }; + class Ot extends W { + constructor(t, e) { + super(t, e), this._interval = null, this._activeElement = null, this._isSliding = !1, this.touchTimeout = null, this._swipeHelper = null, this._indicatorsElement = K.findOne(".carousel-indicators", this._element), this._addEventListeners(), this._config.ride === At && this.cycle() + } + static get Default() { + return St + } + static get DefaultType() { + return Lt + } + static get NAME() { + return "carousel" + } + next() { + this._slide(ht) + } + nextWhenVisible() { + !document.hidden && h(this._element) && this.next() + } + prev() { + this._slide(dt) + } + pause() { + this._isSliding && a(this._element), this._clearInterval() + } + cycle() { + this._clearInterval(), this._updateInterval(), this._interval = setInterval((() => this.nextWhenVisible()), this._config.interval) + } + _maybeEnableCycle() { + this._config.ride && (this._isSliding ? j.one(this._element, ft, (() => this.cycle())) : this.cycle()) + } + to(t) { + const e = this._getItems(); + if (t > e.length - 1 || t < 0) return; + if (this._isSliding) return void j.one(this._element, ft, (() => this.to(t))); + const i = this._getItemIndex(this._getActive()); + if (i === t) return; + const s = t > i ? ht : dt; + this._slide(s, e[t]) + } + dispose() { + this._swipeHelper && this._swipeHelper.dispose(), super.dispose() + } + _configAfterMerge(t) { + return t.defaultInterval = t.interval, t + } + _addEventListeners() { + this._config.keyboard && j.on(this._element, mt, (t => this._keydown(t))), "hover" === this._config.pause && (j.on(this._element, pt, (() => this.pause())), j.on(this._element, bt, (() => this._maybeEnableCycle()))), this._config.touch && at.isSupported() && this._addTouchEventListeners() + } + _addTouchEventListeners() { + for (const t of K.find(".carousel-item img", this._element)) j.on(t, vt, (t => t.preventDefault())); + const t = { + leftCallback: () => this._slide(this._directionToOrder(ut)), + rightCallback: () => this._slide(this._directionToOrder(_t)), + endCallback: () => { + "hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout((() => this._maybeEnableCycle()), 500 + this._config.interval)) + } + }; + this._swipeHelper = new at(this._element, t) + } + _keydown(t) { + if (/input|textarea/i.test(t.target.tagName)) return; + const e = $t[t.key]; + e && (t.preventDefault(), this._slide(this._directionToOrder(e))) + } + _getItemIndex(t) { + return this._getItems().indexOf(t) + } + _setActiveIndicatorElement(t) { + if (!this._indicatorsElement) return; + const e = K.findOne(Ct, this._indicatorsElement); + e.classList.remove(Et), e.removeAttribute("aria-current"); + const i = K.findOne(`[data-bs-slide-to="${t}"]`, this._indicatorsElement); + i && (i.classList.add(Et), i.setAttribute("aria-current", "true")) + } + _updateInterval() { + const t = this._activeElement || this._getActive(); + if (!t) return; + const e = Number.parseInt(t.getAttribute("data-bs-interval"), 10); + this._config.interval = e || this._config.defaultInterval + } + _slide(t, e = null) { + if (this._isSliding) return; + const i = this._getActive(), + s = t === ht, + n = e || w(this._getItems(), i, s, this._config.wrap); + if (n === i) return; + const o = this._getItemIndex(n), + r = e => j.trigger(this._element, e, { + relatedTarget: n, + direction: this._orderToDirection(t), + from: this._getItemIndex(i), + to: o + }); + if (r(gt).defaultPrevented) return; + if (!i || !n) return; + const a = Boolean(this._interval); + this.pause(), this._isSliding = !0, this._setActiveIndicatorElement(o), this._activeElement = n; + const l = s ? "carousel-item-start" : "carousel-item-end", + c = s ? "carousel-item-next" : "carousel-item-prev"; + n.classList.add(c), g(n), i.classList.add(l), n.classList.add(l), this._queueCallback((() => { + n.classList.remove(l, c), n.classList.add(Et), i.classList.remove(Et, c, l), this._isSliding = !1, r(ft) + }), i, this._isAnimated()), a && this.cycle() + } + _isAnimated() { + return this._element.classList.contains("slide") + } + _getActive() { + return K.findOne(kt, this._element) + } + _getItems() { + return K.find(Tt, this._element) + } + _clearInterval() { + this._interval && (clearInterval(this._interval), this._interval = null) + } + _directionToOrder(t) { + return p() ? t === ut ? dt : ht : t === ut ? ht : dt + } + _orderToDirection(t) { + return p() ? t === dt ? ut : _t : t === dt ? _t : ut + } + static jQueryInterface(t) { + return this.each((function() { + const e = Ot.getOrCreateInstance(this, t); + if ("number" != typeof t) { + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + } else e.to(t) + })) + } + } + j.on(document, wt, "[data-bs-slide], [data-bs-slide-to]", (function(t) { + const e = K.getElementFromSelector(this); + if (!e || !e.classList.contains(At)) return; + t.preventDefault(); + const i = Ot.getOrCreateInstance(e), + s = this.getAttribute("data-bs-slide-to"); + return s ? (i.to(s), void i._maybeEnableCycle()) : "next" === B.getDataAttribute(this, "slide") ? (i.next(), void i._maybeEnableCycle()) : (i.prev(), void i._maybeEnableCycle()) + })), j.on(window, yt, (() => { + const t = K.find('[data-bs-ride="carousel"]'); + for (const e of t) Ot.getOrCreateInstance(e) + })), b(Ot); + const It = ".bs.collapse", + Dt = `show${It}`, + Nt = `shown${It}`, + Pt = `hide${It}`, + xt = `hidden${It}`, + Mt = `click${It}.data-api`, + jt = "show", + Ft = "collapse", + zt = "collapsing", + Ht = `:scope .${Ft} .${Ft}`, + Bt = '[data-bs-toggle="collapse"]', + qt = { + parent: null, + toggle: !0 + }, + Wt = { + parent: "(null|element)", + toggle: "boolean" + }; + class Rt extends W { + constructor(t, e) { + super(t, e), this._isTransitioning = !1, this._triggerArray = []; + const i = K.find(Bt); + for (const t of i) { + const e = K.getSelectorFromElement(t), + i = K.find(e).filter((t => t === this._element)); + null !== e && i.length && this._triggerArray.push(t) + } + this._initializeChildren(), this._config.parent || this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), this._config.toggle && this.toggle() + } + static get Default() { + return qt + } + static get DefaultType() { + return Wt + } + static get NAME() { + return "collapse" + } + toggle() { + this._isShown() ? this.hide() : this.show() + } + show() { + if (this._isTransitioning || this._isShown()) return; + let t = []; + if (this._config.parent && (t = this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t => t !== this._element)).map((t => Rt.getOrCreateInstance(t, { + toggle: !1 + })))), t.length && t[0]._isTransitioning) return; + if (j.trigger(this._element, Dt).defaultPrevented) return; + for (const e of t) e.hide(); + const e = this._getDimension(); + this._element.classList.remove(Ft), this._element.classList.add(zt), this._element.style[e] = 0, this._addAriaAndCollapsedClass(this._triggerArray, !0), this._isTransitioning = !0; + const i = `scroll${e[0].toUpperCase() + e.slice(1)}`; + this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(zt), this._element.classList.add(Ft, jt), this._element.style[e] = "", j.trigger(this._element, Nt) + }), this._element, !0), this._element.style[e] = `${this._element[i]}px` + } + hide() { + if (this._isTransitioning || !this._isShown()) return; + if (j.trigger(this._element, Pt).defaultPrevented) return; + const t = this._getDimension(); + this._element.style[t] = `${this._element.getBoundingClientRect()[t]}px`, g(this._element), this._element.classList.add(zt), this._element.classList.remove(Ft, jt); + for (const t of this._triggerArray) { + const e = K.getElementFromSelector(t); + e && !this._isShown(e) && this._addAriaAndCollapsedClass([t], !1) + } + this._isTransitioning = !0, this._element.style[t] = "", this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(zt), this._element.classList.add(Ft), j.trigger(this._element, xt) + }), this._element, !0) + } + _isShown(t = this._element) { + return t.classList.contains(jt) + } + _configAfterMerge(t) { + return t.toggle = Boolean(t.toggle), t.parent = c(t.parent), t + } + _getDimension() { + return this._element.classList.contains("collapse-horizontal") ? "width" : "height" + } + _initializeChildren() { + if (!this._config.parent) return; + const t = this._getFirstLevelChildren(Bt); + for (const e of t) { + const t = K.getElementFromSelector(e); + t && this._addAriaAndCollapsedClass([e], this._isShown(t)) + } + } + _getFirstLevelChildren(t) { + const e = K.find(Ht, this._config.parent); + return K.find(t, this._config.parent).filter((t => !e.includes(t))) + } + _addAriaAndCollapsedClass(t, e) { + if (t.length) + for (const i of t) i.classList.toggle("collapsed", !e), i.setAttribute("aria-expanded", e) + } + static jQueryInterface(t) { + const e = {}; + return "string" == typeof t && /show|hide/.test(t) && (e.toggle = !1), this.each((function() { + const i = Rt.getOrCreateInstance(this, e); + if ("string" == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t]() + } + })) + } + } + j.on(document, Mt, Bt, (function(t) { + ("A" === t.target.tagName || t.delegateTarget && "A" === t.delegateTarget.tagName) && t.preventDefault(); + for (const t of K.getMultipleElementsFromSelector(this)) Rt.getOrCreateInstance(t, { + toggle: !1 + }).toggle() + })), b(Rt); + const Kt = "dropdown", + Vt = ".bs.dropdown", + Qt = ".data-api", + Xt = "ArrowUp", + Yt = "ArrowDown", + Ut = `hide${Vt}`, + Gt = `hidden${Vt}`, + Jt = `show${Vt}`, + Zt = `shown${Vt}`, + te = `click${Vt}${Qt}`, + ee = `keydown${Vt}${Qt}`, + ie = `keyup${Vt}${Qt}`, + se = "show", + ne = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)', + oe = `${ne}.${se}`, + re = ".dropdown-menu", + ae = p() ? "top-end" : "top-start", + le = p() ? "top-start" : "top-end", + ce = p() ? "bottom-end" : "bottom-start", + he = p() ? "bottom-start" : "bottom-end", + de = p() ? "left-start" : "right-start", + ue = p() ? "right-start" : "left-start", + _e = { + autoClose: !0, + boundary: "clippingParents", + display: "dynamic", + offset: [0, 2], + popperConfig: null, + reference: "toggle" + }, + ge = { + autoClose: "(boolean|string)", + boundary: "(string|element)", + display: "string", + offset: "(array|string|function)", + popperConfig: "(null|object|function)", + reference: "(string|element|object)" + }; + class fe extends W { + constructor(t, e) { + super(t, e), this._popper = null, this._parent = this._element.parentNode, this._menu = K.next(this._element, re)[0] || K.prev(this._element, re)[0] || K.findOne(re, this._parent), this._inNavbar = this._detectNavbar() + } + static get Default() { + return _e + } + static get DefaultType() { + return ge + } + static get NAME() { + return Kt + } + toggle() { + return this._isShown() ? this.hide() : this.show() + } + show() { + if (d(this._element) || this._isShown()) return; + const t = { + relatedTarget: this._element + }; + if (!j.trigger(this._element, Jt, t).defaultPrevented) { + if (this._createPopper(), "ontouchstart" in document.documentElement && !this._parent.closest(".navbar-nav")) + for (const t of [].concat(...document.body.children)) j.on(t, "mouseover", _); + this._element.focus(), this._element.setAttribute("aria-expanded", !0), this._menu.classList.add(se), this._element.classList.add(se), j.trigger(this._element, Zt, t) + } + } + hide() { + if (d(this._element) || !this._isShown()) 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) { + if (!j.trigger(this._element, Ut, t).defaultPrevented) { + if ("ontouchstart" in document.documentElement) + for (const t of [].concat(...document.body.children)) j.off(t, "mouseover", _); + this._popper && this._popper.destroy(), this._menu.classList.remove(se), this._element.classList.remove(se), this._element.setAttribute("aria-expanded", "false"), B.removeDataAttribute(this._menu, "popper"), j.trigger(this._element, Gt, t) + } + } + _getConfig(t) { + if ("object" == typeof (t = super._getConfig(t)).reference && !l(t.reference) && "function" != typeof t.reference.getBoundingClientRect) throw new TypeError(`${Kt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + return t + } + _createPopper() { + if (void 0 === i) throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); + let t = this._element; + "parent" === this._config.reference ? t = this._parent : l(this._config.reference) ? t = c(this._config.reference) : "object" == typeof this._config.reference && (t = this._config.reference); + const e = this._getPopperConfig(); + this._popper = i.createPopper(t, this._menu, e) + } + _isShown() { + return this._menu.classList.contains(se) + } + _getPlacement() { + const t = this._parent; + if (t.classList.contains("dropend")) return de; + if (t.classList.contains("dropstart")) return ue; + if (t.classList.contains("dropup-center")) return "top"; + if (t.classList.contains("dropdown-center")) return "bottom"; + const e = "end" === getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(); + return t.classList.contains("dropup") ? e ? le : ae : e ? he : ce + } + _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 (this._inNavbar || "static" === this._config.display) && (B.setDataAttribute(this._menu, "popper", "static"), t.modifiers = [{ + name: "applyStyles", + enabled: !1 + }]), { + ...t, + ...v(this._config.popperConfig, [t]) + } + } + _selectMenuItem({ + key: t, + target: e + }) { + const i = K.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter((t => h(t))); + i.length && w(i, e, t === Yt, !i.includes(e)).focus() + } + static jQueryInterface(t) { + return this.each((function() { + const e = fe.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 (2 === t.button || "keyup" === t.type && "Tab" !== t.key) return; + const e = K.find(oe); + for (const i of e) { + const e = fe.getInstance(i); + if (!e || !1 === e._config.autoClose) continue; + const s = t.composedPath(), + n = s.includes(e._menu); + if (s.includes(e._element) || "inside" === e._config.autoClose && !n || "outside" === e._config.autoClose && n) continue; + if (e._menu.contains(t.target) && ("keyup" === t.type && "Tab" === t.key || /input|select|option|textarea|form/i.test(t.target.tagName))) continue; + const o = { + relatedTarget: e._element + }; + "click" === t.type && (o.clickEvent = t), e._completeHide(o) + } + } + static dataApiKeydownHandler(t) { + const e = /input|textarea/i.test(t.target.tagName), + i = "Escape" === t.key, + s = [Xt, Yt].includes(t.key); + if (!s && !i) return; + if (e && !i) return; + t.preventDefault(); + const n = this.matches(ne) ? this : K.prev(this, ne)[0] || K.next(this, ne)[0] || K.findOne(ne, t.delegateTarget.parentNode), + o = fe.getOrCreateInstance(n); + if (s) return t.stopPropagation(), o.show(), void o._selectMenuItem(t); + o._isShown() && (t.stopPropagation(), o.hide(), n.focus()) + } + } + j.on(document, ee, ne, fe.dataApiKeydownHandler), j.on(document, ee, re, fe.dataApiKeydownHandler), j.on(document, te, fe.clearMenus), j.on(document, ie, fe.clearMenus), j.on(document, te, ne, (function(t) { + t.preventDefault(), fe.getOrCreateInstance(this).toggle() + })), b(fe); + const me = "backdrop", + pe = "show", + be = `mousedown.bs.${me}`, + ve = { + className: "modal-backdrop", + clickCallback: null, + isAnimated: !1, + isVisible: !0, + rootElement: "body" + }, + ye = { + className: "string", + clickCallback: "(function|null)", + isAnimated: "boolean", + isVisible: "boolean", + rootElement: "(element|string)" + }; + class we extends q { + constructor(t) { + super(), this._config = this._getConfig(t), this._isAppended = !1, this._element = null + } + static get Default() { + return ve + } + static get DefaultType() { + return ye + } + static get NAME() { + return me + } + show(t) { + if (!this._config.isVisible) return void v(t); + this._append(); + const e = this._getElement(); + this._config.isAnimated && g(e), e.classList.add(pe), this._emulateAnimation((() => { + v(t) + })) + } + hide(t) { + this._config.isVisible ? (this._getElement().classList.remove(pe), this._emulateAnimation((() => { + this.dispose(), v(t) + }))) : v(t) + } + dispose() { + this._isAppended && (j.off(this._element, be), this._element.remove(), this._isAppended = !1) + } + _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 + } + _configAfterMerge(t) { + return t.rootElement = c(t.rootElement), t + } + _append() { + if (this._isAppended) return; + const t = this._getElement(); + this._config.rootElement.append(t), j.on(t, be, (() => { + v(this._config.clickCallback) + })), this._isAppended = !0 + } + _emulateAnimation(t) { + y(t, this._getElement(), this._config.isAnimated) + } + } + const Ae = ".bs.focustrap", + Ee = `focusin${Ae}`, + Ce = `keydown.tab${Ae}`, + Te = "backward", + ke = { + autofocus: !0, + trapElement: null + }, + $e = { + autofocus: "boolean", + trapElement: "element" + }; + class Se extends q { + constructor(t) { + super(), this._config = this._getConfig(t), this._isActive = !1, this._lastTabNavDirection = null + } + static get Default() { + return ke + } + static get DefaultType() { + return $e + } + static get NAME() { + return "focustrap" + } + activate() { + this._isActive || (this._config.autofocus && this._config.trapElement.focus(), j.off(document, Ae), j.on(document, Ee, (t => this._handleFocusin(t))), j.on(document, Ce, (t => this._handleKeydown(t))), this._isActive = !0) + } + deactivate() { + this._isActive && (this._isActive = !1, j.off(document, Ae)) + } + _handleFocusin(t) { + const { + trapElement: e + } = this._config; + if (t.target === document || t.target === e || e.contains(t.target)) return; + const i = K.focusableChildren(e); + 0 === i.length ? e.focus() : this._lastTabNavDirection === Te ? i[i.length - 1].focus() : i[0].focus() + } + _handleKeydown(t) { + "Tab" === t.key && (this._lastTabNavDirection = t.shiftKey ? Te : "forward") + } + } + const Le = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", + Oe = ".sticky-top", + Ie = "padding-right", + De = "margin-right"; + class Ne { + 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, Ie, (e => e + t)), this._setElementAttributes(Le, Ie, (e => e + t)), this._setElementAttributes(Oe, De, (e => e - t)) + } + reset() { + this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, Ie), this._resetElementAttributes(Le, Ie), this._resetElementAttributes(Oe, De) + } + isOverflowing() { + return this.getWidth() > 0 + } + _disableOverFlow() { + this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden" + } + _setElementAttributes(t, e, i) { + const s = this.getWidth(); + this._applyManipulationCallback(t, (t => { + if (t !== this._element && window.innerWidth > t.clientWidth + s) return; + this._saveInitialAttribute(t, e); + const n = window.getComputedStyle(t).getPropertyValue(e); + t.style.setProperty(e, `${i(Number.parseFloat(n))}px`) + })) + } + _saveInitialAttribute(t, e) { + const i = t.style.getPropertyValue(e); + i && B.setDataAttribute(t, e, i) + } + _resetElementAttributes(t, e) { + this._applyManipulationCallback(t, (t => { + const i = B.getDataAttribute(t, e); + null !== i ? (B.removeDataAttribute(t, e), t.style.setProperty(e, i)) : t.style.removeProperty(e) + })) + } + _applyManipulationCallback(t, e) { + if (l(t)) e(t); + else + for (const i of K.find(t, this._element)) e(i) + } + } + const Pe = ".bs.modal", + xe = `hide${Pe}`, + Me = `hidePrevented${Pe}`, + je = `hidden${Pe}`, + Fe = `show${Pe}`, + ze = `shown${Pe}`, + He = `resize${Pe}`, + Be = `click.dismiss${Pe}`, + qe = `mousedown.dismiss${Pe}`, + We = `keydown.dismiss${Pe}`, + Re = `click${Pe}.data-api`, + Ke = "modal-open", + Ve = "show", + Qe = "modal-static", + Xe = { + backdrop: !0, + focus: !0, + keyboard: !0 + }, + Ye = { + backdrop: "(boolean|string)", + focus: "boolean", + keyboard: "boolean" + }; + class Ue extends W { + constructor(t, e) { + super(t, e), this._dialog = K.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._isShown = !1, this._isTransitioning = !1, this._scrollBar = new Ne, this._addEventListeners() + } + static get Default() { + return Xe + } + static get DefaultType() { + return Ye + } + static get NAME() { + return "modal" + } + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + show(t) { + this._isShown || this._isTransitioning || j.trigger(this._element, Fe, { + relatedTarget: t + }).defaultPrevented || (this._isShown = !0, this._isTransitioning = !0, this._scrollBar.hide(), document.body.classList.add(Ke), this._adjustDialog(), this._backdrop.show((() => this._showElement(t)))) + } + hide() { + this._isShown && !this._isTransitioning && (j.trigger(this._element, xe).defaultPrevented || (this._isShown = !1, this._isTransitioning = !0, this._focustrap.deactivate(), this._element.classList.remove(Ve), this._queueCallback((() => this._hideModal()), this._element, this._isAnimated()))) + } + dispose() { + j.off(window, Pe), j.off(this._dialog, Pe), this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + handleUpdate() { + this._adjustDialog() + } + _initializeBackDrop() { + return new we({ + isVisible: Boolean(this._config.backdrop), + isAnimated: this._isAnimated() + }) + } + _initializeFocusTrap() { + return new Se({ + trapElement: this._element + }) + } + _showElement(t) { + document.body.contains(this._element) || 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; + const e = K.findOne(".modal-body", this._dialog); + e && (e.scrollTop = 0), g(this._element), this._element.classList.add(Ve), this._queueCallback((() => { + this._config.focus && this._focustrap.activate(), this._isTransitioning = !1, j.trigger(this._element, ze, { + relatedTarget: t + }) + }), this._dialog, this._isAnimated()) + } + _addEventListeners() { + j.on(this._element, We, (t => { + "Escape" === t.key && (this._config.keyboard ? this.hide() : this._triggerBackdropTransition()) + })), j.on(window, He, (() => { + this._isShown && !this._isTransitioning && this._adjustDialog() + })), j.on(this._element, qe, (t => { + j.one(this._element, Be, (e => { + this._element === t.target && this._element === e.target && ("static" !== this._config.backdrop ? this._config.backdrop && this.hide() : this._triggerBackdropTransition()) + })) + })) + } + _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(Ke), this._resetAdjustments(), this._scrollBar.reset(), j.trigger(this._element, je) + })) + } + _isAnimated() { + return this._element.classList.contains("fade") + } + _triggerBackdropTransition() { + if (j.trigger(this._element, Me).defaultPrevented) return; + const t = this._element.scrollHeight > document.documentElement.clientHeight, + e = this._element.style.overflowY; + "hidden" === e || this._element.classList.contains(Qe) || (t || (this._element.style.overflowY = "hidden"), this._element.classList.add(Qe), this._queueCallback((() => { + this._element.classList.remove(Qe), this._queueCallback((() => { + this._element.style.overflowY = e + }), this._dialog) + }), this._dialog), this._element.focus()) + } + _adjustDialog() { + const t = this._element.scrollHeight > document.documentElement.clientHeight, + e = this._scrollBar.getWidth(), + i = e > 0; + if (i && !t) { + const t = p() ? "paddingLeft" : "paddingRight"; + this._element.style[t] = `${e}px` + } + if (!i && t) { + const t = p() ? "paddingRight" : "paddingLeft"; + this._element.style[t] = `${e}px` + } + } + _resetAdjustments() { + this._element.style.paddingLeft = "", this._element.style.paddingRight = "" + } + static jQueryInterface(t, e) { + return this.each((function() { + const i = Ue.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, Re, '[data-bs-toggle="modal"]', (function(t) { + const e = K.getElementFromSelector(this); + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), j.one(e, Fe, (t => { + t.defaultPrevented || j.one(e, je, (() => { + h(this) && this.focus() + })) + })); + const i = K.findOne(".modal.show"); + i && Ue.getInstance(i).hide(), Ue.getOrCreateInstance(e).toggle(this) + })), V(Ue), b(Ue); + const Ge = ".bs.offcanvas", + Je = ".data-api", + Ze = `load${Ge}${Je}`, + ti = "show", + ei = "showing", + ii = "hiding", + si = ".offcanvas.show", + ni = `show${Ge}`, + oi = `shown${Ge}`, + ri = `hide${Ge}`, + ai = `hidePrevented${Ge}`, + li = `hidden${Ge}`, + ci = `resize${Ge}`, + hi = `click${Ge}${Je}`, + di = `keydown.dismiss${Ge}`, + ui = { + backdrop: !0, + keyboard: !0, + scroll: !1 + }, + _i = { + backdrop: "(boolean|string)", + keyboard: "boolean", + scroll: "boolean" + }; + class gi extends W { + constructor(t, e) { + super(t, e), this._isShown = !1, this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._addEventListeners() + } + static get Default() { + return ui + } + static get DefaultType() { + return _i + } + static get NAME() { + return "offcanvas" + } + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + show(t) { + this._isShown || j.trigger(this._element, ni, { + relatedTarget: t + }).defaultPrevented || (this._isShown = !0, this._backdrop.show(), this._config.scroll || (new Ne).hide(), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.classList.add(ei), this._queueCallback((() => { + this._config.scroll && !this._config.backdrop || this._focustrap.activate(), this._element.classList.add(ti), this._element.classList.remove(ei), j.trigger(this._element, oi, { + relatedTarget: t + }) + }), this._element, !0)) + } + hide() { + this._isShown && (j.trigger(this._element, ri).defaultPrevented || (this._focustrap.deactivate(), this._element.blur(), this._isShown = !1, this._element.classList.add(ii), this._backdrop.hide(), this._queueCallback((() => { + this._element.classList.remove(ti, ii), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._config.scroll || (new Ne).reset(), j.trigger(this._element, li) + }), this._element, !0))) + } + dispose() { + this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + _initializeBackDrop() { + const t = Boolean(this._config.backdrop); + return new we({ + className: "offcanvas-backdrop", + isVisible: t, + isAnimated: !0, + rootElement: this._element.parentNode, + clickCallback: t ? () => { + "static" !== this._config.backdrop ? this.hide() : j.trigger(this._element, ai) + } : null + }) + } + _initializeFocusTrap() { + return new Se({ + trapElement: this._element + }) + } + _addEventListeners() { + j.on(this._element, di, (t => { + "Escape" === t.key && (this._config.keyboard ? this.hide() : j.trigger(this._element, ai)) + })) + } + static jQueryInterface(t) { + return this.each((function() { + const e = gi.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, hi, '[data-bs-toggle="offcanvas"]', (function(t) { + const e = K.getElementFromSelector(this); + if (["A", "AREA"].includes(this.tagName) && t.preventDefault(), d(this)) return; + j.one(e, li, (() => { + h(this) && this.focus() + })); + const i = K.findOne(si); + i && i !== e && gi.getInstance(i).hide(), gi.getOrCreateInstance(e).toggle(this) + })), j.on(window, Ze, (() => { + for (const t of K.find(si)) gi.getOrCreateInstance(t).show() + })), j.on(window, ci, (() => { + for (const t of K.find("[aria-modal][class*=show][class*=offcanvas-]")) "fixed" !== getComputedStyle(t).position && gi.getOrCreateInstance(t).hide() + })), V(gi), b(gi); + const fi = { + "*": ["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: [] + }, + mi = new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]), + pi = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i, + bi = (t, e) => { + const i = t.nodeName.toLowerCase(); + return e.includes(i) ? !mi.has(i) || Boolean(pi.test(t.nodeValue)) : e.filter((t => t instanceof RegExp)).some((t => t.test(i))) + }, + vi = { + allowList: fi, + content: {}, + extraClass: "", + html: !1, + sanitize: !0, + sanitizeFn: null, + template: "
" + }, + yi = { + allowList: "object", + content: "object", + extraClass: "(string|function)", + html: "boolean", + sanitize: "boolean", + sanitizeFn: "(null|function)", + template: "string" + }, + wi = { + entry: "(string|element|function|null)", + selector: "(string|element)" + }; + class Ai extends q { + constructor(t) { + super(), this._config = this._getConfig(t) + } + static get Default() { + return vi + } + static get DefaultType() { + return yi + } + static get NAME() { + return "TemplateFactory" + } + getContent() { + return Object.values(this._config.content).map((t => this._resolvePossibleFunction(t))).filter(Boolean) + } + hasContent() { + return this.getContent().length > 0 + } + changeContent(t) { + return this._checkContent(t), this._config.content = { + ...this._config.content, + ...t + }, this + } + toHtml() { + const t = document.createElement("div"); + t.innerHTML = this._maybeSanitize(this._config.template); + for (const [e, i] of Object.entries(this._config.content)) this._setContent(t, i, e); + const e = t.children[0], + i = this._resolvePossibleFunction(this._config.extraClass); + return i && e.classList.add(...i.split(" ")), e + } + _typeCheckConfig(t) { + super._typeCheckConfig(t), this._checkContent(t.content) + } + _checkContent(t) { + for (const [e, i] of Object.entries(t)) super._typeCheckConfig({ + selector: e, + entry: i + }, wi) + } + _setContent(t, e, i) { + const s = K.findOne(i, t); + s && ((e = this._resolvePossibleFunction(e)) ? l(e) ? this._putElementInTemplate(c(e), s) : this._config.html ? s.innerHTML = this._maybeSanitize(e) : s.textContent = e : s.remove()) + } + _maybeSanitize(t) { + return this._config.sanitize ? function(t, e, i) { + if (!t.length) return t; + if (i && "function" == typeof i) return i(t); + const s = (new window.DOMParser).parseFromString(t, "text/html"), + n = [].concat(...s.body.querySelectorAll("*")); + for (const t of n) { + const i = t.nodeName.toLowerCase(); + if (!Object.keys(e).includes(i)) { + t.remove(); + continue + } + const s = [].concat(...t.attributes), + n = [].concat(e["*"] || [], e[i] || []); + for (const e of s) bi(e, n) || t.removeAttribute(e.nodeName) + } + return s.body.innerHTML + }(t, this._config.allowList, this._config.sanitizeFn) : t + } + _resolvePossibleFunction(t) { + return v(t, [this]) + } + _putElementInTemplate(t, e) { + if (this._config.html) return e.innerHTML = "", void e.append(t); + e.textContent = t.textContent + } + } + const Ei = new Set(["sanitize", "allowList", "sanitizeFn"]), + Ci = "fade", + Ti = "show", + ki = ".modal", + $i = "hide.bs.modal", + Si = "hover", + Li = "focus", + Oi = { + AUTO: "auto", + TOP: "top", + RIGHT: p() ? "left" : "right", + BOTTOM: "bottom", + LEFT: p() ? "right" : "left" + }, + Ii = { + allowList: fi, + animation: !0, + boundary: "clippingParents", + container: !1, + customClass: "", + delay: 0, + fallbackPlacements: ["top", "right", "bottom", "left"], + html: !1, + offset: [0, 6], + placement: "top", + popperConfig: null, + sanitize: !0, + sanitizeFn: null, + selector: !1, + template: '', + title: "", + trigger: "hover focus" + }, + Di = { + allowList: "object", + animation: "boolean", + boundary: "(string|element)", + container: "(string|element|boolean)", + customClass: "(string|function)", + delay: "(number|object)", + fallbackPlacements: "array", + html: "boolean", + offset: "(array|string|function)", + placement: "(string|function)", + popperConfig: "(null|object|function)", + sanitize: "boolean", + sanitizeFn: "(null|function)", + selector: "(string|boolean)", + template: "string", + title: "(string|element|function)", + trigger: "string" + }; + class Ni extends W { + constructor(t, e) { + if (void 0 === i) throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); + super(t, e), this._isEnabled = !0, this._timeout = 0, this._isHovered = null, this._activeTrigger = {}, this._popper = null, this._templateFactory = null, this._newContent = null, this.tip = null, this._setListeners(), this._config.selector || this._fixTitle() + } + static get Default() { + return Ii + } + static get DefaultType() { + return Di + } + static get NAME() { + return "tooltip" + } + enable() { + this._isEnabled = !0 + } + disable() { + this._isEnabled = !1 + } + toggleEnabled() { + this._isEnabled = !this._isEnabled + } + toggle() { + this._isEnabled && (this._activeTrigger.click = !this._activeTrigger.click, this._isShown() ? this._leave() : this._enter()) + } + dispose() { + clearTimeout(this._timeout), j.off(this._element.closest(ki), $i, this._hideModalHandler), this._element.getAttribute("data-bs-original-title") && this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title")), 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.eventName("show")), + e = (u(this._element) || this._element.ownerDocument.documentElement).contains(this._element); + if (t.defaultPrevented || !e) return; + this._disposePopper(); + const i = this._getTipElement(); + this._element.setAttribute("aria-describedby", i.getAttribute("id")); + const { + container: s + } = this._config; + if (this._element.ownerDocument.documentElement.contains(this.tip) || (s.append(i), j.trigger(this._element, this.constructor.eventName("inserted"))), this._popper = this._createPopper(i), i.classList.add(Ti), "ontouchstart" in document.documentElement) + for (const t of [].concat(...document.body.children)) j.on(t, "mouseover", _); + this._queueCallback((() => { + j.trigger(this._element, this.constructor.eventName("shown")), !1 === this._isHovered && this._leave(), this._isHovered = !1 + }), this.tip, this._isAnimated()) + } + hide() { + if (this._isShown() && !j.trigger(this._element, this.constructor.eventName("hide")).defaultPrevented) { + if (this._getTipElement().classList.remove(Ti), "ontouchstart" in document.documentElement) + for (const t of [].concat(...document.body.children)) j.off(t, "mouseover", _); + this._activeTrigger.click = !1, this._activeTrigger[Li] = !1, this._activeTrigger[Si] = !1, this._isHovered = null, this._queueCallback((() => { + this._isWithActiveTrigger() || (this._isHovered || this._disposePopper(), this._element.removeAttribute("aria-describedby"), j.trigger(this._element, this.constructor.eventName("hidden"))) + }), this.tip, this._isAnimated()) + } + } + update() { + this._popper && this._popper.update() + } + _isWithContent() { + return Boolean(this._getTitle()) + } + _getTipElement() { + return this.tip || (this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())), this.tip + } + _createTipElement(t) { + const e = this._getTemplateFactory(t).toHtml(); + if (!e) return null; + e.classList.remove(Ci, Ti), e.classList.add(`bs-${this.constructor.NAME}-auto`); + const i = (t => { + do { + t += Math.floor(1e6 * Math.random()) + } while (document.getElementById(t)); + return t + })(this.constructor.NAME).toString(); + return e.setAttribute("id", i), this._isAnimated() && e.classList.add(Ci), e + } + setContent(t) { + this._newContent = t, this._isShown() && (this._disposePopper(), this.show()) + } + _getTemplateFactory(t) { + return this._templateFactory ? this._templateFactory.changeContent(t) : this._templateFactory = new Ai({ + ...this._config, + content: t, + extraClass: this._resolvePossibleFunction(this._config.customClass) + }), this._templateFactory + } + _getContentForTemplate() { + return { + ".tooltip-inner": this._getTitle() + } + } + _getTitle() { + return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title") + } + _initializeOnDelegatedTarget(t) { + return this.constructor.getOrCreateInstance(t.delegateTarget, this._getDelegateConfig()) + } + _isAnimated() { + return this._config.animation || this.tip && this.tip.classList.contains(Ci) + } + _isShown() { + return this.tip && this.tip.classList.contains(Ti) + } + _createPopper(t) { + const e = v(this._config.placement, [this, t, this._element]), + s = Oi[e.toUpperCase()]; + return i.createPopper(this._element, t, this._getPopperConfig(s)) + } + _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 v(t, [this._element]) + } + _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: "preSetPlacement", + enabled: !0, + phase: "beforeMain", + fn: t => { + this._getTipElement().setAttribute("data-popper-placement", t.state.placement) + } + }] + }; + return { + ...e, + ...v(this._config.popperConfig, [e]) + } + } + _setListeners() { + const t = this._config.trigger.split(" "); + for (const e of t) + if ("click" === e) j.on(this._element, this.constructor.eventName("click"), this._config.selector, (t => { + this._initializeOnDelegatedTarget(t).toggle() + })); + else if ("manual" !== e) { + const t = e === Si ? this.constructor.eventName("mouseenter") : this.constructor.eventName("focusin"), + i = e === Si ? this.constructor.eventName("mouseleave") : this.constructor.eventName("focusout"); + j.on(this._element, t, this._config.selector, (t => { + const e = this._initializeOnDelegatedTarget(t); + e._activeTrigger["focusin" === t.type ? Li : Si] = !0, e._enter() + })), j.on(this._element, i, this._config.selector, (t => { + const e = this._initializeOnDelegatedTarget(t); + e._activeTrigger["focusout" === t.type ? Li : Si] = e._element.contains(t.relatedTarget), e._leave() + })) + } + this._hideModalHandler = () => { + this._element && this.hide() + }, j.on(this._element.closest(ki), $i, this._hideModalHandler) + } + _fixTitle() { + const t = this._element.getAttribute("title"); + t && (this._element.getAttribute("aria-label") || this._element.textContent.trim() || this._element.setAttribute("aria-label", t), this._element.setAttribute("data-bs-original-title", t), this._element.removeAttribute("title")) + } + _enter() { + this._isShown() || this._isHovered ? this._isHovered = !0 : (this._isHovered = !0, this._setTimeout((() => { + this._isHovered && this.show() + }), this._config.delay.show)) + } + _leave() { + this._isWithActiveTrigger() || (this._isHovered = !1, this._setTimeout((() => { + this._isHovered || this.hide() + }), this._config.delay.hide)) + } + _setTimeout(t, e) { + clearTimeout(this._timeout), this._timeout = setTimeout(t, e) + } + _isWithActiveTrigger() { + return Object.values(this._activeTrigger).includes(!0) + } + _getConfig(t) { + const e = B.getDataAttributes(this._element); + for (const t of Object.keys(e)) Ei.has(t) && delete e[t]; + return t = { + ...e, + ..."object" == typeof t && t ? t : {} + }, t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t + } + _configAfterMerge(t) { + return t.container = !1 === t.container ? document.body : c(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()), t + } + _getDelegateConfig() { + const t = {}; + for (const [e, i] of Object.entries(this._config)) this.constructor.Default[e] !== i && (t[e] = i); + return t.selector = !1, t.trigger = "manual", t + } + _disposePopper() { + this._popper && (this._popper.destroy(), this._popper = null), this.tip && (this.tip.remove(), this.tip = null) + } + static jQueryInterface(t) { + return this.each((function() { + const e = Ni.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + b(Ni); + const Pi = { + ...Ni.Default, + content: "", + offset: [0, 8], + placement: "right", + template: '', + trigger: "click" + }, + xi = { + ...Ni.DefaultType, + content: "(null|string|element|function)" + }; + class Mi extends Ni { + static get Default() { + return Pi + } + static get DefaultType() { + return xi + } + static get NAME() { + return "popover" + } + _isWithContent() { + return this._getTitle() || this._getContent() + } + _getContentForTemplate() { + return { + ".popover-header": this._getTitle(), + ".popover-body": this._getContent() + } + } + _getContent() { + return this._resolvePossibleFunction(this._config.content) + } + static jQueryInterface(t) { + return this.each((function() { + const e = Mi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + b(Mi); + const ji = ".bs.scrollspy", + Fi = `activate${ji}`, + zi = `click${ji}`, + Hi = `load${ji}.data-api`, + Bi = "active", + qi = "[href]", + Wi = ".nav-link", + Ri = `${Wi}, .nav-item > ${Wi}, .list-group-item`, + Ki = { + offset: null, + rootMargin: "0px 0px -25%", + smoothScroll: !1, + target: null, + threshold: [.1, .5, 1] + }, + Vi = { + offset: "(number|null)", + rootMargin: "string", + smoothScroll: "boolean", + target: "element", + threshold: "array" + }; + class Qi extends W { + constructor(t, e) { + super(t, e), this._targetLinks = new Map, this._observableSections = new Map, this._rootElement = "visible" === getComputedStyle(this._element).overflowY ? null : this._element, this._activeTarget = null, this._observer = null, this._previousScrollData = { + visibleEntryTop: 0, + parentScrollTop: 0 + }, this.refresh() + } + static get Default() { + return Ki + } + static get DefaultType() { + return Vi + } + static get NAME() { + return "scrollspy" + } + refresh() { + this._initializeTargetsAndObservables(), this._maybeEnableSmoothScroll(), this._observer ? this._observer.disconnect() : this._observer = this._getNewObserver(); + for (const t of this._observableSections.values()) this._observer.observe(t) + } + dispose() { + this._observer.disconnect(), super.dispose() + } + _configAfterMerge(t) { + return t.target = c(t.target) || document.body, t.rootMargin = t.offset ? `${t.offset}px 0px -30%` : t.rootMargin, "string" == typeof t.threshold && (t.threshold = t.threshold.split(",").map((t => Number.parseFloat(t)))), t + } + _maybeEnableSmoothScroll() { + this._config.smoothScroll && (j.off(this._config.target, zi), j.on(this._config.target, zi, qi, (t => { + const e = this._observableSections.get(t.target.hash); + if (e) { + t.preventDefault(); + const i = this._rootElement || window, + s = e.offsetTop - this._element.offsetTop; + if (i.scrollTo) return void i.scrollTo({ + top: s, + behavior: "smooth" + }); + i.scrollTop = s + } + }))) + } + _getNewObserver() { + const t = { + root: this._rootElement, + threshold: this._config.threshold, + rootMargin: this._config.rootMargin + }; + return new IntersectionObserver((t => this._observerCallback(t)), t) + } + _observerCallback(t) { + const e = t => this._targetLinks.get(`#${t.target.id}`), + i = t => { + this._previousScrollData.visibleEntryTop = t.target.offsetTop, this._process(e(t)) + }, + s = (this._rootElement || document.documentElement).scrollTop, + n = s >= this._previousScrollData.parentScrollTop; + this._previousScrollData.parentScrollTop = s; + for (const o of t) { + if (!o.isIntersecting) { + this._activeTarget = null, this._clearActiveClass(e(o)); + continue + } + const t = o.target.offsetTop >= this._previousScrollData.visibleEntryTop; + if (n && t) { + if (i(o), !s) return + } else n || t || i(o) + } + } + _initializeTargetsAndObservables() { + this._targetLinks = new Map, this._observableSections = new Map; + const t = K.find(qi, this._config.target); + for (const e of t) { + if (!e.hash || d(e)) continue; + const t = K.findOne(decodeURI(e.hash), this._element); + h(t) && (this._targetLinks.set(decodeURI(e.hash), e), this._observableSections.set(e.hash, t)) + } + } + _process(t) { + this._activeTarget !== t && (this._clearActiveClass(this._config.target), this._activeTarget = t, t.classList.add(Bi), this._activateParents(t), j.trigger(this._element, Fi, { + relatedTarget: t + })) + } + _activateParents(t) { + if (t.classList.contains("dropdown-item")) K.findOne(".dropdown-toggle", t.closest(".dropdown")).classList.add(Bi); + else + for (const e of K.parents(t, ".nav, .list-group")) + for (const t of K.prev(e, Ri)) t.classList.add(Bi) + } + _clearActiveClass(t) { + t.classList.remove(Bi); + const e = K.find(`${qi}.${Bi}`, t); + for (const t of e) t.classList.remove(Bi) + } + static jQueryInterface(t) { + return this.each((function() { + const e = Qi.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]() + } + })) + } + } + j.on(window, Hi, (() => { + for (const t of K.find('[data-bs-spy="scroll"]')) Qi.getOrCreateInstance(t) + })), b(Qi); + const Xi = ".bs.tab", + Yi = `hide${Xi}`, + Ui = `hidden${Xi}`, + Gi = `show${Xi}`, + Ji = `shown${Xi}`, + Zi = `click${Xi}`, + ts = `keydown${Xi}`, + es = `load${Xi}`, + is = "ArrowLeft", + ss = "ArrowRight", + ns = "ArrowUp", + os = "ArrowDown", + rs = "Home", + as = "End", + ls = "active", + cs = "fade", + hs = "show", + ds = ".dropdown-toggle", + us = `:not(${ds})`, + _s = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', + gs = `.nav-link${us}, .list-group-item${us}, [role="tab"]${us}, ${_s}`, + fs = `.${ls}[data-bs-toggle="tab"], .${ls}[data-bs-toggle="pill"], .${ls}[data-bs-toggle="list"]`; + class ms extends W { + constructor(t) { + super(t), this._parent = this._element.closest('.list-group, .nav, [role="tablist"]'), this._parent && (this._setInitialAttributes(this._parent, this._getChildren()), j.on(this._element, ts, (t => this._keydown(t)))) + } + static get NAME() { + return "tab" + } + show() { + const t = this._element; + if (this._elemIsActive(t)) return; + const e = this._getActiveElem(), + i = e ? j.trigger(e, Yi, { + relatedTarget: t + }) : null; + j.trigger(t, Gi, { + relatedTarget: e + }).defaultPrevented || i && i.defaultPrevented || (this._deactivate(e, t), this._activate(t, e)) + } + _activate(t, e) { + t && (t.classList.add(ls), this._activate(K.getElementFromSelector(t)), this._queueCallback((() => { + "tab" === t.getAttribute("role") ? (t.removeAttribute("tabindex"), t.setAttribute("aria-selected", !0), this._toggleDropDown(t, !0), j.trigger(t, Ji, { + relatedTarget: e + })) : t.classList.add(hs) + }), t, t.classList.contains(cs))) + } + _deactivate(t, e) { + t && (t.classList.remove(ls), t.blur(), this._deactivate(K.getElementFromSelector(t)), this._queueCallback((() => { + "tab" === t.getAttribute("role") ? (t.setAttribute("aria-selected", !1), t.setAttribute("tabindex", "-1"), this._toggleDropDown(t, !1), j.trigger(t, Ui, { + relatedTarget: e + })) : t.classList.remove(hs) + }), t, t.classList.contains(cs))) + } + _keydown(t) { + if (![is, ss, ns, os, rs, as].includes(t.key)) return; + t.stopPropagation(), t.preventDefault(); + const e = this._getChildren().filter((t => !d(t))); + let i; + if ([rs, as].includes(t.key)) i = e[t.key === rs ? 0 : e.length - 1]; + else { + const s = [ss, os].includes(t.key); + i = w(e, t.target, s, !0) + } + i && (i.focus({ + preventScroll: !0 + }), ms.getOrCreateInstance(i).show()) + } + _getChildren() { + return K.find(gs, this._parent) + } + _getActiveElem() { + return this._getChildren().find((t => this._elemIsActive(t))) || null + } + _setInitialAttributes(t, e) { + this._setAttributeIfNotExists(t, "role", "tablist"); + for (const t of e) this._setInitialAttributesOnChild(t) + } + _setInitialAttributesOnChild(t) { + t = this._getInnerElement(t); + const e = this._elemIsActive(t), + i = this._getOuterElement(t); + t.setAttribute("aria-selected", e), i !== t && this._setAttributeIfNotExists(i, "role", "presentation"), e || t.setAttribute("tabindex", "-1"), this._setAttributeIfNotExists(t, "role", "tab"), this._setInitialAttributesOnTargetPanel(t) + } + _setInitialAttributesOnTargetPanel(t) { + const e = K.getElementFromSelector(t); + e && (this._setAttributeIfNotExists(e, "role", "tabpanel"), t.id && this._setAttributeIfNotExists(e, "aria-labelledby", `${t.id}`)) + } + _toggleDropDown(t, e) { + const i = this._getOuterElement(t); + if (!i.classList.contains("dropdown")) return; + const s = (t, s) => { + const n = K.findOne(t, i); + n && n.classList.toggle(s, e) + }; + s(ds, ls), s(".dropdown-menu", hs), i.setAttribute("aria-expanded", e) + } + _setAttributeIfNotExists(t, e, i) { + t.hasAttribute(e) || t.setAttribute(e, i) + } + _elemIsActive(t) { + return t.classList.contains(ls) + } + _getInnerElement(t) { + return t.matches(gs) ? t : K.findOne(gs, t) + } + _getOuterElement(t) { + return t.closest(".nav-item, .list-group-item") || t + } + static jQueryInterface(t) { + return this.each((function() { + const e = ms.getOrCreateInstance(this); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + j.on(document, Zi, _s, (function(t) { + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), d(this) || ms.getOrCreateInstance(this).show() + })), j.on(window, es, (() => { + for (const t of K.find(fs)) ms.getOrCreateInstance(t) + })), b(ms); + const ps = ".bs.toast", + bs = `mouseover${ps}`, + vs = `mouseout${ps}`, + ys = `focusin${ps}`, + ws = `focusout${ps}`, + As = `hide${ps}`, + Es = `hidden${ps}`, + Cs = `show${ps}`, + Ts = `shown${ps}`, + ks = "hide", + $s = "show", + Ss = "showing", + Ls = { + animation: "boolean", + autohide: "boolean", + delay: "number" + }, + Os = { + animation: !0, + autohide: !0, + delay: 5e3 + }; + class Is extends W { + constructor(t, e) { + super(t, e), this._timeout = null, this._hasMouseInteraction = !1, this._hasKeyboardInteraction = !1, this._setListeners() + } + static get Default() { + return Os + } + static get DefaultType() { + return Ls + } + static get NAME() { + return "toast" + } + show() { + j.trigger(this._element, Cs).defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove(ks), g(this._element), this._element.classList.add($s, Ss), this._queueCallback((() => { + this._element.classList.remove(Ss), j.trigger(this._element, Ts), this._maybeScheduleHide() + }), this._element, this._config.animation)) + } + hide() { + this.isShown() && (j.trigger(this._element, As).defaultPrevented || (this._element.classList.add(Ss), this._queueCallback((() => { + this._element.classList.add(ks), this._element.classList.remove(Ss, $s), j.trigger(this._element, Es) + }), this._element, this._config.animation))) + } + dispose() { + this._clearTimeout(), this.isShown() && this._element.classList.remove($s), super.dispose() + } + isShown() { + return this._element.classList.contains($s) + } + _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, bs, (t => this._onInteraction(t, !0))), j.on(this._element, vs, (t => this._onInteraction(t, !1))), j.on(this._element, ys, (t => this._onInteraction(t, !0))), j.on(this._element, ws, (t => this._onInteraction(t, !1))) + } + _clearTimeout() { + clearTimeout(this._timeout), this._timeout = null + } + static jQueryInterface(t) { + return this.each((function() { + const e = Is.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } + } + return V(Is), b(Is), { + Alert: U, + Button: J, + Carousel: Ot, + Collapse: Rt, + Dropdown: fe, + Modal: Ue, + Offcanvas: gi, + Popover: Mi, + ScrollSpy: Qi, + Tab: ms, + Toast: Is, + Tooltip: Ni + } +})); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/src/main/webapp/close_cont_det_entry.jsp b/src/main/webapp/close_cont_det_entry.jsp new file mode 100644 index 0000000..d964cbb --- /dev/null +++ b/src/main/webapp/close_cont_det_entry.jsp @@ -0,0 +1,133 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistContDetService"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistBillDetService"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<% + //Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page + } + + //Retrieve values passed via POST method + String reqContNum = request.getParameter("cont_num"); + String reqVendId = request.getParameter("vend_id"); + String vendName = request.getParameter("vend_name"); + + //Call the ExistContDetService + ExistContDetService existContDetService = new ExistContDetService(); + + //Call the ExistBillDetService + ExistBillDetService existBillDetService = new ExistBillDetService(); + + //Fetch ContDetList + ContDetListWrapper contDetListWrapper = new ContDetListWrapper(existContDetService.getContDet(reqVendId, reqContNum)); + List contDetList = contDetListWrapper != null ? contDetListWrapper.getContList() : new ArrayList(); + + //Fetch BillDetList + BillDetListWrapper billDetListWrapper = new BillDetListWrapper(existBillDetService.getBillDet(reqContNum)); + List billDetList = billDetListWrapper != null ? billDetListWrapper.getBillDetList() : new ArrayList(); + + Double amtDue = billDetList.get(billDetList.size() - 1).getAmtDue(); + %> + + + + + +Contract Management System + +<%@include file="includes/header.jsp"%> + + +<%@include file="includes/exist_navbar.jsp"%> +
+
+
+ +
+

Contract Closure

+
+
+
+ + + + +
+
+
+
+ + + +
+
+ + + +
` +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + + +
+
+
+ +
+
+
+
+<%@include file="includes/footer.jsp"%> + + + \ No newline at end of file diff --git a/src/main/webapp/close_ext_cont_det_entry.jsp b/src/main/webapp/close_ext_cont_det_entry.jsp new file mode 100644 index 0000000..59e76bc --- /dev/null +++ b/src/main/webapp/close_ext_cont_det_entry.jsp @@ -0,0 +1,138 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistExtContDetService"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistExtBillDetService"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<% + //Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page + } + + //Retrieve values passed via POST method + String reqContNum = request.getParameter("cont_num"); + String reqVendId = request.getParameter("vend_id"); + String vendName = request.getParameter("vend_name"); + + //Call the ExistExtContDetService + ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + //Call the ExistExtBillDetService + ExistExtBillDetService existExtBillDetService = new ExistExtBillDetService(); + + //Fetch ContDetList + ContDetListWrapper contDetListWrapper = new ContDetListWrapper(existExtContDetService.getExtContDet(reqVendId, reqContNum)); + List contDetList = contDetListWrapper != null ? contDetListWrapper.getContList() : new ArrayList(); + + //Fetch BillDetList + BillDetListWrapper billDetListWrapper = new BillDetListWrapper(existExtBillDetService.getExtBillDet(reqContNum)); + List billDetList = billDetListWrapper != null ? billDetListWrapper.getBillDetList() : new ArrayList(); + + Double amtDue = billDetList.get(billDetList.size() - 1).getAmtDue(); + %> + + + + + +Contract Management System + +<%@include file="includes/header.jsp"%> + + +<%@include file="includes/exist_navbar.jsp"%> +
+
+
+ +
+

Extension Contract Closure

+
+
+
+ + + + +
+
+
+
+ + + +
+
+ + + +
` +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + + +
+
+
+ +
+
+
+
+<%@include file="includes/footer.jsp"%> + + + \ No newline at end of file diff --git a/src/main/webapp/css/body-form-style.css b/src/main/webapp/css/body-form-style.css new file mode 100644 index 0000000..1f22406 --- /dev/null +++ b/src/main/webapp/css/body-form-style.css @@ -0,0 +1,186 @@ +body { + margin: 0; + padding: 0; + font-family: Arial, sans-serif; + background: linear-gradient(45deg, #f6f7fb, #4ca3b3); + background-repeat: no-repeat; +} + +.form-title { + text-align: center; + margin-bottom: 20px; + font-size: 1.8rem; + color: #003366; + text-decoration: underline; +} + +.header-row { + display: flex; + align-items: center; + gap: 20px; + margin-bottom: 20px; +} + +.back-button { + background-color: white; + border: 2px solid black !important; + border-radius: 4px; + padding: 10px 20px; + border-radius: 5px; + font-size: 16px; + position: relative; /* override absolute */ + color: #005f73; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; +} + +.back-button:hover { + background: #4ca3b3; + transform: scale(1.05); + color: #000000; +} + +.back-to-home-btn { + background-color: white; + border: 2px solid black !important; + border-radius: 4px; + padding: 10px 20px; + border-radius: 5px; + font-size: 16px; + position: relative; /* override absolute */ + color: #005f73; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; +} + +.back-to-home-btn:hover { + background: #4ca3b3; + transform: scale(1.05); + color: #000000; +} + +.required { + color: red; + font-weight: bold; +} + +.container { + padding: 20px; + max-width: 1200px; + margin: 0 auto; + width: 100%; +} + +h2 { + color: #0B3954; + margin-bottom: 30px; +} + +.form-container { + background: white; + padding: 30px; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-bottom: 20px; +} + +.form-group { + margin-bottom: 20px; + display: flex; + flex-direction: column; +} + +.form-group label { + margin-bottom: 5px; + font-weight: bold; + color: #333; +} + +.form-control { + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; +} + +.file-input { + display: flex; + gap: 10px; +} + +.file-input button { + background: #f0f0f0; + border: none; + padding: 8px 15px; + border-radius: 4px; +} + +.radio-group { + display: flex; + gap: 20px; +} + +.radio-option { + display: flex; + align-items: center; + gap: 5px; +} + +.submit-btn { + display: flex; + justify-content: center; + margin-top: 20px; +} + +.submit-btn input[type="submit"] { + background-color: #005f73; + color: #fff; + font-size: 1rem; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + transition: background 0.3s ease; +} + +.submit-btn input[type="submit"]:hover { + background: #005f05; +} +/* Responsive Design for Tablets */ +@media ( max-width : 768px) { + .form-row { + grid-template-columns: 1fr; + } + .form-container { + padding: 20px; + } + .form-title { + font-size: 1.5rem; + } + .form-control { + font-size: 1rem; + } +} + +/* Responsive Design for Mobile */ +@media ( max-width : 480px) { + .form-row { + grid-template-columns: 1fr; + } + .submit-btn input[type="submit"] { + width: 100%; + font-size: 1.2rem; + padding: 12px; + } + .form-container { + padding: 15px; + } + .form-title { + font-size: 1.2rem; + } +} \ No newline at end of file diff --git a/src/main/webapp/css/btn-secondary.css b/src/main/webapp/css/btn-secondary.css new file mode 100644 index 0000000..94e8f42 --- /dev/null +++ b/src/main/webapp/css/btn-secondary.css @@ -0,0 +1,12 @@ +.btn-secondary { + background-color: white !important; + color: black !important; + border: 2px solid black !important; + padding: 5px 10px; + border-radius: 4px; +} + +.btn-secondary:hover { + background-color: #6c757d !important; + color: white !important; +} \ No newline at end of file diff --git a/src/main/webapp/css/cust-rep-det-search-display.css b/src/main/webapp/css/cust-rep-det-search-display.css new file mode 100644 index 0000000..7cb7b2b --- /dev/null +++ b/src/main/webapp/css/cust-rep-det-search-display.css @@ -0,0 +1,108 @@ +.result-container { + margin-top: 20px; + overflow-x: auto; + overflow-y: auto; +} + +.cont-det-table { + width: 125%; + border-collapse: separate; + border-spacing: 0; + border: 2px solid #f0f0f0; + margin-top: 20px; + font-family: Arial, sans-serif; + font-size: 14px; + table-layout: auto; + border-radius: 12px; + overflow: hidden; +} + +.cont-det-table th, .cont-det-table td { + border: 1px solid #e0e0e0; + padding: 12px; + text-align: center; +} + +.cont-det-table td.no-word-wrap { + white-space: nowrap; +} + +.cont-det-table th { + background-color: #005f73; + color: white; + text-align: center; +} + +.cont-det-table tr:nth-child(even) { + background-color: #f9f9f9; +} + +.cont-det-table tr:hover { + background-color: #f1f1f1; +} + +.view-btn { + background-color: #005f73 !important; + color: white !important; + padding: 5px 10px; + border: none !important; + border-radius: 4px; +} + +.view-btn:hover { + background-color: #005f05 !important; +} + +.btn-primary { + background-color: #005f73 !important; + color: white !important; + border: none !important; + padding: 5px 10px; + border-radius: 4px; +} + +.btn-primary:hover { + background-color: #005f05 !important; +} + +.cont-det-table th, .cont-det-table td { + text-align: center; +} + +.button-group button { + margin-right: 10px; /* Adjust the value as needed */ +} + +.button-group button:last-child { + margin-right: 0; /* Removes margin from the last button */ +} + +.status-active { + background-color: #28a745; /* Green */ + color: black; + padding: 5px 10px; + border-radius: 15px; /* Rounded edges */ + font-size: 14px; + font-weight: bold; + display: inline-block; /* Makes it look like a tag */ +} + +.status-expired { + background-color: #dc3545; /* Red */ + color: black; + padding: 5px 10px; + border-radius: 15px; /* Rounded edges */ + font-size: 14px; + font-weight: bold; + display: inline-block; /* Makes it look like a tag */ +} + +.status-soon-expires { + background-color: #ffc107; /* Yellow */ + color: black; + padding: 5px 10px; + border-radius: 15px; /* Rounded edges */ + font-size: 14px; + font-weight: bold; + display: inline-block; /* Makes it look like a tag */ +} diff --git a/src/main/webapp/css/datatable-styles.css b/src/main/webapp/css/datatable-styles.css new file mode 100644 index 0000000..4fc6768 --- /dev/null +++ b/src/main/webapp/css/datatable-styles.css @@ -0,0 +1,98 @@ +#custom_info { + display: flex; + align-items: center; +} + +#custom_length { + display: flex; + align-items: center; + gap: 8px; /* Add spacing between dropdown and label */ + white-space: nowrap; /* Prevent wrapping */ +} + +.dataTables_length label { + display: flex; + align-items: center; + margin: 0; + gap: 5px; /* Adjust spacing between text and dropdown */ +} + +.dataTables_length select { + display: inline-block; + width: auto; /* Ensure dropdown adjusts to content */ +} + +#custom_pagination { + display: flex; + justify-content: flex-end; /* Align pagination to the right */ + align-items: center; +} + +.dataTables_filter { + display: none; +} + +/* Apply border-radius to the table */ +.det-table { + width: 125%; + border-collapse: separate; + border-spacing: 0; + border: 2px solid #f0f0f0; + margin-top: 20px; + font-family: Arial, sans-serif; + font-size: 14px; + table-layout: auto; + border-radius: 12px; + overflow: hidden; +} + +.det-table th, .det-table td { + border: 1px solid #e0e0e0; + padding: 12px; + text-align: center; +} + +.det-table td.no-word-wrap { + white-space: nowrap; +} + +.det-table th { + background-color: #005f73; + color: white; + text-align: center; +} + +.det-table tr:nth-child(even) { + background-color: #f9f9f9; +} + +.det-table tr:hover { + background-color: #f1f1f1; +} + +.det-table th, .det-table td { + text-align: center; +} + +.view-btn { + background-color: #005f73; + color: white; + padding: 5px 10px; + border: none; + border-radius: 4px; +} + +.view-btn:hover { + background-color: #005f05; +} + +@media (max-width: 767.98px) { + .btn-group { + width: 100%; + justify-content: center; + } + .btn-group .btn { + width: 48%; /* make buttons fill container nicely */ + margin: 1px; + } +} diff --git a/src/main/webapp/css/exist-bill-det-display.css b/src/main/webapp/css/exist-bill-det-display.css new file mode 100644 index 0000000..0c6350d --- /dev/null +++ b/src/main/webapp/css/exist-bill-det-display.css @@ -0,0 +1,42 @@ +.bill-title, .cont-title { + text-align: center; + color: #003366; + margin-bottom: 20px; + text-decoration: underline; + font-size: 24px; +} + +.table-header { + background-color: #003366; + color: white; +} + +.table-bordered th, .table-bordered td { + border: 1px solid #003366; +} + +.fas.fa-eye { + background-color: white; + color: black; +} + +.fas.fa-eye:hover { + color: #6c757d; +} + +.pdf-container { + width: 100%; + height: 80vh; /* Responsive height: 80% of viewport height */ + overflow-y: auto; +} + +canvas { + width: 100% !important; /* Ensures canvas scales with container */ + height: auto !important; +} + +@media ( max-width : 768px) { + .responsive-text { + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/src/main/webapp/css/exist-cont-det-display.css b/src/main/webapp/css/exist-cont-det-display.css new file mode 100644 index 0000000..48e5b0b --- /dev/null +++ b/src/main/webapp/css/exist-cont-det-display.css @@ -0,0 +1,66 @@ +.vend-details-container { + background-color: #fff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + margin: 20px auto; +} + +td.text-wrap { + max-width: 500px; + white-space: normal; +} + +.vend-title, .cont-title { + text-align: center; + color: #003366; + margin-bottom: 20px; + text-decoration: underline; + font-size: 24px; +} + +.vend-col { + color: #333; +} + +.vend-col strong { + font-weight: bold; + color: #003366; +} + +.status-active { + background-color: #28a745; /* Green */ + color: black; + padding: 5px 10px; + border-radius: 15px; /* Rounded edges */ + font-size: 14px; + font-weight: bold; + display: inline-block; /* Makes it look like a tag */ +} + +.status-expired { + background-color: #dc3545; /* Red */ + color: black; + padding: 5px 10px; + border-radius: 15px; /* Rounded edges */ + font-size: 14px; + font-weight: bold; + display: inline-block; /* Makes it look like a tag */ +} + +.status-soon-expires { + background-color: #ffc107; /* Yellow */ + color: black; + padding: 5px 10px; + border-radius: 15px; /* Rounded edges */ + font-size: 14px; + font-weight: bold; + display: inline-block; /* Makes it look like a tag */ +} + +@media ( max-width : 768px) { + .vend-col { + margin-bottom: 10px; + /* Add space between columns on smaller screens */ + } +} \ No newline at end of file diff --git a/src/main/webapp/css/exist-vend-det-search-display.css b/src/main/webapp/css/exist-vend-det-search-display.css new file mode 100644 index 0000000..271fee7 --- /dev/null +++ b/src/main/webapp/css/exist-vend-det-search-display.css @@ -0,0 +1,78 @@ +.result-container { + margin-top: 20px; + overflow-x: auto; + overflow-y: auto; +} + +.contractor-table { + width: 125%; + border-collapse: separate; + border-spacing: 0; + border: 2px solid #f0f0f0; + margin-top: 20px; + font-family: Arial, sans-serif; + font-size: 14px; + table-layout: auto; + border-radius: 12px; + overflow: hidden; +} + +.contractor-table th, .contractor-table td { + border: 1px solid #e0e0e0; + padding: 12px; + text-align: center; +} + +.contractor-table td.no-word-wrap { + white-space: nowrap; +} + +.contractor-table th { + background-color: #005f73; + color: white; + text-align: center; +} + +.contractor-table tr:nth-child(even) { + background-color: #f9f9f9; +} + +.contractor-table tr:hover { + background-color: #f1f1f1; +} + +.view-btn { + background-color: #005f73 !important; + color: white !important; + padding: 5px 10px; + border: none !important; + border-radius: 4px; +} + +.view-btn:hover { + background-color: #005f05 !important; +} + +.btn-primary { + background-color: #005f73 !important; + color: white !important; + border: none !important; + padding: 5px 10px; + border-radius: 4px; +} + +.btn-primary:hover { + background-color: #005f05 !important; +} + +.contractor-table th, .contractor-table td { + text-align: center; +} + +.button-group button { + margin-right: 10px; /* Adjust the value as needed */ +} + +.button-group button:last-child { + margin-right: 0; /* Removes margin from the last button */ +} \ No newline at end of file diff --git a/src/main/webapp/css/ext-bill-det-entry.css b/src/main/webapp/css/ext-bill-det-entry.css new file mode 100644 index 0000000..5e5cdd4 --- /dev/null +++ b/src/main/webapp/css/ext-bill-det-entry.css @@ -0,0 +1,8 @@ +.bill-col { + color: #333333; +} + +.bill-col label { + font-weight: bold; + color: #333333; +} \ No newline at end of file diff --git a/src/main/webapp/css/ext-bill-res-display.css b/src/main/webapp/css/ext-bill-res-display.css new file mode 100644 index 0000000..c1c41bd --- /dev/null +++ b/src/main/webapp/css/ext-bill-res-display.css @@ -0,0 +1,66 @@ +.result-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + background: white; + padding: 30px; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + min-height: 300px; /* Ensure the container has some height */ +} + +.icon { + margin-bottom: 20px; +} + +.error-message { + font-size: 1rem; + color: red; + line-height: 1.5; + margin-bottom: 30px; +} + +.success-icon, .failure-icon { + width: 50px; + height: 50px; +} + +.success-title, .failure-title { + font-size: 1.8rem; + color: #005f73; + margin-bottom: 20px; +} + +.contractor-info { + font-size: 1rem; + color: #333; + line-height: 1.5; + margin-bottom: 30px; +} + +.contractor-info strong { + color: #0B3954; +} + +.back-button:active { + transform: scale(0.95); +} + +/* Responsive Design for Mobile */ +@media ( max-width : 480px) { + .result-container { + padding: 20px; + } + .success-title, .failure-title { + font-size: 1.5rem; + } + .contractor-info { + font-size: 0.9rem; + } + .back-button { + font-size: 0.9rem; + padding: 8px 15px; + } +} \ No newline at end of file diff --git a/src/main/webapp/css/ext-cont-det-entry.css b/src/main/webapp/css/ext-cont-det-entry.css new file mode 100644 index 0000000..f55e6e3 --- /dev/null +++ b/src/main/webapp/css/ext-cont-det-entry.css @@ -0,0 +1,22 @@ +.ext-cont-det-container { + background-color: #fff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + margin: 20px auto; +} + +.ext-cont-title { + text-align: center; + color: #003366; + margin-bottom: 20px; + text-decoration: underline; + font-size: 24px; +} + +@media ( max-width : 768px) { + .vend-col { + margin-bottom: 10px; + /* Add space between columns on smaller screens */ + } +} \ No newline at end of file diff --git a/src/main/webapp/css/header-styles.css b/src/main/webapp/css/header-styles.css new file mode 100644 index 0000000..08d61d8 --- /dev/null +++ b/src/main/webapp/css/header-styles.css @@ -0,0 +1,77 @@ +.header { + background-color: #005f73; + padding: 10px 20px; + display: flex; + align-items: center; + /* justify-content: space-between; */ + position: relative; + color: white; +} + +.header .logo-left img { + height: 60px; + width: 60px; + margin-right: 10px; +} + +.header .title { + text-align: center; + /* flex-grow: 1; */ + position: absolute; + transform: translateX(-50%); + left: 50% +} + +.header .title h2 { + margin: 0; + font-size: 1.5rem; +} + +.header .logos-right img { + height: 60px; + margin-left: 10px; +} + +.header .logo-left { + display: flex; + align-items: center; +} + +.header .logo-text { + display: flex; + flex-direction: column; + line-height: 1; +} + +.header .logo-text h2 { + margin: 0; + font-size: 0.8rem; + color: white; + font-weight: bold; +} + +.header .logo-text p { + margin: 0; + font-size: 0.5rem; + color: white; +} + +@media ( max-width : 480px) { + .header { + flex-direction: column; + align-items: flex-start; + position: relative; + } + .header .logo-left img { + margin-bottom: 10px; + } + .header .logos-right img { + margin-bottom: 10px; + } + .header .title { + position: static; /* Reset absolute positioning */ + transform: none; /* Remove the translate effect */ + margin-top: 10px; + text-align: center; /* Ensure the text stays centered */ + } +} \ No newline at end of file diff --git a/src/main/webapp/css/home.css b/src/main/webapp/css/home.css new file mode 100644 index 0000000..833c47f --- /dev/null +++ b/src/main/webapp/css/home.css @@ -0,0 +1,38 @@ +.button-row { + display: flex; + justify-content: center; + gap: 40px; + margin-top: 20px; +} +.stats { + color: #005f73; + font-weight: bold; +} +.custom-button { + padding: 15px 30px; + background: white; + border: 1px solid #ccc; + border-radius: 10px; + font-size: 1rem; + color: #005f73; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.custom-button:hover { + background: #4ca3b3; + transform: scale(1.05); + color: #000000; +} + +.custom-button:active { + transform: scale(0.95); +} + +@media ( max-width : 768px) { + .button-row { + flex-direction: column; + gap: 20px; + } +} \ No newline at end of file diff --git a/src/main/webapp/css/login-form-style.css b/src/main/webapp/css/login-form-style.css new file mode 100644 index 0000000..2301f7f --- /dev/null +++ b/src/main/webapp/css/login-form-style.css @@ -0,0 +1,273 @@ +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 100; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-100.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 200; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-200.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 300; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-300.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 400; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-regular.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 500; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-500.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 600; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-600.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 700; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-700.woff2") + format("woff2"); +} + +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 100; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-100.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 200; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-200.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 300; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-300.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 400; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-regular.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 500; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-500.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 600; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-600.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 700; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-700.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 100; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-100.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 200; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-200.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 300; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-300.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 400; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-regular.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 500; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-500.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 600; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-600.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 700; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-700.woff2") + format("woff2"); +} + +* { + margin: 0; + border: 0; + padding: 0; + box-sizing: border-box; + font-family: "Poppins", sans-serif; +} + +body { + background: linear-gradient(45deg, #f6f7fb, #4ca3b3); + background-repeat: no-repeat; + min-height: 100vh; + min-width: 100vw; + display: flex; + align-items: center; + justify-content: center; + height: 100%; + margin: 0; + padding: 0; +} + +div.container { + background: white; + min-width: 320px; + min-height: 33vh; + padding: 2rem; + box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.2); + border-radius: 8px; +} + +div h2 { + font-weight: 600; + margin-bottom: 2rem; + position: relative; +} + +div h2::before { + content: ""; + position: absolute; + height: 4px; + width: 25px; + bottom: 3px; + left: 0; + border-radius: 8px; + background: #005f73; +} + +form { + display: flex; + flex-direction: column; +} + +.input-field { + position: relative; + margin-bottom: 1.5rem; /* instead of targeting only first-child */ +} + +.input-field .underline::before { + content: ""; + position: absolute; + height: 1px; + width: 100%; + bottom: -5px; + left: 0; + background: rgba(0, 0, 0, 0.2); +} + +.input-field .underline::after { + content: ""; + position: absolute; + height: 1px; + width: 100%; + bottom: -5px; + left: 0; + background: linear-gradient(45deg, #8e2de2, #4a00e0); + transform: scaleX(0); + transition: all 0.3s ease-in-out; + transform-origin: left; +} + +.input-field input:focus ~ .underline::after { + transform: scaleX(1); +} + +.input-field input { + outline: none; + font-size: 0.9rem; + color: rgba(0, 0, 0, 0.7); + width: 100%; +} + +.input-field input::placeholder { + color: rgba(0, 0, 0, 0.5); +} + +.container h3, +.container h4 { + text-align: center; +} + +form input[type="submit"] { + margin-top: 2rem; + padding: 0.4rem; + width: 100%; + background: #005f73; + cursor: pointer; + color: white; + font-size: 0.9rem; + font-weight: 300; + border-radius: 4px; + transition: all 0.3s ease; +} + +form input[type="submit"]:hover { + letter-spacing: 0.5px; + background: #005f05; +} + +.small-logo { + width: 60px; + height: 60px; + display: block; + margin: 0 auto; /* Centers the image */ +} diff --git a/src/main/webapp/css/upd-cont-det-entry.css b/src/main/webapp/css/upd-cont-det-entry.css new file mode 100644 index 0000000..0c30cd2 --- /dev/null +++ b/src/main/webapp/css/upd-cont-det-entry.css @@ -0,0 +1,22 @@ +.upd-cont-det-container { + background-color: #fff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + margin: 20px auto; +} + +.upd-cont-title { + text-align: center; + color: #003366; + margin-bottom: 20px; + text-decoration: underline; + font-size: 24px; +} + +@media ( max-width : 768px) { + .vend-col { + margin-bottom: 10px; + /* Add space between columns on smaller screens */ + } +} \ No newline at end of file diff --git a/src/main/webapp/css/upd-cont-rmrk-entry.css b/src/main/webapp/css/upd-cont-rmrk-entry.css new file mode 100644 index 0000000..0079bf1 --- /dev/null +++ b/src/main/webapp/css/upd-cont-rmrk-entry.css @@ -0,0 +1,22 @@ +.upd-cont-rmrk-container { + background-color: #fff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + margin: 20px auto; +} + +.upd-cont-title { + text-align: center; + color: #003366; + margin-bottom: 20px; + text-decoration: underline; + font-size: 24px; +} + +@media ( max-width : 768px) { + .vend-col { + margin-bottom: 10px; + /* Add space between columns on smaller screens */ + } +} \ No newline at end of file diff --git a/src/main/webapp/css/upd-ext-cont-det-entry.css b/src/main/webapp/css/upd-ext-cont-det-entry.css new file mode 100644 index 0000000..38287ff --- /dev/null +++ b/src/main/webapp/css/upd-ext-cont-det-entry.css @@ -0,0 +1,22 @@ +.upd-ext-cont-det-container { + background-color: #fff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + margin: 20px auto; +} + +.upd-ext-cont-title { + text-align: center; + color: #003366; + margin-bottom: 20px; + text-decoration: underline; + font-size: 24px; +} + +@media ( max-width : 768px) { + .vend-col { + margin-bottom: 10px; + /* Add space between columns on smaller screens */ + } +} \ No newline at end of file diff --git a/src/main/webapp/cust_rep_det_search_display.jsp b/src/main/webapp/cust_rep_det_search_display.jsp new file mode 100644 index 0000000..2c39596 --- /dev/null +++ b/src/main/webapp/cust_rep_det_search_display.jsp @@ -0,0 +1,361 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.text.SimpleDateFormat"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="java.util.concurrent.TimeUnit"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtContDetService"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtBillDetService"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract,org.json.*"%> +<% +//Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + response.sendRedirect("logout.jsp"); + return; + } + + // Call the ExtContDetService + ExtContDetService extContDetService = new ExtContDetService(); + + // Call the ExtBillDetService to fetch extension due amount + ExtBillDetService extBillDetService = new ExtBillDetService(); + + String reqFromDate = (String) request.getAttribute("fromDate"); + String reqToDate = (String) request.getAttribute("toDate"); + + String fromDate = reqFromDate != null ? reqFromDate : ""; + String toDate = reqToDate != null ? reqToDate : ""; + + String errorMessage = (String) request.getAttribute("errorMessage"); + String errorMessage2 = ""; + JSONArray custRepList = (JSONArray) request.getAttribute("jsonCustRep"); +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + +<%@include file="includes/cust_rep_navbar.jsp"%> +
+
+
+ +
+

Custom Reports

+
+
+
+ + + +
+
+ + +
+
+
+ + +
+
+   + <% + boolean isSearchPerformed = + (request.getParameter("from_date") != null && !request.getParameter("from_date").isEmpty()) || + (request.getParameter("to_date") != null && !request.getParameter("to_date").isEmpty()); + + if (errorMessage != null) { + %> +

<%=errorMessage%>

+ <% + } else if (isSearchPerformed && (custRepList == null || custRepList.length() <= 0)) { + %> +
+

No results found for the given criteria.

+
+ <% + } + if ((custRepList != null && custRepList.length() > 0) && isSearchPerformed) { + %> +
+
+
+ + + + + +
+
+ + +
+
+
+
+ +
+ +
+ + +
+
+ +
+ +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + <% + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + Date currentDate = sdf.parse(sdf.format(new Date())); + int daysThreshold = 60; // Days before expiry + for (int i = 0; i < custRepList.length(); i++) { + JSONObject custRep = custRepList.optJSONObject(i); + String vendName = custRep.optString("vendName").replace("-","/"); + String prodCatName = custRep.optString("prodCatName"); + String contNum = custRep.optString("contNum"); + String workDesc = custRep.optString("workDesc"); + String invoiceBillType = custRep.optString("invoiceBillType"); + Double emdAmt = custRep.optDouble("emdAmt"); + Double sdAmt = custRep.optDouble("sdAmt"); + Double asdAmt = custRep.optDouble("asdAmt"); + Double contAmt = custRep.optDouble("contAmt"); + Double amtDue = custRep.optDouble("amtDue"); + Integer isExt = custRep.optInt("isExt"); + String contRmrks = custRep.optString("contRmrk"); + String contStartDate = custRep.optString("contStartDate"); + String contEndDate; + String status; + String extContStartDate = null; + String extContEndDate = null; + Double extContAmt = null; + Double extAmtDue = null; + Double extSDAmt = null; + Double extASDAmt = null; + if (isExt == 1) { + Contract extCont = extContDetService.getExtContDet(contNum); + contEndDate = extCont.getContEndDate(); + extContStartDate = extCont.getContStartDate(); + extContEndDate = extCont.getContEndDate(); + extSDAmt = extCont.getSdAmt(); + extASDAmt = extCont.getAsdAmt(); + extContAmt = extCont.getContAmt(); + extAmtDue = extBillDetService. + getTotAmtDueByExtContNum(contNum); + } else { + + contEndDate = custRep.optString("contEndDate"); + } + + // Parse dates + Date endDate = sdf.parse(contEndDate); + Date startDate = sdf.parse(contStartDate); + + // Extract year using Calendar + Calendar startCal = Calendar.getInstance(); + startCal.setTime(startDate); + int startYear = startCal.get(Calendar.YEAR); + + Calendar endCal = Calendar.getInstance(); + endCal.setTime(endDate); + int endYear = endCal.get(Calendar.YEAR); + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); // Convert milliseconds to days + + // Determine the status based on the difference + if (diffInDays < 0) { + status = "Expired"; + } else if (diffInDays <= daysThreshold) { + status = "Soon expires"; + } else { + status = "Active"; + } + %> + + + + + + + + + + + + + + + <% + String statusClass = ""; + if ("Active".equals(status)) { + statusClass = "status-active"; + } else if ("Expired".equals(status)) { + statusClass = "status-expired"; + } else if ("Soon expires".equals(status)) { + statusClass = "status-soon-expires"; + } + %> + + + + <% } %> + +
S.NoContractor NameProduct CategoryITC.NoWork DescriptionStart DateEnd DateInvoice Bill TypeEMD AmountSD AmountAddl.SD AmountWork Order AmountAmount DueStatusRemarks
<%= vendName %><%= prodCatName %><%= contNum %><%= workDesc %><% + if (isExt == 1) { + out.println(contStartDate); + %>
+ <% out.println("Ext.Date: " + extContStartDate); %> + <% } else { + out.println(contStartDate); + } + %>
<% + if (isExt == 1) { + out.println(contEndDate); + %>
+ <% out.println("Ext.Date: " + extContEndDate); %> + <% } else { + out.println(contEndDate); + } + %>
<%= invoiceBillType %>₹ <%= String.format("%,.2f", emdAmt) %>₹ <% + if (isExt == 1) { + out.println(String.format("%,.2f", sdAmt)); + %>
+ <% out.println("Ext.SD: ₹ " + String.format("%,.2f", + extSDAmt)); %> + <% } else { + out.println(String.format("%,.2f", sdAmt)); + } + %>
₹ <% + if (isExt == 1) { + out.println(String.format("%,.2f", asdAmt)); + %>
+ <% out.println("Ext.Addl.SD: ₹ " + String.format("%,.2f", + extASDAmt)); %> + <% } else { + out.println(String.format("%,.2f", asdAmt)); + } + %>
₹ <% + if (isExt == 1) { + out.println(String.format("%,.2f", contAmt)); + %>
+ <% out.println("Ext. Work Order Amount: ₹ " + + String.format("%,.2f", extContAmt));%> + <% } else { + out.println(String.format("%,.2f", contAmt)); + } + %>
₹ <% + if (isExt == 1) { + out.println(String.format("%,.2f", + (amtDue + extAmtDue))); + %>
+ <% out.println("Amount Due: ₹ " + + String.format("%,.2f", amtDue));%> +
+ <% out.println("Ext.Amount Due: ₹ " + + String.format("%,.2f", extAmtDue));%> + <% } else { + out.println(String.format("%,.2f", amtDue)); + } + %>
+ + <%= status %> + + <%= contRmrks %>
+
+
+ <%@include file="export_pdf.html"%> +   +
+
+
+
+ <% } %> + + <% if (custRepList != null && custRepList.length() > 0) { + for (int i = 0; i < custRepList.length(); i++) { + JSONObject custRep = custRepList.optJSONObject(i); %> +
" + method="post" style="display: none;" + action="ExistBillDetServlet"> + "> + "> + "> + + +
+ <% } + } %> +
+
+<%@include file="includes/footer.jsp"%> + + + + \ No newline at end of file diff --git a/src/main/webapp/datatables-1.13.6/css/dataTables.bootstrap5.min.css b/src/main/webapp/datatables-1.13.6/css/dataTables.bootstrap5.min.css new file mode 100644 index 0000000..cb4962b --- /dev/null +++ b/src/main/webapp/datatables-1.13.6/css/dataTables.bootstrap5.min.css @@ -0,0 +1,532 @@ +:root { + --dt-row-selected: 13, 110, 253; + --dt-row-selected-text: 255, 255, 255; + --dt-row-selected-link: 9, 10, 11; + --dt-row-stripe: 0, 0, 0; + --dt-row-hover: 0, 0, 0; + --dt-column-ordering: 0, 0, 0; + --dt-html-background: white; +} + +:root.dark { + --dt-html-background: rgb(33, 37, 41); +} + +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} + +table.dataTable td.dt-control:before { + display: inline-block; + color: rgba(0, 0, 0, 0.5); + content: "►"; +} + +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "▼"; +} + +html.dark table.dataTable td.dt-control:before { + color: rgba(255, 255, 255, 0.5); +} + +html.dark table.dataTable tr.dt-hasChild td.dt-control:before { + color: rgba(255, 255, 255, 0.5); +} + +table.dataTable thead > tr > th.sorting, +table.dataTable thead > tr > th.sorting_asc, +table.dataTable thead > tr > th.sorting_desc, +table.dataTable thead > tr > th.sorting_asc_disabled, +table.dataTable thead > tr > th.sorting_desc_disabled, +table.dataTable thead > tr > td.sorting, +table.dataTable thead > tr > td.sorting_asc, +table.dataTable thead > tr > td.sorting_desc, +table.dataTable thead > tr > td.sorting_asc_disabled, +table.dataTable thead > tr > td.sorting_desc_disabled { + cursor: pointer; + position: relative; + padding-right: 26px; +} + +table.dataTable thead > tr > th.sorting:before, +table.dataTable thead > tr > th.sorting:after, +table.dataTable thead > tr > th.sorting_asc:before, +table.dataTable thead > tr > th.sorting_asc:after, +table.dataTable thead > tr > th.sorting_desc:before, +table.dataTable thead > tr > th.sorting_desc:after, +table.dataTable thead > tr > th.sorting_asc_disabled:before, +table.dataTable thead > tr > th.sorting_asc_disabled:after, +table.dataTable thead > tr > th.sorting_desc_disabled:before, +table.dataTable thead > tr > th.sorting_desc_disabled:after, +table.dataTable thead > tr > td.sorting:before, +table.dataTable thead > tr > td.sorting:after, +table.dataTable thead > tr > td.sorting_asc:before, +table.dataTable thead > tr > td.sorting_asc:after, +table.dataTable thead > tr > td.sorting_desc:before, +table.dataTable thead > tr > td.sorting_desc:after, +table.dataTable thead > tr > td.sorting_asc_disabled:before, +table.dataTable thead > tr > td.sorting_asc_disabled:after, +table.dataTable thead > tr > td.sorting_desc_disabled:before, +table.dataTable thead > tr > td.sorting_desc_disabled:after { + position: absolute; + display: block; + opacity: 0.125; + right: 10px; + line-height: 9px; + font-size: 0.8em; +} + +table.dataTable thead > tr > th.sorting:before, +table.dataTable thead > tr > th.sorting_asc:before, +table.dataTable thead > tr > th.sorting_desc:before, +table.dataTable thead > tr > th.sorting_asc_disabled:before, +table.dataTable thead > tr > th.sorting_desc_disabled:before, +table.dataTable thead > tr > td.sorting:before, +table.dataTable thead > tr > td.sorting_asc:before, +table.dataTable thead > tr > td.sorting_desc:before, +table.dataTable thead > tr > td.sorting_asc_disabled:before, +table.dataTable thead > tr > td.sorting_desc_disabled:before { + bottom: 50%; + content: "▲"; + content: "▲"/""; +} + +table.dataTable thead > tr > th.sorting:after, +table.dataTable thead > tr > th.sorting_asc:after, +table.dataTable thead > tr > th.sorting_desc:after, +table.dataTable thead > tr > th.sorting_asc_disabled:after, +table.dataTable thead > tr > th.sorting_desc_disabled:after, +table.dataTable thead > tr > td.sorting:after, +table.dataTable thead > tr > td.sorting_asc:after, +table.dataTable thead > tr > td.sorting_desc:after, +table.dataTable thead > tr > td.sorting_asc_disabled:after, +table.dataTable thead > tr > td.sorting_desc_disabled:after { + top: 50%; + content: "▼"; + content: "▼"/""; +} + +table.dataTable thead > tr > th.sorting_asc:before, +table.dataTable thead > tr > th.sorting_desc:after, +table.dataTable thead > tr > td.sorting_asc:before, +table.dataTable thead > tr > td.sorting_desc:after { + opacity: 0.6; +} + +table.dataTable thead > tr > th.sorting_desc_disabled:after, +table.dataTable thead > tr > th.sorting_asc_disabled:before, +table.dataTable thead > tr > td.sorting_desc_disabled:after, +table.dataTable thead > tr > td.sorting_asc_disabled:before { + display: none; +} + +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} + +div.dataTables_scrollBody > table.dataTable > thead > tr > th:before, +div.dataTables_scrollBody > table.dataTable > thead > tr > th:after, +div.dataTables_scrollBody > table.dataTable > thead > tr > td:before, +div.dataTables_scrollBody > table.dataTable > thead > tr > td:after { + display: none; +} + +div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 2px; +} + +div.dataTables_processing > div:last-child { + position: relative; + width: 80px; + height: 15px; + margin: 1em auto; +} + +div.dataTables_processing > div:last-child > div { + position: absolute; + top: 0; + width: 13px; + height: 13px; + border-radius: 50%; + background: rgb(13, 110, 253); + background: rgb(var(--dt-row-selected)); + animation-timing-function: cubic-bezier(0, 1, 1, 0); +} + +div.dataTables_processing > div:last-child > div:nth-child(1) { + left: 8px; + animation: datatables-loader-1 0.6s infinite; +} + +div.dataTables_processing > div:last-child > div:nth-child(2) { + left: 8px; + animation: datatables-loader-2 0.6s infinite; +} + +div.dataTables_processing > div:last-child > div:nth-child(3) { + left: 32px; + animation: datatables-loader-2 0.6s infinite; +} + +div.dataTables_processing > div:last-child > div:nth-child(4) { + left: 56px; + animation: datatables-loader-3 0.6s infinite; +} + +@keyframes datatables-loader-1 { + 0% { + transform: scale(0); + } + + 100% { + transform: scale(1); + } +} +@keyframes datatables-loader-3 { + 0% { + transform: scale(1); + } + + 100% { + transform: scale(0); + } +} +@keyframes datatables-loader-2 { + 0% { + transform: translate(0, 0); + } + + 100% { + transform: translate(24px, 0); + } +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} + +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} + +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} + +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} + +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} + +table.dataTable thead th, +table.dataTable thead td, +table.dataTable tfoot th, +table.dataTable tfoot td { + text-align: left; +} + +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} + +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} + +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} + +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} + +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} + +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} + +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} + +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} + +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} + +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} /*! Bootstrap 5 integration for DataTables + * + * ©2020 SpryMedia Ltd, all rights reserved. + * License: MIT datatables.net/license/mit + */ +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; + border-spacing: 0; +} + +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} + +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +table.dataTable.table-striped > tbody > tr:nth-of-type(2n + 1) > * { + box-shadow: none; +} + +table.dataTable > tbody > tr { + background-color: transparent; +} + +table.dataTable > tbody > tr.selected > * { + box-shadow: inset 0 0 0 9999px rgb(13, 110, 253); + box-shadow: inset 0 0 0 9999px rgb(var(--dt-row-selected)); + color: rgb(255, 255, 255); + color: rgb(var(--dt-row-selected-text)); +} + +table.dataTable > tbody > tr.selected a { + color: rgb(9, 10, 11); + color: rgb(var(--dt-row-selected-link)); +} + +table.dataTable.table-striped > tbody > tr.odd > * { + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.05); +} + +table.dataTable.table-striped > tbody > tr.odd.selected > * { + box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.95); + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95); +} + +table.dataTable.table-hover > tbody > tr:hover > * { + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.075); +} + +table.dataTable.table-hover > tbody > tr.selected:hover > * { + box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.975); + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.975); +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length select { + width: auto; + display: inline-block; +} + +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} + +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} + +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} + +div.dataTables_wrapper div.dataTables_info { + padding-top: 0.85em; +} + +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} + +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; + justify-content: flex-end; +} + +div.dataTables_wrapper div.dt-row { + position: relative; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table > thead .sorting:before, +div.dataTables_scrollBody > table > thead .sorting_asc:before, +div.dataTables_scrollBody > table > thead .sorting_desc:before, +div.dataTables_scrollBody > table > thead .sorting:after, +div.dataTables_scrollBody > table > thead .sorting_asc:after, +div.dataTables_scrollBody > table > thead .sorting_desc:after { + display: none; +} + +div.dataTables_scrollBody > table > tbody tr:first-child th, +div.dataTables_scrollBody > table > tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner { + box-sizing: content-box; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, + div.dataTables_wrapper div.dataTables_filter, + div.dataTables_wrapper div.dataTables_info, + div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } + div.dataTables_wrapper div.dataTables_paginate ul.pagination { + justify-content: center !important; + } +} + +table.dataTable.table-sm > thead > tr > th:not(.sorting_disabled) { + padding-right: 20px; +} + +table.table-bordered.dataTable { + border-right-width: 0; +} + +table.table-bordered.dataTable thead tr:first-child th, +table.table-bordered.dataTable thead tr:first-child td { + border-top-width: 1px; +} + +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} + +table.table-bordered.dataTable th:first-child, +table.table-bordered.dataTable th:first-child, +table.table-bordered.dataTable td:first-child, +table.table-bordered.dataTable td:first-child { + border-left-width: 1px; +} + +table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 1px; +} + +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-bottom-width: 1px; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} + +div.table-responsive + > div.dataTables_wrapper + > div.row + > div[class^="col-"]:first-child { + padding-left: 0; +} + +div.table-responsive + > div.dataTables_wrapper + > div.row + > div[class^="col-"]:last-child { + padding-right: 0; +} + +:root[data-bs-theme="dark"] { + --dt-row-hover: 255, 255, 255; + --dt-row-stripe: 255, 255, 255; + --dt-column-ordering: 255, 255, 255; +} diff --git a/src/main/webapp/datatables-1.13.6/js/dataTables.bootstrap5.min.js b/src/main/webapp/datatables-1.13.6/js/dataTables.bootstrap5.min.js new file mode 100644 index 0000000..274a5bb --- /dev/null +++ b/src/main/webapp/datatables-1.13.6/js/dataTables.bootstrap5.min.js @@ -0,0 +1,80 @@ +/*! DataTables Bootstrap 5 integration + * 2020 SpryMedia Ltd - datatables.net/license + */ +! function(t) { + var n, r; + "function" == typeof define && define.amd ? define(["jquery", "datatables.net"], function(e) { + return t(e, window, document) + }) : "object" == typeof exports ? (n = require("jquery"), r = function(e, a) { + a.fn.dataTable || require("datatables.net")(e, a) + }, "undefined" == typeof window ? module.exports = function(e, a) { + return e = e || window, a = a || n(e), r(e, a), t(a, 0, e.document) + } : (r(window, n), module.exports = t(n, window, window.document))) : t(jQuery, window, document) +}(function(x, e, r, o) { + "use strict"; + var i = x.fn.dataTable; + return x.extend(!0, i.defaults, { + dom: "<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row dt-row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", + renderer: "bootstrap" + }), x.extend(i.ext.classes, { + sWrapper: "dataTables_wrapper dt-bootstrap5", + sFilterInput: "form-control form-control-sm", + sLengthSelect: "form-select form-select-sm", + sProcessing: "dataTables_processing card", + sPageButton: "paginate_button page-item" + }), i.ext.renderer.pageButton.bootstrap = function(d, e, s, a, l, c) { + function u(e, a) { + for (var t, n, r = function(e) { + e.preventDefault(), x(e.currentTarget).hasClass("disabled") || b.page() == e.data.action || b.page(e.data.action).draw("page") + }, o = 0, i = a.length; o < i; o++) + if (t = a[o], Array.isArray(t)) u(e, t); + else { + switch (f = p = "", t) { + case "ellipsis": + p = "…", f = "disabled"; + break; + case "first": + p = g.sFirst, f = t + (0 < l ? "" : " disabled"); + break; + case "previous": + p = g.sPrevious, f = t + (0 < l ? "" : " disabled"); + break; + case "next": + p = g.sNext, f = t + (l < c - 1 ? "" : " disabled"); + break; + case "last": + p = g.sLast, f = t + (l < c - 1 ? "" : " disabled"); + break; + default: + p = t + 1, f = l === t ? "active" : "" + } + p && (n = -1 !== f.indexOf("disabled"), n = x("
  • ", { + class: m.sPageButton + " " + f, + id: 0 === s && "string" == typeof t ? d.sTableId + "_" + t : null + }).append(x("", { + href: n ? null : "#", + "aria-controls": d.sTableId, + "aria-disabled": n ? "true" : null, + "aria-label": w[t], + role: "link", + "aria-current": "active" === f ? "page" : null, + "data-dt-idx": t, + tabindex: n ? -1 : d.iTabIndex, + class: "page-link" + }).html(p)).appendTo(e), d.oApi._fnBindAction(n, { + action: t + }, r)) + } + } + var p, f, t, b = new i.Api(d), + m = d.oClasses, + g = d.oLanguage.oPaginate, + w = d.oLanguage.oAria.paginate || {}, + e = x(e); + try { + t = e.find(r.activeElement).data("dt-idx") + } catch (e) { } + var n = e.children("ul.pagination"); + n.length ? n.empty() : n = e.html("
      ").children("ul").addClass("pagination"), u(n, a), t !== o && e.find("[data-dt-idx=" + t + "]").trigger("focus") + }, i +}); \ No newline at end of file diff --git a/src/main/webapp/datatables-1.13.6/js/jquery.dataTables.min.js b/src/main/webapp/datatables-1.13.6/js/jquery.dataTables.min.js new file mode 100644 index 0000000..1557410 --- /dev/null +++ b/src/main/webapp/datatables-1.13.6/js/jquery.dataTables.min.js @@ -0,0 +1,2990 @@ +/*! DataTables 1.13.6 + * ©2008-2023 SpryMedia Ltd - datatables.net/license + */ +! function(n) { + "use strict"; + var a; + "function" == typeof define && define.amd ? define(["jquery"], function(t) { + return n(t, window, document) + }) : "object" == typeof exports ? (a = require("jquery"), "undefined" == typeof window ? module.exports = function(t, e) { + return t = t || window, e = e || a(t), n(e, t, t.document) + } : n(a, window, window.document)) : window.DataTable = n(jQuery, window, document) +}(function(P, j, v, H) { + "use strict"; + + function d(t) { + var e = parseInt(t, 10); + return !isNaN(e) && isFinite(t) ? e : null + } + + function l(t, e, n) { + var a = typeof t, + r = "string" == a; + return "number" == a || "bigint" == a || !!h(t) || (e && r && (t = $(t, e)), n && r && (t = t.replace(q, "")), !isNaN(parseFloat(t)) && isFinite(t)) + } + + function a(t, e, n) { + var a; + return !!h(t) || (h(a = t) || "string" == typeof a) && !!l(t.replace(V, "").replace(/ + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_act_ext_bill_det_display_msg.jsp b/src/main/webapp/exist_act_ext_bill_det_display_msg.jsp new file mode 100644 index 0000000..0ec63e3 --- /dev/null +++ b/src/main/webapp/exist_act_ext_bill_det_display_msg.jsp @@ -0,0 +1,375 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill,java.net.*"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<% +String errorMessage = (String) request.getAttribute("errorMessage"); +String vendName = (String) request.getAttribute("vendName"); +String workDesc = (String) request.getAttribute("workDesc"); + +Integer lockPercent = 0; +Integer lockAmount = 0; + +// Retrieve the BillDetListWrapper and ContractDetListWrapper attribute set by the servlet +BillDetListWrapper billDetListWrapper = (BillDetListWrapper) request.getAttribute("billListWrapper"); +ContDetListWrapper contDetListWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + +if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + for (Bill bill : billDetListWrapper.getBillDetList()) { + lockPercent += (int) Math.round(bill.getPercentApplied()); + lockAmount += (int) Math.round(bill.getTotAmt()); + } +} + +Integer thresholdAmt = (int) Math.round(contDetListWrapper.getContList().get(0).getContAmt()); +String contNum = contDetListWrapper.getContList().get(0).getContNum(); +List extContList = new ArrayList(); +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + +
      +
      +
      + +
      +

      Active Extension Contract Details

      +

      Via Message Notification

      + <% + if (contDetListWrapper != null && !contDetListWrapper.getContList().isEmpty()) { + %> +
      +
      +

      + Extension ITC No : + <%=contDetListWrapper.getContList().get(0).getContNum()%>

      + + + +
      +
      +
      +
      +

      Work Description : + <%=workDesc%> +

      +
      +
      +
      +

      Extension Work Order Amount : + ₹ <%=String.format("%,.2f", contDetListWrapper.getContList().get(0).getContAmt())%> +

      +
      +
      +
      +

      + Ext.AS File : + +

      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContAgreeFilePath().trim().equals("-")) { + %> +
      +

      + Ext.Agreement File : + +

      +
      +
      +

      + Ext.WO File : + +

      +
      + <% + } else { + %> +
      +

      + Ext.WO File : + +

      +
      + <% + } + %> +
      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContASDFilePath().trim().equals("-")) { + %> +
      +

      + Ext.SD File : + +

      +
      +
      +

      + Ext.ASD File : + +

      +
      + <% + } else if (!contDetListWrapper.getContList().get(0).getContSDFilePath().trim().equals("-")){ + %> +
      +

      + Ext.SD File : + +

      +
      + <% + } + %> +
      + <% + } + %> +
      +
      +

      + Remarks : + <%=contDetListWrapper.getContList().get(0).getContRmrk()%> +

      +
      +
      +

      Extension Bill Details

      + <% + if (errorMessage != null) { + %> +
      + +
      + +
      +
      +
      +
      +

      <%=errorMessage%>

      + <% + } else if ((billDetListWrapper == null) && (contDetListWrapper != null || + !contDetListWrapper.getContList().isEmpty())) { + %> +
      + +
      + +
      +
      +
      +
      +
      +

      No results found for the given criteria.

      +
      + <% + } if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + %> + +
      + +
      + +
      + + +
      +
      + +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + <% + if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { + %> + + <% + } + %> + + + + + + <% + double lastClaimedAmountDue = 0.0; + boolean isFirstRow = true; + + for (Bill bill : billDetListWrapper.getBillDetList()) { + boolean isClaimed = bill.getBillStatName().equalsIgnoreCase("CLAIMED"); + double amtDue; + if (isFirstRow) { + // First row logic + lastClaimedAmountDue = isClaimed ? bill.getAmtDue() : bill.getContAmt(); + amtDue = lastClaimedAmountDue; + isFirstRow = false; + } else { + if (isClaimed) { + // For claimed rows, deduct amount paid + lastClaimedAmountDue -= bill.getAmtPaid(); + } + // For unclaimed rows, retain the lastClaimedAmountDue + amtDue = lastClaimedAmountDue; + } + %> + + + + + + + + + + + + + + + + <% if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> + + <% } %> + + + + <% } %> + +
      S.NoBill PeriodStart DateEnd DateInvoice DateStatusCurrent AmountRTGS AmountCGST AmountSGST AmountIGST AmountIT Tax AmountSNA Ret.AmountTotal AmountPercent AppliedBalance To Be ClaimedView Files
      <%= bill.getInvoiceBillingPeriod() %><%= bill.getInvoiceStartDate() %><%= bill.getInvoiceEndDate() %><%= bill.getInvoiceBillDate() %><%= bill.getBillStatName() %>₹ + <% + double currentAmt = bill.getTotAmt() + bill.getAmtDue(); + if (bill.getBillStatName().equals("CLAIMED")) { + out.print(String.format("%,.2f", currentAmt)); + } else { + out.print(String.format("%,.2f", lastClaimedAmountDue)); + } + %> + ₹ <%= String.format("%,.2f", bill.getAmtExclTax()) %>₹ <%= String.format("%,.2f", bill.getCgstAmt()) %>₹ <%= String.format("%,.2f", bill.getSgstAmt()) %>₹ <%= String.format("%,.2f", bill.getIgstAmt()) %>₹ <%= String.format("%,.2f", bill.getItTaxAmt())%>₹ <%= String.format("%,.2f", bill.getSnaRetAmt())%>₹ <%= String.format("%,.2f", bill.getTotAmt()) %><%= bill.getPercentApplied()%> %₹ <%= String.format("%,.2f", amtDue) %> +
      + + + <% if (!bill.getRtgsFilePath().equals("-")) { %> + + <% } %> +
      +
      +
      + <%@include file="export_pdf.html"%> + <% } %> +   +
      +
      +
      +
      +
      + +
      +<%@include file="pdf_modal.html" %> +<%@include file="includes/footer.jsp"%> + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_bill_det_display.jsp b/src/main/webapp/exist_bill_det_display.jsp new file mode 100644 index 0000000..90602b1 --- /dev/null +++ b/src/main/webapp/exist_bill_det_display.jsp @@ -0,0 +1,533 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill,java.net.*"%> +<%@ page language="java" import="com.cont_mgmt.util.TimeUtils, java.text.*"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.service.ExistExtContDetService"%> +<% +// Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page + } + + String errorMessage = (String) request.getAttribute("errorMessage"); + String reqSrc = (String) request.getAttribute("reqSrc"); + String vendName = (String) request.getAttribute("vendName"); + + Integer lockPercent = 0; + Integer lockAmount = 0; + + // Call the TimeUtils + TimeUtils timeUtils = new TimeUtils(); + + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + Date currentDate = sdf.parse(sdf.format(new Date())); + + // Call the ExistExtContDetService + ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + // Retrieve the BillDetListWrapper and ContractDetListWrapper attribute set by the servlet + BillDetListWrapper billDetListWrapper = (BillDetListWrapper) request.getAttribute("billListWrapper"); + ContDetListWrapper contDetListWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + + if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + for (Bill bill : billDetListWrapper.getBillDetList()) { + lockPercent += (int) Math.round(bill.getPercentApplied()); + lockAmount += (int) Math.round(bill.getTotAmt()); + } + } + + Integer thresholdAmt = (int) Math.round(contDetListWrapper.getContList().get(0).getContAmt()); + String contNum = contDetListWrapper.getContList().get(0).getContNum(); + Integer isExtendedFlag = (int) Math.round(contDetListWrapper.getContList().get(0).getIsExtended()); + List extContList = new ArrayList(); + if (isExtendedFlag == 1) { + extContList = existExtContDetService.getExtContDet(null, contNum); + } +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + %> + <%@include file="includes/exist_navbar.jsp"%> + <% + } else if (reqSrc.equalsIgnoreCase("exp_cont_det_display_page")) { + %> + <%@include file="includes/exp_cont_navbar.jsp"%> + <% + } else if (reqSrc.equalsIgnoreCase("cust_rep_det_display_page")) { + %> + <%@include file="includes/cust_rep_navbar.jsp"%> + <% + } + %> +
      +
      +
      + +
      + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + %> +

      Contract Details

      + <% + } else if (reqSrc.equalsIgnoreCase("exp_cont_det_display_page")) { + %> +

      Expiring Contract Details

      + <% + } else if (reqSrc.equalsIgnoreCase("cust_rep_det_display_page")) { + %> +

      Custom Reports Contract Details

      + <% + } + if (contDetListWrapper != null && !contDetListWrapper.getContList().isEmpty()) { + %> +
      +
      +

      + ITC No : + <%=contDetListWrapper.getContList().get(0).getContNum()%>

      + + + +
      +
      +
      +
      +

      + Work Description : + <%=contDetListWrapper.getContList().get(0).getWorkDesc()%>

      + +
      +
      +
      +
      +

      Work Order Amount : + ₹ <%=String.format("%,.2f", contDetListWrapper.getContList().get(0).getContAmt())%> +

      +
      +
      +
      +

      + AS File : + +

      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContLOAFilePath().trim().equals("-")) { + %> +
      +

      + LOA File : + +

      +
      +
      +

      + Agreement File : + +

      +
      + <% + } else { + %> +
      +

      + Agreement File : + +

      +
      + <% + } + %> +
      +

      + WO File : + +

      +
      +
      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContEMDFilePath().trim().equals("-")) { + %> +
      +

      + EMD File : + +

      +
      + <% + } if (!contDetListWrapper.getContList().get(0).getContSDFilePath().trim().equals("-")) { + %> +
      +

      + SD File : + +

      +
      + <% + } if (!contDetListWrapper.getContList().get(0).getContASDFilePath().trim().equals("-")) { + %> +
      +

      + ASD File : + +

      +
      + <% + } + %> +
      + <% + } + %> +
      +
      +

      + Remarks : + <%=contDetListWrapper.getContList().get(0).getContRmrk()%> +

      +
      +
      +

      Bill Details

      + <% + if (errorMessage != null) { + %> +
      + +
      + +
      + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + %> + + <% + } + %> +
      +
      +
      +

      <%=errorMessage%>

      + <% + } else if ((billDetListWrapper == null) && (contDetListWrapper != null || + !contDetListWrapper.getContList().isEmpty())) { + %> +
      + +
      + +
      + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + %> + + <% + } + %> +
      +
      +
      +
      +

      No results found for the given criteria.

      +
      + <% + } if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + Integer pos = billDetListWrapper.getBillDetList().size() - 1; + String rtgsFile = billDetListWrapper.getBillDetList().get(pos).getRtgsFilePath(); + String sdFile = contDetListWrapper.getContList().get(0).getContSDFilePath(); + Integer amtDueFlag = (int) Math.round(billDetListWrapper.getBillDetList().get(pos).getAmtDue()); + Integer diffInDaysFlag = Integer.parseInt(timeUtils.getExpiryDays(sdf, currentDate, + contDetListWrapper.getContList().get(0).getContEndDate())); + boolean rtgsFileFlag = rtgsFile.trim().equals("-") ? true : false; + boolean sdFileFlag = sdFile.trim().equals("-") ? true : false; + %> + +
      + +
      + +
      + + + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + if (lockPercent < 100 && lockAmount < thresholdAmt) { + %> + + + <% + } else if (lockAmount < thresholdAmt) { + %> + + + <% + } else if (rtgsFileFlag) { + %> + + <% + } if ((amtDueFlag <= 0 || diffInDaysFlag < 0) && (sdFileFlag)) { + %> + + <% + } + } + %> +
      +
      + <% + if (isExtendedFlag == 1) { + %> +
      +
      + +
      +
      + <% + } + %> + +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + <% + if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { + %> + + <% + } + %> + + + + + + <% + double lastClaimedAmountDue = 0.0; + boolean isFirstRow = true; + + for (Bill bill : billDetListWrapper.getBillDetList()) { + boolean isClaimed = bill.getBillStatName().equalsIgnoreCase("CLAIMED"); + double amtDue; + if (isFirstRow) { + // First row logic + lastClaimedAmountDue = isClaimed ? bill.getAmtDue() : bill.getContAmt(); + amtDue = lastClaimedAmountDue; + isFirstRow = false; + } else { + if (isClaimed) { + // For claimed rows, deduct amount paid + lastClaimedAmountDue -= bill.getAmtPaid(); + } + // For unclaimed rows, retain the lastClaimedAmountDue + amtDue = lastClaimedAmountDue; + } + %> + + + + + + + + + + + + + + + + <% if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> + + <% } %> + + + + <% } %> + +
      S.NoBill PeriodStart DateEnd DateInvoice DateStatusCurrent AmountRTGS AmountCGST AmountSGST AmountIGST AmountIT Tax AmountSNA Ret.AmountTotal AmountPercent AppliedBalance To Be ClaimedView Files
      <%= bill.getInvoiceBillingPeriod() %><%= bill.getInvoiceStartDate() %><%= bill.getInvoiceEndDate() %><%= bill.getInvoiceBillDate() %><%= bill.getBillStatName() %>₹ + <% + double currentAmt = bill.getTotAmt() + bill.getAmtDue(); + if (bill.getBillStatName().equals("CLAIMED")) { + out.print(String.format("%,.2f", currentAmt)); + } else { + out.print(String.format("%,.2f", lastClaimedAmountDue)); + } + %> + ₹ <%= String.format("%,.2f", bill.getAmtExclTax()) %>₹ <%= String.format("%,.2f", bill.getCgstAmt()) %>₹ <%= String.format("%,.2f", bill.getSgstAmt()) %>₹ <%= String.format("%,.2f", bill.getIgstAmt()) %>₹ <%= String.format("%,.2f", bill.getItTaxAmt())%>₹ <%= String.format("%,.2f", bill.getSnaRetAmt())%>₹ <%= String.format("%,.2f", bill.getTotAmt()) %><%= bill.getPercentApplied()%> %₹ <%= String.format("%,.2f", amtDue) %> +
      + + + <% if (!bill.getRtgsFilePath().equals("-")) { %> + + <% } %> +
      +
      +
      + <%@include file="export_pdf.html"%> + <% } %> +   +
      +
      +
      +
      +
      + + + + "> +
      + <%@include file="pdf_modal.html" %> + <%@include file="includes/footer.jsp"%> + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_cont_det_display.jsp b/src/main/webapp/exist_cont_det_display.jsp new file mode 100644 index 0000000..bbd18fa --- /dev/null +++ b/src/main/webapp/exist_cont_det_display.jsp @@ -0,0 +1,412 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.text.SimpleDateFormat"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Vendor"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.VendDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" import="java.util.concurrent.TimeUnit"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExtContDetService"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistBillDetService"%> +<% +// Check if the user is logged in by checking if the user object is not null +User user = (User) session.getAttribute("user"); +if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page +} + +String errorMessage = (String) request.getAttribute("errorMessage"); + +// Retrieve the vendListWrapper attribute set by the servlet +VendDetListWrapper vendWrapper = (VendDetListWrapper) request.getAttribute("vendListWrapper"); + +// Retrieve the contListWrapper attribute set by the servlet +ContDetListWrapper contWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + +// Call the ExistBillDetService +ExistBillDetService existBillDetService = new ExistBillDetService(); + +// Call the ExtContDetService +ExtContDetService extContDetService = new ExtContDetService(); +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + + <%@include file="includes/exist_navbar.jsp"%> +
      +
      +
      + +
      +

      Existing Contractor Details

      + <% + if (vendWrapper != null && !vendWrapper.getVendList().isEmpty()) { + %> +
      +
      + Contractor Name: + <%=vendWrapper.getVendList().get(0).getVendName().replace("-", "/")%> + +
      +
      + Contractor ID: + <%=vendWrapper.getVendList().get(0).getVendId()%> + +
      +
      + Product Category: + <%=vendWrapper.getVendList().get(0).getProdCatName()%> +
      +
      +
      +
      + GST.No: + <%=vendWrapper.getVendList().get(0).getGstNum()%> +
      +
      + PAN: + <%=vendWrapper.getVendList().get(0).getPanNum()%> +
      +
      + Email Id: + <%=vendWrapper.getVendList().get(0).getEmailId()%> +
      +
      +
      +
      + Address: + <%=vendWrapper.getVendList().get(0).getVendAddr()%> +
      +
      + Contact.No - 1: + <%=vendWrapper.getVendList().get(0).getTelNum1()%> +
      +
      + Contact.No - 2: + <%=vendWrapper.getVendList().get(0).getTelNum2().equals("-") ? "Number Not Available" + : vendWrapper.getVendList().get(0).getTelNum2()%> +
      +
      + <% + } + %> +
      +

      List of Contracts

      + <% + if (errorMessage != null) { + %> +
      + +
      + +
      + +
      +
      +
      +

      <%=errorMessage%>

      + <% + } else if ((contWrapper == null) && (vendWrapper != null || !vendWrapper.getVendList().isEmpty())) { + %> +
      + +
      + +
      + +
      +
      +
      +
      +

      No results found for the given criteria.

      +
      + <% + } + if (contWrapper != null && !contWrapper.getContList().isEmpty()) { + %> + +
      + +
      + +
      + + + + +
      +
      +
      +
      + + + +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + + + + + + <% + String status = ""; + String financialYear = ""; + int daysThreshold = 60; // Days before expiry to show "Expires Soon" + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + Date currentDate = sdf.parse(sdf.format(new Date())); + for (Contract contract : contWrapper.getContList()) { + + String endDateStr; + String startDateStr; + Contract extCont = null; + if (contract.getIsExtended() == 1) { + extCont = extContDetService.getExtContDet(contract.getContNum()); + endDateStr = extCont.getContEndDate(); + startDateStr = extCont.getContStartDate(); + } else { + endDateStr = contract.getContEndDate(); + startDateStr = contract.getContStartDate(); + } + + // Parse dates + Date endDate = sdf.parse(endDateStr); + Date startDate = sdf.parse(startDateStr); + + // Extract year using Calendar + Calendar startCal = Calendar.getInstance(); + Calendar orgStartCal = Calendar.getInstance(); + orgStartCal.setTime(sdf.parse(contract.getContStartDate())); + startCal.setTime(startDate); + int startYear = startCal.get(Calendar.YEAR); + int orgStartYear = orgStartCal.get(Calendar.YEAR); + + Calendar endCal = Calendar.getInstance(); + endCal.setTime(endDate); + int endYear = endCal.get(Calendar.YEAR); + + // Construct financialYear + financialYear = orgStartYear + " - " + endYear; + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); // Convert milliseconds to days + + String contNum = contract.getContNum(); + Double sdAmt = contract.getSdAmt(); + Double asdAmt = contract.getAsdAmt(); + + // Determine the status based on the difference + if (diffInDays < 0) { + status = "Expired"; + } else if (diffInDays <= daysThreshold) { + status = "Soon expires"; + } else { + status = "Active"; + } + + /* if (amtDue == 0 && !rtgsFile.trim().equals("-")) { + updSDAmountAndASDAmountService.updSDAmountAndASDAmount(contNum, sdAmt, asdAmt); + } */ + %> + + + + + + + + + + + + <% + String statusClass = ""; + if ("Active".equals(status)) { + statusClass = "status-active"; + } else if ("Expired".equals(status)) { + statusClass = "status-expired"; + } else if ("Soon expires".equals(status)) { + statusClass = "status-soon-expires"; + } + %> + + + + <% + } + %> + +
      S.NoITC.NoWork DescriptionFinancial YearContract Start DateContract End DateInvoice Bill TypeEMD AmountSD AmountAddl.SD AmountStatusRemarks
      <%=contract.getContNum()%><%=contract.getWorkDesc()%><%=financialYear%> + <% + if (contract.getIsExtended() == 1) { + out.println(contract.getContStartDate()); + %>
      + <% + out.println("Ext.Start Date: " + extCont.getContStartDate()); + %> <% + } else { + out.println(contract.getContStartDate()); + } + %> +
      + <% + if (contract.getIsExtended() == 1) { + out.println(contract.getContEndDate()); + %>
      + <% + out.println("Ext.End Date: " + extCont.getContEndDate()); + %> <% + } else { + out.println(contract.getContEndDate()); + } + %> +
      + <% + if (contract.getIsExtended() == 1) { + out.println(contract.getInvoiceBillTypeName()); + %>
      + <% + out.println("Ext. Invoice Bill Type: " + extCont.getInvoiceBillTypeName()); + %> <% + } else { + out.println(contract.getInvoiceBillTypeName()); + } + %> +
      ₹ <%=String.format("%,.2f", contract.getEmdAmt())%>₹ <% + if (contract.getIsExtended() == 1) { + out.println(String.format("%,.2f", contract.getSdAmt())); + %>
      + <% + out.println("Ext.SD: ₹ " + String.format("%,.2f", extCont.getSdAmt())); + %> <% + } else { + out.println(String.format("%,.2f", contract.getSdAmt())); + } + %> +
      ₹ <% + if (contract.getIsExtended() == 1) { + out.println(String.format("%,.2f", contract.getAsdAmt())); + %>
      + <% + out.println("Ext.Addl.SD: ₹ " + String.format("%,.2f", extCont.getAsdAmt())); + %> <% + } else { + out.println(String.format("%,.2f", contract.getAsdAmt())); + } + %> +
      <%=status%><%=contract.getContRmrk()%>
      +
      + <%@include file="export_pdf.html"%> + <% + } + %> +   +
      +
      +
      +
      + + <% + if (contWrapper != null && !contWrapper.getContList().isEmpty()) { + for (Contract contract : contWrapper.getContList()) { + %> + + <% + } + } + %> +
      +
      + <%@include file="includes/footer.jsp"%> + + + + diff --git a/src/main/webapp/exist_exp_bill_det_display_msg.jsp b/src/main/webapp/exist_exp_bill_det_display_msg.jsp new file mode 100644 index 0000000..6a2ec24 --- /dev/null +++ b/src/main/webapp/exist_exp_bill_det_display_msg.jsp @@ -0,0 +1,399 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill,java.net.*"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.service.ExistExtContDetService"%> +<% +String errorMessage = (String) request.getAttribute("errorMessage"); + String reqSrc = (String) request.getAttribute("reqSrc"); + String vendName = (String) request.getAttribute("vendName"); + + Integer lockPercent = 0; + Integer lockAmount = 0; + + // Call the ExistExtContDetService + ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + // Retrieve the BillDetListWrapper and ContractDetListWrapper attribute set by the servlet + BillDetListWrapper billDetListWrapper = (BillDetListWrapper) request.getAttribute("billListWrapper"); + ContDetListWrapper contDetListWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + + if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + for (Bill bill : billDetListWrapper.getBillDetList()) { + lockPercent += (int) Math.round(bill.getPercentApplied()); + lockAmount += (int) Math.round(bill.getTotAmt()); + } + } + + Integer thresholdAmt = (int) Math.round(contDetListWrapper.getContList().get(0).getContAmt()); + String contNum = contDetListWrapper.getContList().get(0).getContNum(); + Integer isExtendedFlag = (int) Math.round(contDetListWrapper.getContList().get(0).getIsExtended()); + List extContList = new ArrayList(); + if (isExtendedFlag == 1) { + extContList = existExtContDetService.getExtContDet(null, contNum); + } +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + +
      +
      +
      + +
      +

      Expiring Contract Details

      +

      Via Message notification

      + <% + if (contDetListWrapper != null && !contDetListWrapper.getContList().isEmpty()) { + %> +
      +
      +

      + ITC No : + <%=contDetListWrapper.getContList().get(0).getContNum()%>

      + + +
      +
      +
      +
      +

      + Work Description : + <%=contDetListWrapper.getContList().get(0).getWorkDesc()%>

      + +
      +
      +
      +
      +

      Work Order Amount : + ₹ <%=String.format("%,.2f", contDetListWrapper.getContList().get(0).getContAmt())%> +

      +
      +
      +
      +

      + AS File : + +

      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContLOAFilePath().trim().equals("-")) { + %> +
      +

      + LOA File : + +

      +
      +
      +

      + Agreement File : + +

      +
      + <% + } else { + %> +
      +

      + Agreement File : + +

      +
      + <% + } + %> +
      +

      + WO File : + +

      +
      +
      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContEMDFilePath().trim().equals("-")) { + %> +
      +

      + EMD File : + +

      +
      + <% + } if (!contDetListWrapper.getContList().get(0).getContSDFilePath().trim().equals("-")) { + %> +
      +

      + SD File : + +

      +
      + <% + } if (!contDetListWrapper.getContList().get(0).getContASDFilePath().trim().equals("-")) { + %> +
      +

      + ASD File : + +

      +
      + <% + } + %> +
      + <% + } + %> +
      +
      +

      + Remarks : + <%=contDetListWrapper.getContList().get(0).getContRmrk()%> +

      +
      +
      +

      Bill Details

      + <% + if (errorMessage != null) { + %> +

      <%=errorMessage%>

      + <% + } else if ((billDetListWrapper == null) && (contDetListWrapper != null || + !contDetListWrapper.getContList().isEmpty())) { + %> +
      +

      No results found for the given criteria.

      +
      + <% + } if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + %> + +
      + +
      + +
      + + +
      +
      + <% + if (isExtendedFlag == 1) { + %> +
      +
      + +
      +
      + <% + } + %> + +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + <% + if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { + %> + + <% + } + %> + + + + + + <% + double lastClaimedAmountDue = 0.0; + boolean isFirstRow = true; + + for (Bill bill : billDetListWrapper.getBillDetList()) { + boolean isClaimed = bill.getBillStatName().equalsIgnoreCase("CLAIMED"); + double amtDue; + if (isFirstRow) { + // First row logic + lastClaimedAmountDue = isClaimed ? bill.getAmtDue() : bill.getContAmt(); + amtDue = lastClaimedAmountDue; + isFirstRow = false; + } else { + if (isClaimed) { + // For claimed rows, deduct amount paid + lastClaimedAmountDue -= bill.getAmtPaid(); + } + // For unclaimed rows, retain the lastClaimedAmountDue + amtDue = lastClaimedAmountDue; + } + %> + + + + + + + + + + + + + + + + <% if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> + + <% } %> + + + + <% } %> + +
      S.NoBill PeriodStart DateEnd DateInvoice DateStatusCurrent AmountRTGS AmountCGST AmountSGST AmountIGST AmountIT Tax AmountSNA Ret.AmountTotal AmountPercent AppliedBalance To Be ClaimedView Files
      <%= bill.getInvoiceBillingPeriod() %><%= bill.getInvoiceStartDate() %><%= bill.getInvoiceEndDate() %><%= bill.getInvoiceBillDate() %><%= bill.getBillStatName() %>₹ + <% + double currentAmt = bill.getTotAmt() + bill.getAmtDue(); + if (bill.getBillStatName().equals("CLAIMED")) { + out.print(String.format("%,.2f", currentAmt)); + } else { + out.print(String.format("%,.2f", lastClaimedAmountDue)); + } + %> + ₹ <%= String.format("%,.2f", bill.getAmtExclTax()) %>₹ <%= String.format("%,.2f", bill.getCgstAmt()) %>₹ <%= String.format("%,.2f", bill.getSgstAmt()) %>₹ <%= String.format("%,.2f", bill.getIgstAmt()) %>₹ <%= String.format("%,.2f", bill.getItTaxAmt())%>₹ <%= String.format("%,.2f", bill.getSnaRetAmt())%>₹ <%= String.format("%,.2f", bill.getTotAmt()) %><%= bill.getPercentApplied()%> %₹ <%= String.format("%,.2f", amtDue) %> +
      + + + <% if (!bill.getRtgsFilePath().equals("-")) { %> + + <% } %> +
      +
      +
      + <%@include file="export_pdf.html"%> + <% } %> +   +
      +
      +
      +
      +
      + + + +
      + <%@include file="pdf_modal.html" %> + <%@include file="includes/footer.jsp"%> + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_exp_ext_bill_det_display_msg.jsp b/src/main/webapp/exist_exp_ext_bill_det_display_msg.jsp new file mode 100644 index 0000000..99ca26d --- /dev/null +++ b/src/main/webapp/exist_exp_ext_bill_det_display_msg.jsp @@ -0,0 +1,375 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill,java.net.*"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<% +String errorMessage = (String) request.getAttribute("errorMessage"); +String vendName = (String) request.getAttribute("vendName"); +String workDesc = (String) request.getAttribute("workDesc"); + +Integer lockPercent = 0; +Integer lockAmount = 0; + +// Retrieve the BillDetListWrapper and ContractDetListWrapper attribute set by the servlet +BillDetListWrapper billDetListWrapper = (BillDetListWrapper) request.getAttribute("billListWrapper"); +ContDetListWrapper contDetListWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + +if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + for (Bill bill : billDetListWrapper.getBillDetList()) { + lockPercent += (int) Math.round(bill.getPercentApplied()); + lockAmount += (int) Math.round(bill.getTotAmt()); + } +} + +Integer thresholdAmt = (int) Math.round(contDetListWrapper.getContList().get(0).getContAmt()); +String contNum = contDetListWrapper.getContList().get(0).getContNum(); +List extContList = new ArrayList(); +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + +
      +
      +
      + +
      +

      Expiring Extension Contract Details

      +

      Via Message Notification

      + <% + if (contDetListWrapper != null && !contDetListWrapper.getContList().isEmpty()) { + %> +
      +
      +

      + Extension ITC No : + <%=contDetListWrapper.getContList().get(0).getContNum()%>

      + + + +
      +
      +
      +
      +

      Work Description : + <%=workDesc%> +

      +
      +
      +
      +

      Extension Work Order Amount : + ₹ <%=String.format("%,.2f", contDetListWrapper.getContList().get(0).getContAmt())%> +

      +
      +
      +
      +

      + Ext.AS File : + +

      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContAgreeFilePath().trim().equals("-")) { + %> +
      +

      + Ext.Agreement File : + +

      +
      +
      +

      + Ext.WO File : + +

      +
      + <% + } else { + %> +
      +

      + Ext.WO File : + +

      +
      + <% + } + %> +
      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContASDFilePath().trim().equals("-")) { + %> +
      +

      + Ext.SD File : + +

      +
      +
      +

      + Ext.ASD File : + +

      +
      + <% + } else if (!contDetListWrapper.getContList().get(0).getContSDFilePath().trim().equals("-")){ + %> +
      +

      + Ext.SD File : + +

      +
      + <% + } + %> +
      + <% + } + %> +
      +
      +

      + Remarks : + <%=contDetListWrapper.getContList().get(0).getContRmrk()%> +

      +
      +
      +

      Extension Bill Details

      + <% + if (errorMessage != null) { + %> +
      + +
      + +
      +
      +
      +
      +

      <%=errorMessage%>

      + <% + } else if ((billDetListWrapper == null) && (contDetListWrapper != null || + !contDetListWrapper.getContList().isEmpty())) { + %> +
      + +
      + +
      +
      +
      +
      +
      +

      No results found for the given criteria.

      +
      + <% + } if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + %> + +
      + +
      + +
      + + +
      +
      + +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + <% + if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { + %> + + <% + } + %> + + + + + + <% + double lastClaimedAmountDue = 0.0; + boolean isFirstRow = true; + + for (Bill bill : billDetListWrapper.getBillDetList()) { + boolean isClaimed = bill.getBillStatName().equalsIgnoreCase("CLAIMED"); + double amtDue; + if (isFirstRow) { + // First row logic + lastClaimedAmountDue = isClaimed ? bill.getAmtDue() : bill.getContAmt(); + amtDue = lastClaimedAmountDue; + isFirstRow = false; + } else { + if (isClaimed) { + // For claimed rows, deduct amount paid + lastClaimedAmountDue -= bill.getAmtPaid(); + } + // For unclaimed rows, retain the lastClaimedAmountDue + amtDue = lastClaimedAmountDue; + } + %> + + + + + + + + + + + + + + + + <% if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> + + <% } %> + + + + <% } %> + +
      S.NoBill PeriodStart DateEnd DateInvoice DateStatusCurrent AmountRTGS AmountCGST AmountSGST AmountIGST AmountIT Tax AmountSNA Ret.AmountTotal AmountPercent AppliedBalance To Be ClaimedView Files
      <%= bill.getInvoiceBillingPeriod() %><%= bill.getInvoiceStartDate() %><%= bill.getInvoiceEndDate() %><%= bill.getInvoiceBillDate() %><%= bill.getBillStatName() %>₹ + <% + double currentAmt = bill.getTotAmt() + bill.getAmtDue(); + if (bill.getBillStatName().equals("CLAIMED")) { + out.print(String.format("%,.2f", currentAmt)); + } else { + out.print(String.format("%,.2f", lastClaimedAmountDue)); + } + %> + ₹ <%= String.format("%,.2f", bill.getAmtExclTax()) %>₹ <%= String.format("%,.2f", bill.getCgstAmt()) %>₹ <%= String.format("%,.2f", bill.getSgstAmt()) %>₹ <%= String.format("%,.2f", bill.getIgstAmt()) %>₹ <%= String.format("%,.2f", bill.getItTaxAmt())%>₹ <%= String.format("%,.2f", bill.getSnaRetAmt())%>₹ <%= String.format("%,.2f", bill.getTotAmt()) %><%= bill.getPercentApplied()%> %₹ <%= String.format("%,.2f", amtDue) %> +
      + + + <% if (!bill.getRtgsFilePath().equals("-")) { %> + + <% } %> +
      +
      +
      + <%@include file="export_pdf.html"%> + <% } %> +   +
      +
      +
      +
      +
      + +
      +<%@include file="pdf_modal.html" %> +<%@include file="includes/footer.jsp"%> + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_expd_bill_det_display_msg.jsp b/src/main/webapp/exist_expd_bill_det_display_msg.jsp new file mode 100644 index 0000000..fa2fc5b --- /dev/null +++ b/src/main/webapp/exist_expd_bill_det_display_msg.jsp @@ -0,0 +1,399 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill,java.net.*"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.service.ExistExtContDetService"%> +<% +String errorMessage = (String) request.getAttribute("errorMessage"); + String reqSrc = (String) request.getAttribute("reqSrc"); + String vendName = (String) request.getAttribute("vendName"); + + Integer lockPercent = 0; + Integer lockAmount = 0; + + // Call the ExistExtContDetService + ExistExtContDetService existExtContDetService = new ExistExtContDetService(); + + // Retrieve the BillDetListWrapper and ContractDetListWrapper attribute set by the servlet + BillDetListWrapper billDetListWrapper = (BillDetListWrapper) request.getAttribute("billListWrapper"); + ContDetListWrapper contDetListWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + + if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + for (Bill bill : billDetListWrapper.getBillDetList()) { + lockPercent += (int) Math.round(bill.getPercentApplied()); + lockAmount += (int) Math.round(bill.getTotAmt()); + } + } + + Integer thresholdAmt = (int) Math.round(contDetListWrapper.getContList().get(0).getContAmt()); + String contNum = contDetListWrapper.getContList().get(0).getContNum(); + Integer isExtendedFlag = (int) Math.round(contDetListWrapper.getContList().get(0).getIsExtended()); + List extContList = new ArrayList(); + if (isExtendedFlag == 1) { + extContList = existExtContDetService.getExtContDet(null, contNum); + } +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + +
      +
      +
      + +
      +

      Expired Contract Details

      +

      Via Message notification

      + <% + if (contDetListWrapper != null && !contDetListWrapper.getContList().isEmpty()) { + %> +
      +
      +

      + ITC No : + <%=contDetListWrapper.getContList().get(0).getContNum()%>

      + + +
      +
      +
      +
      +

      + Work Description : + <%=contDetListWrapper.getContList().get(0).getWorkDesc()%>

      + +
      +
      +
      +
      +

      Work Order Amount : + ₹ <%=String.format("%,.2f", contDetListWrapper.getContList().get(0).getContAmt())%> +

      +
      +
      +
      +

      + AS File : + +

      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContLOAFilePath().trim().equals("-")) { + %> +
      +

      + LOA File : + +

      +
      +
      +

      + Agreement File : + +

      +
      + <% + } else { + %> +
      +

      + Agreement File : + +

      +
      + <% + } + %> +
      +

      + WO File : + +

      +
      +
      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContEMDFilePath().trim().equals("-")) { + %> +
      +

      + EMD File : + +

      +
      + <% + } if (!contDetListWrapper.getContList().get(0).getContSDFilePath().trim().equals("-")) { + %> +
      +

      + SD File : + +

      +
      + <% + } if (!contDetListWrapper.getContList().get(0).getContASDFilePath().trim().equals("-")) { + %> +
      +

      + ASD File : + +

      +
      + <% + } + %> +
      + <% + } + %> +
      +
      +

      + Remarks : + <%=contDetListWrapper.getContList().get(0).getContRmrk()%> +

      +
      +
      +

      Bill Details

      + <% + if (errorMessage != null) { + %> +

      <%=errorMessage%>

      + <% + } else if ((billDetListWrapper == null) && (contDetListWrapper != null || + !contDetListWrapper.getContList().isEmpty())) { + %> +
      +

      No results found for the given criteria.

      +
      + <% + } if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + %> + +
      + +
      + +
      + + +
      +
      + <% + if (isExtendedFlag == 1) { + %> +
      +
      + +
      +
      + <% + } + %> + +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + <% + if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { + %> + + <% + } + %> + + + + + + <% + double lastClaimedAmountDue = 0.0; + boolean isFirstRow = true; + + for (Bill bill : billDetListWrapper.getBillDetList()) { + boolean isClaimed = bill.getBillStatName().equalsIgnoreCase("CLAIMED"); + double amtDue; + if (isFirstRow) { + // First row logic + lastClaimedAmountDue = isClaimed ? bill.getAmtDue() : bill.getContAmt(); + amtDue = lastClaimedAmountDue; + isFirstRow = false; + } else { + if (isClaimed) { + // For claimed rows, deduct amount paid + lastClaimedAmountDue -= bill.getAmtPaid(); + } + // For unclaimed rows, retain the lastClaimedAmountDue + amtDue = lastClaimedAmountDue; + } + %> + + + + + + + + + + + + + + + + <% if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> + + <% } %> + + + + <% } %> + +
      S.NoBill PeriodStart DateEnd DateInvoice DateStatusCurrent AmountRTGS AmountCGST AmountSGST AmountIGST AmountIT Tax AmountSNA Ret.AmountTotal AmountPercent AppliedBalance To Be ClaimedView Files
      <%= bill.getInvoiceBillingPeriod() %><%= bill.getInvoiceStartDate() %><%= bill.getInvoiceEndDate() %><%= bill.getInvoiceBillDate() %><%= bill.getBillStatName() %>₹ + <% + double currentAmt = bill.getTotAmt() + bill.getAmtDue(); + if (bill.getBillStatName().equals("CLAIMED")) { + out.print(String.format("%,.2f", currentAmt)); + } else { + out.print(String.format("%,.2f", lastClaimedAmountDue)); + } + %> + ₹ <%= String.format("%,.2f", bill.getAmtExclTax()) %>₹ <%= String.format("%,.2f", bill.getCgstAmt()) %>₹ <%= String.format("%,.2f", bill.getSgstAmt()) %>₹ <%= String.format("%,.2f", bill.getIgstAmt()) %>₹ <%= String.format("%,.2f", bill.getItTaxAmt())%>₹ <%= String.format("%,.2f", bill.getSnaRetAmt())%>₹ <%= String.format("%,.2f", bill.getTotAmt()) %><%= bill.getPercentApplied()%> %₹ <%= String.format("%,.2f", amtDue) %> +
      + + + <% if (!bill.getRtgsFilePath().equals("-")) { %> + + <% } %> +
      +
      +
      + <%@include file="export_pdf.html"%> + <% } %> +   +
      +
      +
      +
      +
      + + + +
      + <%@include file="pdf_modal.html" %> + <%@include file="includes/footer.jsp"%> + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_expd_ext_bill_det_display_msg.jsp b/src/main/webapp/exist_expd_ext_bill_det_display_msg.jsp new file mode 100644 index 0000000..ac68aa3 --- /dev/null +++ b/src/main/webapp/exist_expd_ext_bill_det_display_msg.jsp @@ -0,0 +1,376 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill,java.net.*"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<% +String errorMessage = (String) request.getAttribute("errorMessage"); +String vendName = (String) request.getAttribute("vendName"); +String workDesc = (String) request.getAttribute("workDesc"); + +Integer lockPercent = 0; +Integer lockAmount = 0; + +// Retrieve the BillDetListWrapper and ContractDetListWrapper attribute set by the servlet +BillDetListWrapper billDetListWrapper = (BillDetListWrapper) request.getAttribute("billListWrapper"); +ContDetListWrapper contDetListWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + +if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + for (Bill bill : billDetListWrapper.getBillDetList()) { + lockPercent += (int) Math.round(bill.getPercentApplied()); + lockAmount += (int) Math.round(bill.getTotAmt()); + } +} + +Integer thresholdAmt = (int) Math.round(contDetListWrapper.getContList().get(0).getContAmt()); +String contNum = contDetListWrapper.getContList().get(0).getContNum(); +List extContList = new ArrayList(); +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + +
      +
      +
      + +
      +

      Expiring Extension Contract Details

      +

      Via Message Notification

      + <% + if (contDetListWrapper != null && !contDetListWrapper.getContList().isEmpty()) { + %> +
      +
      +

      + Extension ITC No : + <%=contDetListWrapper.getContList().get(0).getContNum()%>

      + + + +
      +
      +
      +
      +

      Work Description : + <%=workDesc%> +

      +
      +
      +
      +

      Extension Work Order Amount : + ₹ <%=String.format("%,.2f", contDetListWrapper.getContList().get(0).getContAmt())%> +

      +
      +
      +
      +

      + Ext.AS File : + +

      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContAgreeFilePath().trim().equals("-")) { + %> +
      +

      + Ext.Agreement File : + +

      +
      +
      +

      + Ext.WO File : + +

      +
      + <% + } else { + %> +
      +

      + Ext.WO File : + +

      +
      + <% + } + %> +
      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContASDFilePath().trim().equals("-")) { + %> +
      +

      + Ext.SD File : + +

      +
      +
      +

      + Ext.ASD File : + +

      +
      + <% + } else if (!contDetListWrapper.getContList().get(0).getContSDFilePath().trim().equals("-")){ + %> +
      +

      + Ext.SD File : + +

      +
      + <% + } + %> +
      + <% + } + %> +
      +
      +

      + Remarks : + <%=contDetListWrapper.getContList().get(0).getContRmrk()%> +

      +
      +
      +

      Extension Bill Details

      + <% + if (errorMessage != null) { + %> +
      + +
      + +
      +
      +
      +
      +

      <%=errorMessage%>

      + <% + } else if ((billDetListWrapper == null) && (contDetListWrapper != null || + !contDetListWrapper.getContList().isEmpty())) { + %> +
      + +
      + +
      +
      +
      +
      +
      +

      No results found for the given criteria.

      +
      + <% + } if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + %> + +
      + +
      + +
      + + +
      +
      + +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + <% + if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { + %> + + <% + } + %> + + + + + + <% + + double lastClaimedAmountDue = 0.0; + boolean isFirstRow = true; + + for (Bill bill : billDetListWrapper.getBillDetList()) { + boolean isClaimed = bill.getBillStatName().equalsIgnoreCase("CLAIMED"); + double amtDue; + if (isFirstRow) { + // First row logic + lastClaimedAmountDue = isClaimed ? bill.getAmtDue() : bill.getContAmt(); + amtDue = lastClaimedAmountDue; + isFirstRow = false; + } else { + if (isClaimed) { + // For claimed rows, deduct amount paid + lastClaimedAmountDue -= bill.getAmtPaid(); + } + // For unclaimed rows, retain the lastClaimedAmountDue + amtDue = lastClaimedAmountDue; + } + %> + + + + + + + + + + + + + + + + <% if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> + + <% } %> + + + + <% } %> + +
      S.NoBill PeriodStart DateEnd DateInvoice DateStatusCurrent AmountRTGS AmountCGST AmountSGST AmountIGST AmountIT Tax AmountSNA Ret.AmountTotal AmountPercent AppliedBalance To Be ClaimedView Files
      <%= bill.getInvoiceBillingPeriod() %><%= bill.getInvoiceStartDate() %><%= bill.getInvoiceEndDate() %><%= bill.getInvoiceBillDate() %><%= bill.getBillStatName() %>₹ + <% + double currentAmt = bill.getTotAmt() + bill.getAmtDue(); + if (bill.getBillStatName().equals("CLAIMED")) { + out.print(String.format("%,.2f", currentAmt)); + } else { + out.print(String.format("%,.2f", lastClaimedAmountDue)); + } + %> + ₹ <%= String.format("%,.2f", bill.getAmtExclTax()) %>₹ <%= String.format("%,.2f", bill.getCgstAmt()) %>₹ <%= String.format("%,.2f", bill.getSgstAmt()) %>₹ <%= String.format("%,.2f", bill.getIgstAmt()) %>₹ <%= String.format("%,.2f", bill.getItTaxAmt())%>₹ <%= String.format("%,.2f", bill.getSnaRetAmt())%>₹ <%= String.format("%,.2f", bill.getTotAmt()) %><%= bill.getPercentApplied()%> %₹ <%= String.format("%,.2f", amtDue) %> +
      + + + <% if (!bill.getRtgsFilePath().equals("-")) { %> + + <% } %> +
      +
      +
      + <%@include file="export_pdf.html"%> + <% } %> +   +
      +
      +
      +
      +
      + +
      +<%@include file="pdf_modal.html" %> +<%@include file="includes/footer.jsp"%> + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_ext_bill_det_display.jsp b/src/main/webapp/exist_ext_bill_det_display.jsp new file mode 100644 index 0000000..3ff2366 --- /dev/null +++ b/src/main/webapp/exist_ext_bill_det_display.jsp @@ -0,0 +1,486 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.dto.Bill,java.net.*"%> +<%@ page language="java" import="com.cont_mgmt.util.TimeUtils, java.text.*"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<% +//Check if the user is logged in by checking if the user object is not null +User user = (User) session.getAttribute("user"); +if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page +} + +String errorMessage = (String) request.getAttribute("errorMessage"); +String reqSrc = (String) request.getAttribute("reqSrc"); +String vendName = (String) request.getAttribute("vendName"); +String workDesc = (String) request.getAttribute("workDesc"); + +Integer lockPercent = 0; +Integer lockAmount = 0; + +// Call the TimeUtils +TimeUtils timeUtils = new TimeUtils(); + +SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); +Date currentDate = sdf.parse(sdf.format(new Date())); + +// Retrieve the BillDetListWrapper and ContractDetListWrapper attribute set by the servlet +BillDetListWrapper billDetListWrapper = (BillDetListWrapper) request.getAttribute("billListWrapper"); +ContDetListWrapper contDetListWrapper = (ContDetListWrapper) request.getAttribute("contListWrapper"); + +if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + for (Bill bill : billDetListWrapper.getBillDetList()) { + lockPercent += (int) Math.round(bill.getPercentApplied()); + lockAmount += (int) Math.round(bill.getTotAmt()); + } +} + +Integer thresholdAmt = (int) Math.round(contDetListWrapper.getContList().get(0).getContAmt()); +String contNum = contDetListWrapper.getContList().get(0).getContNum(); +List extContList = new ArrayList(); +%> + + + + + +Contract Management System + + + + +<%@include file="includes/header.jsp"%> + + +<% +if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { +%> + <%@include file="includes/exist_navbar.jsp"%> +<% +} else if (reqSrc.equalsIgnoreCase("exp_cont_det_display_page")) { +%> + <%@include file="includes/exp_cont_navbar.jsp"%> +<% +} +%> +
      +
      +
      + +
      + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + %> +

      Extension Contract Details

      + <% + } else if (reqSrc.equalsIgnoreCase("exp_cont_det_display_page")) { + %> +

      Expiring Extension Contract Details

      + <% + } + %> + <% + if (contDetListWrapper != null && !contDetListWrapper.getContList().isEmpty()) { + %> +
      +
      +

      + Extension ITC No : + <%=contDetListWrapper.getContList().get(0).getContNum()%>

      + + + +
      +
      +
      +
      +

      Work Description : + <%=workDesc%> +

      +
      +
      +
      +

      Extension Work Order Amount : + ₹ <%=String.format("%,.2f", contDetListWrapper.getContList().get(0).getContAmt())%> +

      +
      +
      +
      +

      + Ext.AS File : + +

      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContAgreeFilePath().trim().equals("-")) { + %> +
      +

      + Ext.Agreement File : + +

      +
      +
      +

      + Ext.WO File : + +

      +
      + <% + } else { + %> +
      +

      + Ext.WO File : + +

      +
      + <% + } + %> +
      +
      + <% + if (!contDetListWrapper.getContList().get(0).getContASDFilePath().trim().equals("-")) { + %> +
      +

      + Ext.SD File : + +

      +
      +
      +

      + Ext.ASD File : + +

      +
      + <% + } else if (!contDetListWrapper.getContList().get(0).getContSDFilePath().trim().equals("-")){ + %> +
      +

      + Ext.SD File : + +

      +
      + <% + } + %> +
      + <% + } + %> +
      +
      +

      + Remarks : + <%=contDetListWrapper.getContList().get(0).getContRmrk()%> +

      +
      +
      +

      Extension Bill Details

      + <% + if (errorMessage != null) { + %> +
      + +
      + +
      + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + %> + + <% + } + %> +
      +
      +
      +

      <%=errorMessage%>

      + <% + } else if ((billDetListWrapper == null) && (contDetListWrapper != null || + !contDetListWrapper.getContList().isEmpty())) { + %> +
      + +
      + +
      + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + %> + + <% + } + %> +
      +
      +
      +
      +

      No results found for the given criteria.

      +
      + <% + } if (billDetListWrapper != null && !billDetListWrapper.getBillDetList().isEmpty()) { + Integer pos = billDetListWrapper.getBillDetList().size() - 1; + String rtgsFile = billDetListWrapper.getBillDetList().get(pos).getRtgsFilePath(); + String sdFile = contDetListWrapper.getContList().get(0).getContSDFilePath(); + Integer amtDueFlag = (int) Math.round(billDetListWrapper.getBillDetList().get(pos).getAmtDue()); + Integer diffInDaysFlag = Integer.parseInt(timeUtils.getExpiryDays(sdf, currentDate, + contDetListWrapper.getContList().get(0).getContEndDate())); + boolean rtgsFileFlag = rtgsFile.trim().equals("-") ? true : false; + boolean sdFileFlag = sdFile.trim().equals("-") ? true : false; + %> + +
      + +
      + +
      + + + <% + if (reqSrc.equalsIgnoreCase("exist_cont_det_display_page")) { + if (lockPercent < 100 && lockAmount < thresholdAmt) { + %> + + + <% + } else if (lockAmount < thresholdAmt) { + %> + + + <% + } else if (rtgsFileFlag) { + %> + + <% + } if ((amtDueFlag <= 0 || diffInDaysFlag < 0) && (sdFileFlag)) { + %> + + <% + } + } + %> +
      +
      + +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + <% + if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { + %> + + <% + } + %> + + + + + + <% + double lastClaimedAmountDue = 0.0; + boolean isFirstRow = true; + + for (Bill bill : billDetListWrapper.getBillDetList()) { + boolean isClaimed = bill.getBillStatName().equalsIgnoreCase("CLAIMED"); + double amtDue; + if (isFirstRow) { + // First row logic + lastClaimedAmountDue = isClaimed ? bill.getAmtDue() : bill.getContAmt(); + amtDue = lastClaimedAmountDue; + isFirstRow = false; + } else { + if (isClaimed) { + // For claimed rows, deduct amount paid + lastClaimedAmountDue -= bill.getAmtPaid(); + } + // For unclaimed rows, retain the lastClaimedAmountDue + amtDue = lastClaimedAmountDue; + } + %> + + + + + + + + + + + + + + + + <% if (contDetListWrapper.getContList().get(0) + .getInvoiceBillTypeName() + .equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> + + <% } %> + + + + <% } %> + +
      S.NoBill PeriodStart DateEnd DateInvoice DateStatusCurrent AmountRTGS AmountCGST AmountSGST AmountIGST AmountIT Tax AmountSNA Ret.AmountTotal AmountPercent AppliedBalance To Be ClaimedView Files
      <%= bill.getInvoiceBillingPeriod() %><%= bill.getInvoiceStartDate() %><%= bill.getInvoiceEndDate() %><%= bill.getInvoiceBillDate() %><%= bill.getBillStatName() %>₹ + <% + double currentAmt = bill.getTotAmt() + bill.getAmtDue(); + if (bill.getBillStatName().equals("CLAIMED")) { + out.print(String.format("%,.2f", currentAmt)); + } else { + out.print(String.format("%,.2f", lastClaimedAmountDue)); + } + %> + ₹ <%= String.format("%,.2f", bill.getAmtExclTax()) %>₹ <%= String.format("%,.2f", bill.getCgstAmt()) %>₹ <%= String.format("%,.2f", bill.getSgstAmt()) %>₹ <%= String.format("%,.2f", bill.getIgstAmt()) %>₹ <%= String.format("%,.2f", bill.getItTaxAmt())%>₹ <%= String.format("%,.2f", bill.getSnaRetAmt())%>₹ <%= String.format("%,.2f", bill.getTotAmt()) %><%= bill.getPercentApplied()%> %₹ <%= String.format("%,.2f", amtDue) %> +
      + + + <% if (!bill.getRtgsFilePath().equals("-")) { %> + + <% } %> +
      +
      +
      + <%@include file="export_pdf.html"%> + <% } %> +   +
      +
      +
      +
      +
      + + + "> +
      +<%@include file="pdf_modal.html" %> +<%@include file="includes/footer.jsp"%> + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/exist_vend_det_search_display.jsp b/src/main/webapp/exist_vend_det_search_display.jsp new file mode 100644 index 0000000..6de9fb0 --- /dev/null +++ b/src/main/webapp/exist_vend_det_search_display.jsp @@ -0,0 +1,217 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Vendor"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.VendDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistVendDetService"%> +<% + //Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + response.sendRedirect("logout.jsp"); + return; + } + + VendDetListWrapper reqWrapper = (VendDetListWrapper) request.getAttribute("vendListWrapper"); + String errorMessage = (String) request.getAttribute("errorMessage"); + String errorMessage2 = ""; + + List reqVendors = reqWrapper != null ? reqWrapper.getVendList() : new ArrayList(); + + // Call ExistVendDetService to populate the vendor name and vendor Id options + ExistVendDetService existVendDetService = new ExistVendDetService(); + List vendors = existVendDetService.getAllVendDet(); + + // Retrieve any previously selected values + String selectedVendName = request.getParameter("vend_name") != null ? request.getParameter("vend_name") : ""; + String selectedVendId = request.getParameter("vend_id") != null ? request.getParameter("vend_id") : ""; + String selectedVendKey = request.getParameter("vend_key") != null ? request.getParameter("vend_key") : ""; + String selectedUsrId = request.getParameter("user_id") != null ? request.getParameter("user_id") : String.valueOf(user.getUserId()); + System.out.println("UserID: " + selectedUsrId); + + // Populate the vendor name and vendor ID options + String vendNameOptions = ""; + String vendIdOptions = ""; + StringBuilder vendNameDataList = new StringBuilder(); + if (vendors != null && !vendors.isEmpty()) { + for (Vendor vendor : vendors) { + vendNameDataList.append(""); + + vendIdOptions += ""; + } + } else { + errorMessage2 += "No contractors found. Please enter the contractors or contact the Database Administrator."; + } +%> + + + + + +Contract Management System + + + +<%@include file="includes/header.jsp"%> + + + <%@include file="includes/exist_navbar.jsp"%> +
      +
      +
      + +
      +

      Existing Contractor + Details

      +
      +
      +
      + + " + onchange="toggleElements()"> + + <%= vendNameDataList.toString() %> + + +
      +
      +   +
      +
      +

      Or

      +
      +
      +
      +
      + + +
      +
      +   +
      +
      +

      Or

      +
      +
      +
      +
      + + + +
      +
      +   +
      + + +
      +
      +   + <% + boolean isSearchPerformed = + (request.getParameter("vend_name") != null && !request.getParameter("vend_name").isEmpty()) || + (request.getParameter("vend_id") != null && !request.getParameter("vend_id").equals("0") && + !request.getParameter("vend_id").isEmpty()) || + (request.getParameter("vend_key") != null && !request.getParameter("vend_key").isEmpty()); + + if (errorMessage2 != null && !errorMessage2.equals("")) { %> +

      <%= errorMessage2 %>

      + <% } + if (errorMessage != null) { %> +

      <%= errorMessage %>

      + <% } else if (isSearchPerformed && (reqWrapper == null || reqWrapper.getVendList().isEmpty())) { %> +
      +

      No results found for the given criteria.

      +
      + <% } + if (reqWrapper != null && !reqWrapper.getVendList().isEmpty()) { %> +
      + +
      + + + + + + + + + + + + + + + + + + <% + int serialNo = 1; + for (Vendor vendor : reqWrapper.getVendList()) { + %> + + + + + + + + + + + + + + <% + } + %> + +
      S.NoContractor IDContractor NameNo.of.ContractProduct CategoryGST.NoPANContact.No - 1Contact.No - 2AddressEmail Id
      <%= serialNo++ %><%= vendor.getVendId() %><%= vendor.getVendName().replace("-", "/") %><%= vendor.getContCount()%><%= vendor.getProdCatName() %><%= vendor.getGstNum() %><%= vendor.getPanNum() %><%= vendor.getTelNum1() %><%= vendor.getTelNum2().equals("-") + ? " Number Not Available" : vendor.getTelNum2() %><%= vendor.getVendAddr() %><%= vendor.getEmailId() %>
      + + <% if (reqWrapper != null && !reqWrapper.getVendList().isEmpty()) { + for (Vendor vendor : reqWrapper.getVendList()) { %> + + <% } + } + %> +
      +
      + <% } %> +
      +
      + <%@include file="includes/footer.jsp"%> + + + + diff --git a/src/main/webapp/exp_cont_det_display.jsp b/src/main/webapp/exp_cont_det_display.jsp new file mode 100644 index 0000000..9efa2de --- /dev/null +++ b/src/main/webapp/exp_cont_det_display.jsp @@ -0,0 +1,274 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="java.util.concurrent.TimeUnit"%> +<%@ page language="java" import="java.text.SimpleDateFormat"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtContDetService"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtBillDetService"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract,org.json.*"%> +<% +// Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page + } + + // Call the ExtContDetService + ExtContDetService extContDetService = new ExtContDetService(); + + // Call the ExtBillDetService to fetch extension due amount + ExtBillDetService extBillDetService = new ExtBillDetService(); + + String errorMessage = ""; + JSONArray contractsJsonArray = (JSONArray) session.getAttribute("expiringContractsJson"); + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("fail".equals(status)) { + JSONObject errorMessageObject = contractsJsonArray.getJSONObject(0); + errorMessage = errorMessageObject.optString("errorMessage"); + } + } else { + errorMessage = "Unable to fetch expiring contracts"; + } +%> + + + + + +Contract Management System + + + +<%@include file="includes/header.jsp"%> + + + <%@include file="includes/exp_cont_navbar.jsp"%> +
      +
      +
      + +
      +

      Expiring Contracts

      + <% + if (errorMessage != null && !errorMessage.equals("")) { + %> +
      +

      <%=errorMessage%>. +

      +
      + <% + } else { + %> +
      + +
      + +
      + + +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + + + + <% + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + Date currentDate = sdf.parse(sdf.format(new Date())); + int daysThreshold = 60; // Days before expiry + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i ++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); + String contNum = contractObject.optString("contNum"); + String vendName = contractObject.optString("vendName").replace("-","/"); + Integer isExtendedFlag = contractObject.optInt("isExt"); + String contStartDate = contractObject.optString("contStartDate"); + String contEndDate; + String extContStartDate = null; + String extContEndDate = null; + Double extContAmt = null; + Double extAmtDue = null; + if (isExtendedFlag == 1) { + Contract extCont = extContDetService.getExtContDet(contNum); + contEndDate = extCont.getContEndDate(); + extContStartDate = extCont.getContStartDate(); + extContEndDate = extCont.getContEndDate(); + extContAmt = extCont.getContAmt(); + extAmtDue = extBillDetService. + getTotAmtDueByExtContNum(contNum); + } else { + + contEndDate = contractObject.optString("contEndDate"); + } + + Double contAmt = contractObject.optDouble("contAmt"); + String workDesc = contractObject.optString("workDesc"); + Double amtDue = contractObject.optDouble("amtDue"); + + // Parse dates + Date endDate = sdf.parse(contEndDate); + Date startDate = sdf.parse(contStartDate); + + // Extract year using Calendar + Calendar startCal = Calendar.getInstance(); + startCal.setTime(startDate); + int startYear = startCal.get(Calendar.YEAR); + + Calendar endCal = Calendar.getInstance(); + endCal.setTime(endDate); + int endYear = endCal.get(Calendar.YEAR); + + // Construct financialYear + String financialYear = startYear + " - " + endYear; + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); // Convert milliseconds to days + %> + + + + + + + + + + + + + <% } + } + } + } + %> + +
      S.NoITC.NoContractorFinancial YearContract Start DateContract End DateDays LeftWork DescriptionWork Order AmountBalance To Be Claimed
      <%= contNum %><%= vendName %><%= financialYear %> + <% + if (isExtendedFlag == 1) { + out.println(contStartDate); %> +
      + <% out.println("Ext.Date: " + + extContStartDate); %> + <% } else { + out.println(contStartDate); + } %> +
      + <% + if (isExtendedFlag == 1) { + out.println(contEndDate); %> +
      + <% out.println("Ext.Date: " + + extContEndDate); %> + <% } else { + out.println(contEndDate); + } %> +
      <% if (diffInDays >1) { + out.println(diffInDays + + " Days Left"); + } else if (diffInDays >= 0 && diffInDays <= 1) { + out.println(diffInDays + + " Day Left"); + } %> + <%= workDesc %>₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", contAmt)); + %>
      + <% out.println("Ext. Work Order Amount: ₹ " + + String.format("%,.2f", extContAmt));%> + + <% } else { + out.println(String.format("%,.2f", contAmt)); + } %> +
      ₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", + (amtDue + extAmtDue))); + %>
      + <% out.println("Amount Due: ₹ " + + String.format("%,.2f", amtDue));%> +
      + + <% out.println("Ext.Amount Due: ₹ " + + String.format("%,.2f", extAmtDue));%> + + <% } else { + out.println(String.format("%,.2f", amtDue)); + } %> +
      +
      + <%@include file="export_pdf.html"%> +   +
      +
      +
      +
      + + <% if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); %> +
      " style="display:none;" + action="ExistBillDetServlet" method="post" > + "> + "> + + +
      + <% } + } + } + %> +
      +
      + <%@include file="includes/footer.jsp"%> + + + + \ No newline at end of file diff --git a/src/main/webapp/exp_cont_det_display_msg.jsp b/src/main/webapp/exp_cont_det_display_msg.jsp new file mode 100644 index 0000000..9679be5 --- /dev/null +++ b/src/main/webapp/exp_cont_det_display_msg.jsp @@ -0,0 +1,258 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="java.util.concurrent.TimeUnit"%> +<%@ page language="java" import="java.text.SimpleDateFormat"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtBillDetService"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtContDetService"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract,org.json.*"%> +<% +// Call the ExtContDetService + ExtContDetService extContDetService = new ExtContDetService(); + + // Call the ExtBillDetService to fetch extension due amount + ExtBillDetService extBillDetService = new ExtBillDetService(); + + String errorMessage = ""; + JSONArray contractsJsonArray = (JSONArray) session.getAttribute("expiringContractsJson"); + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("fail".equals(status)) { + JSONObject errorMessageObject = contractsJsonArray.getJSONObject(0); + errorMessage = errorMessageObject.optString("errorMessage"); + } + } else { + errorMessage = "Unable to fetch expiring contracts"; + } +%> + + + + + +Contract Management System + + + +<%@include file="includes/header.jsp"%> + + +
      +
      +

      Expiring Contracts Via

      +

      Message Notifications

      + <% + if (errorMessage != null && !errorMessage.equals("")) { + %> +
      +

      <%=errorMessage%> +

      +
      + <% + } else { + %> +
      + +
      + +
      + + +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + + + + <% + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + Date currentDate = sdf.parse(sdf.format(new Date())); + int daysThreshold = 60; // Days before expiry + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i ++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); + String contNum = contractObject.optString("contNum"); + String vendName = contractObject.optString("vendName").replace("-","/"); + Integer isExtendedFlag = contractObject.optInt("isExt"); + String contStartDate; + String contEndDate; + String extContStartDate = null; + String extContEndDate = null; + Double extContAmt = null; + Double extAmtDue = null; + if (isExtendedFlag == 1) { + Contract extCont = extContDetService.getExtContDet(contNum); + contStartDate = extCont.getContStartDate(); + contEndDate = extCont.getContEndDate(); + extContStartDate = extCont.getContStartDate(); + extContEndDate = extCont.getContEndDate(); + extContAmt = extCont.getContAmt(); + extAmtDue = extBillDetService. + getTotAmtDueByExtContNum(contNum); + } + + contStartDate = contractObject.optString("contStartDate"); + contEndDate = contractObject.optString("contEndDate"); + Double contAmt = contractObject.optDouble("contAmt"); + String workDesc = contractObject.optString("workDesc"); + Double amtDue = contractObject.optDouble("amtDue"); + + // Parse dates + Date endDate = sdf.parse(contEndDate); + Date startDate = sdf.parse(contStartDate); + + // Extract year using Calendar + Calendar startCal = Calendar.getInstance(); + startCal.setTime(startDate); + int startYear = startCal.get(Calendar.YEAR); + + Calendar endCal = Calendar.getInstance(); + endCal.setTime(endDate); + int endYear = endCal.get(Calendar.YEAR); + + // Construct financialYear + String financialYear = startYear + " - " + endYear; + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); // Convert milliseconds to days + %> + + + + + + + + + + + + + <% } + } + } + } + %> + +
      S.NoITC.NoContractorFinancial YearContract Start DateContract End DateDays LeftWork DescriptionWork Order AmountBalance To Be Claimed
      <%= contNum %><%= vendName %><%= financialYear %> + <% + if (isExtendedFlag == 1) { + out.println(contStartDate); %> +
      + <% out.println("Ext.Date: " + + extContStartDate); %> + <% } else { + out.println(contStartDate); + } %> +
      + <% + if (isExtendedFlag == 1) { + out.println(contEndDate); %> +
      + <% out.println("Ext.Date: " + + extContEndDate); %> + <% } else { + out.println(contEndDate); + } %> +
      <% if (diffInDays > 1) { + out.println(diffInDays + + " Days Left"); + } else if (diffInDays >= 0 && diffInDays <= 1) { + out.println(diffInDays + + " Day Left"); + } %> + <%= workDesc %>₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", contAmt)); + %>
      + <% out.println("Ext. Work Order Amount: ₹ " + + String.format("%,.2f", extContAmt));%> + + <% } else { + out.println(String.format("%,.2f", contAmt)); + } %> +
      ₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", + (amtDue + extAmtDue))); + %>
      + <% out.println("Amount Due: ₹ " + + String.format("%,.2f", amtDue));%> +
      + + <% out.println("Ext.Amount Due: ₹ " + + String.format("%,.2f", extAmtDue));%> + + <% } else { + out.println(String.format("%,.2f", amtDue)); + } %> +
      +
      + <%@include file="export_pdf.html"%> +   +
      +
      +
      +
      + + <% if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); %> +
      " style="display:none;" + action="ExistExpBillDetMsgServlet" method="post" > + "> + "> +
      + <% } + } + } + %> +
      +
      + <%@include file="includes/footer.jsp"%> + + + \ No newline at end of file diff --git a/src/main/webapp/expd_cont_det_display_msg.jsp b/src/main/webapp/expd_cont_det_display_msg.jsp new file mode 100644 index 0000000..1d0e84c --- /dev/null +++ b/src/main/webapp/expd_cont_det_display_msg.jsp @@ -0,0 +1,258 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="java.util.*"%> +<%@ page language="java" import="java.util.concurrent.TimeUnit"%> +<%@ page language="java" import="java.text.SimpleDateFormat"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtBillDetService"%> +<%@ page language="java" import="com.cont_mgmt.service.ExtContDetService"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract,org.json.*"%> +<% +// Call the ExtContDetService + ExtContDetService extContDetService = new ExtContDetService(); + + // Call the ExtBillDetService to fetch extension due amount + ExtBillDetService extBillDetService = new ExtBillDetService(); + + String errorMessage = ""; + JSONArray contractsJsonArray = (JSONArray) session.getAttribute("expiredContractsJson"); + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("fail".equals(status)) { + JSONObject errorMessageObject = contractsJsonArray.getJSONObject(0); + errorMessage = errorMessageObject.optString("errorMessage"); + } + } else { + errorMessage = "Unable to fetch expired contracts"; + } +%> + + + + + +Contract Management System + + + +<%@include file="includes/header.jsp"%> + + +
      +
      +

      Expired Contracts Via

      +

      Message Notifications

      + <% + if (errorMessage != null && !errorMessage.equals("")) { + %> +
      +

      <%=errorMessage%> +

      +
      + <% + } else { + %> +
      + +
      + +
      + + +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      + + + + + + + + + + + + + + + + + <% + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + Date currentDate = sdf.parse(sdf.format(new Date())); + int daysThreshold = 60; // Days before expiry + if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + // Check the status in the first element of the array (or wherever you placed it) + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i ++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); + String contNum = contractObject.optString("contNum"); + String vendName = contractObject.optString("vendName").replace("-","/"); + Integer isExtendedFlag = contractObject.optInt("isExt"); + String contStartDate; + String contEndDate; + String extContStartDate = null; + String extContEndDate = null; + Double extContAmt = null; + Double extAmtDue = null; + if (isExtendedFlag == 1) { + Contract extCont = extContDetService.getExtContDet(contNum); + contStartDate = extCont.getContStartDate(); + contEndDate = extCont.getContEndDate(); + extContStartDate = extCont.getContStartDate(); + extContEndDate = extCont.getContEndDate(); + extContAmt = extCont.getContAmt(); + extAmtDue = extBillDetService.getTotAmtDueByExtContNum(contNum); + } + contStartDate = contractObject.optString("contStartDate"); + contEndDate = contractObject.optString("contEndDate"); + Double contAmt = contractObject.optDouble("contAmt"); + String workDesc = contractObject.optString("workDesc"); + Double amtDue = contractObject.optDouble("amtDue"); + + // Parse dates + Date endDate = sdf.parse(contEndDate); + Date startDate = sdf.parse(contStartDate); + + // Extract year using Calendar + Calendar startCal = Calendar.getInstance(); + startCal.setTime(startDate); + int startYear = startCal.get(Calendar.YEAR); + + Calendar endCal = Calendar.getInstance(); + endCal.setTime(endDate); + int endYear = endCal.get(Calendar.YEAR); + + // Construct financialYear + String financialYear = startYear + " - " + endYear; + + // Calculate the difference between currentDate and endDate + long diffInMillis = endDate.getTime() - currentDate.getTime(); + long diffInDays = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); // Convert milliseconds to days + %> + + + + + + + + + + + + + <% } + } + } + } + %> + +
      S.NoITC.NoContractorFinancial YearContract Start DateContract End DateDays Past ExpiryWork DescriptionWork Order AmountBalance To Be Claimed
      <%= contNum %><%= vendName %><%= financialYear %> + <% + if (isExtendedFlag == 1) { + out.println(contStartDate); %> +
      + <% out.println("Ext.Date: " + + extContStartDate); %> + <% } else { + out.println(contStartDate); + } %> +
      + <% + if (isExtendedFlag == 1) { + out.println(contEndDate); %> +
      + <% out.println("Ext.Date: " + + extContEndDate); %> + <% } else { + out.println(contEndDate); + } %> +
      <% if (diffInDays < 0) { + long daysPast = Math.abs(diffInDays); + if (daysPast == 1) { + out.println(daysPast + " Day Past Expiry"); + } else { + out.println(daysPast + " Days Past Expiry"); + } + } + %> + <%= workDesc %>₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", contAmt)); + %>
      + <% out.println("Ext. Work Order Amount: ₹ " + + String.format("%,.2f", extContAmt));%> + + <% } else { + out.println(String.format("%,.2f", contAmt)); + } %> +
      ₹ <% if (isExtendedFlag == 1) { + out.println(String.format("%,.2f", + (amtDue + extAmtDue))); + %>
      + <% out.println("Amount Due: ₹ " + + String.format("%,.2f", amtDue));%> +
      + + <% out.println("Ext.Amount Due: ₹ " + + String.format("%,.2f", extAmtDue));%> + + <% } else { + out.println(String.format("%,.2f", amtDue)); + } %> +
      +
      + <%@include file="export_pdf.html"%> +   +
      +
      +
      +
      + + <% if (contractsJsonArray != null && contractsJsonArray.length() > 0) { + JSONObject statusObject = contractsJsonArray.getJSONObject(contractsJsonArray.length() - 1); + String status = statusObject.optString("status"); + if ("success".equals(status)) { + for (int i = 0; i < contractsJsonArray.length() - 1; i++) { + JSONObject contractObject = contractsJsonArray.getJSONObject(i); %> +
      " style="display:none;" + action="ExistExpdBillDetMsgServlet" method="post" > + "> + "> +
      + <% } + } + } + %> +
      +
      + <%@include file="includes/footer.jsp"%> + + + \ No newline at end of file diff --git a/src/main/webapp/export_pdf.html b/src/main/webapp/export_pdf.html new file mode 100644 index 0000000..95629c4 --- /dev/null +++ b/src/main/webapp/export_pdf.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/main/webapp/ext_bill_det_entry.jsp b/src/main/webapp/ext_bill_det_entry.jsp new file mode 100644 index 0000000..8079955 --- /dev/null +++ b/src/main/webapp/ext_bill_det_entry.jsp @@ -0,0 +1,342 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.BillStat"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.dto.Vendor"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.VendDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.BillStatDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistVendDetService"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistBillStatDetService"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistExtContDetService"%> +<% +// Check if the user is logged in by checking if the user object is not null +User user = (User) session.getAttribute("user"); +if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page +} + +// Retrieve values passed via POST method +String reqVendId = request.getParameter("vend_id"); +String reqContNum = request.getParameter("cont_num"); +String reqWorkDesc = request.getParameter("work_desc"); + +//Call the ExistExtContDetService, ExistBillStatDetService and ExistVendDetService +ExistExtContDetService existExtContDetService = new ExistExtContDetService(); +ExistVendDetService existVendDetService = new ExistVendDetService(); +ExistBillStatDetService existBillStatDetService = new ExistBillStatDetService(); + +//Fetch ContDetList +ContDetListWrapper contDetListWrapper = new ContDetListWrapper(existExtContDetService.getExtContDet(reqVendId, reqContNum)); +List contDetList = contDetListWrapper != null ? contDetListWrapper.getContList() : new ArrayList(); + +// Fetch VendDetList +VendDetListWrapper vendDetListWrapper = new VendDetListWrapper(existVendDetService.getVendDet(reqVendId, null, null)); +List vendDetList = vendDetListWrapper != null ? vendDetListWrapper.getVendList() : new ArrayList(); + +// Fetch BillStatDetList +BillStatDetListWrapper billStatDetListWrapper = existBillStatDetService.getBillStatDet(); +List billStatDetList = billStatDetListWrapper != null ? + billStatDetListWrapper.getBillStatDetList() : new ArrayList(); + +// Populate the Bill Status options +String billStatName = ""; +for (BillStat billStat : billStatDetList) { + billStatName += ""; +} +%> + + + + + +Contract Management System + + +<%@include file="includes/header.jsp"%> + + +<%@include file="includes/exist_navbar.jsp"%> +
      +
      +
      +
      + +
      +

      New Extension Bill Entry

      +
      +
      +
      + + + + +
      +
      + + " + required disabled> + +
      +
      +
      +
      + + " + required disabled> + +
      +
      + + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + +
      +
      +
      +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      + <% if (!contDetList.get(0).getInvoiceBillTypeName(). + equalsIgnoreCase("OTHERS")) { %> + + + <% } else { %> + + + <% } %> +
      +
      + + +
      +
      +
      + <% if (contDetList.get(0).getInvoiceBillTypeName(). + equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> +
      + + +
      + <% } else { %> +
      + + +
      + <% } %> +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      + <% if (contDetList.get(0).getInvoiceBillTypeName(). + equalsIgnoreCase("PERCENTAGE BASED PAYMENT")) { %> +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + +
      +
      + <% } else { %> +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      + <% } %> +
      + +
      +
      +
      +
      +<%@include file="includes/footer.jsp"%> + + + + \ No newline at end of file diff --git a/src/main/webapp/ext_bill_res_display.jsp b/src/main/webapp/ext_bill_res_display.jsp new file mode 100644 index 0000000..de5083b --- /dev/null +++ b/src/main/webapp/ext_bill_res_display.jsp @@ -0,0 +1,81 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User"%> +<% + // Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page + } +%> + + + + + +Contract Management System + + +<%@include file="includes/header.jsp"%> + + +
      +
      +

      Contract Management System

      + <% + String errorMessage = (String) request.getAttribute("errorMessage"); + String invoiceBillPeriod = (String) request.getAttribute("invoiceBillPeriod"); + String invoiceStartDate = (String) request.getAttribute("invoiceStartDate"); + String invoiceEndDate = (String) request.getAttribute("invoiceEndDate"); + String invoiceBillDate = (String) request.getAttribute("invoiceBillDate"); + Double billSettled = (Double) request.getAttribute("billSettled"); + Double totalAmountBeforeTax = (Double) request.getAttribute("totalAmountBeforeTax"); + Double cgstAmt = (Double) request.getAttribute("cgstAmt"); + Double sgstAmt = (Double) request.getAttribute("sgstAmt"); + Double igstAmt = (Double) request.getAttribute("igstAmt"); + Double totAmt = (Double) request.getAttribute("totAmt"); + Double billToBeClaimed = (Double) request.getAttribute("billToBeClaimed"); + Double itTaxAmt = (Double) request.getAttribute("itTaxAmt"); + Double snaRetAmt = (Double) request.getAttribute("snaRetAmt"); + %> + <% if (errorMessage != null) { %> +
      + Failure +
      +

      Failed To Add New Extension Bill

      +

      <%= errorMessage %>

      + <% } else { %> +
      + Success +
      +

      New Extension Bill Added Successfully

      +

      + Invoice Bill Period: + <%= invoiceBillPeriod %>
      Invoice Start + Date: + <%= invoiceStartDate %>
      Invoice End Date: + <%= invoiceEndDate %>
      Invoice Billed Date: + <%= invoiceBillDate %>
      Bill Settled: + ₹ <%= String.format("%,.2f", billSettled) %>
      RTGS Amount: + ₹ <%= String.format("%,.2f", totalAmountBeforeTax) %>
      CGST Amount: + ₹ <%= String.format("%,.2f", cgstAmt) %>
      SGST Amount: + ₹ <%= String.format("%,.2f",sgstAmt) %>
      IGST Amount: + ₹ <%= String.format("%,.2f", igstAmt) %>
      IT Tax Amount: + ₹ <%= String.format("%,.2f", itTaxAmt) %>
      SNA Retention Amount: + ₹ <%= String.format("%,.2f", snaRetAmt) %>
      Total Amount: + ₹ <%= String.format("%,.2f", totAmt) %>
      Bill To Be Claimed: + ₹ <%= String.format("%,.2f", billToBeClaimed) %> +

      + <% } %> + +
      +
      + <%@include file="includes/footer.jsp"%> + + + \ No newline at end of file diff --git a/src/main/webapp/ext_cont_det_entry.jsp b/src/main/webapp/ext_cont_det_entry.jsp new file mode 100644 index 0000000..1fbd38a --- /dev/null +++ b/src/main/webapp/ext_cont_det_entry.jsp @@ -0,0 +1,210 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User, java.util.*"%> +<%@ page language="java" import="com.cont_mgmt.dto.Contract"%> +<%@ page language="java" import="com.cont_mgmt.service.ExistContDetService"%> +<%@ page language="java" import="com.cont_mgmt.wrapper.ContDetListWrapper"%> +<%@ page language="java" import="com.cont_mgmt.dto.InvoiceBillType"%> +<%@ page language="java" + import="com.cont_mgmt.wrapper.InvoiceBillTypeDetListWrapper"%> +<%@ page language="java" + import="com.cont_mgmt.service.ExistInvoiceBillTypeDetService"%> +<% +//Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page + } + + // Retrieve values passed via POST method + String reqVendName = request.getParameter("vend_name"); + String reqVendId = request.getParameter("vend_id"); + + // Call the ExistContDetService + ExistContDetService existContDetService = new ExistContDetService(); + + // Fetch Existing Contracts for given vendor + ContDetListWrapper contDetListWrapper = new ContDetListWrapper(existContDetService.getContDet(reqVendId, null)); + List existcontDetList = contDetListWrapper != null ? contDetListWrapper.getContList() : + new ArrayList(); + + // Populate the Existing Contract Options + String existCont = ""; + if (existcontDetList != null && !existcontDetList.isEmpty()) { + for(Contract contract : existcontDetList) { + existCont += ""; + } + } + // Call the ExistInvoiceBillTypeDetService + ExistInvoiceBillTypeDetService service = new ExistInvoiceBillTypeDetService(); + + // Fetch InvoiceBillTypeDetList + InvoiceBillTypeDetListWrapper wrapper = service.getInvoiceBillTypeDet(); + List invoiceBillTypes = wrapper != null ? wrapper.getInvoiceBillTypeDetList() + : new ArrayList(); + + // Populate the Invoice Bill Type Options + String invoiceBillTypeName = ""; + if (invoiceBillTypes != null && !invoiceBillTypes.isEmpty()) { + for (InvoiceBillType invoiceBillType : invoiceBillTypes) { + invoiceBillTypeName += ""; + } + } +%> + + + + + +Contract Management System + + +<%@include file="includes/header.jsp"%> + + +<%@include file="includes/exist_navbar.jsp"%> +
      +
      +
      + +
      +

      Extension of Contract

      +
      +
      +
      + + "> + +
      +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      + + + +
      +
      + + +
      + +
      +
      + +
      + + +
      +
      +
      + +
      +
      +
      +
      + + +<%@include file="includes/footer.jsp"%> + + \ No newline at end of file diff --git a/src/main/webapp/ext_cont_res_display.jsp b/src/main/webapp/ext_cont_res_display.jsp new file mode 100644 index 0000000..32b55b7 --- /dev/null +++ b/src/main/webapp/ext_cont_res_display.jsp @@ -0,0 +1,62 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" import="com.cont_mgmt.dto.User"%> +<% + // Check if the user is logged in by checking if the user object is not null + User user = (User) session.getAttribute("user"); + if (user == null || user.getUserName().equals("")) { + // If not logged in, redirect to logout.jsp + response.sendRedirect("logout.jsp"); + return; // Stop further execution of the page + } +%> + + + + + +Contract Management System + + +<%@include file="includes/header.jsp"%> + + +
      +
      +

      Contract Management System

      + <% + String extContNum = (String) request.getAttribute("extContNum"); + String extContStartDate = (String) request.getAttribute("extContStartDate"); + String extContEndDate = (String) request.getAttribute("extContEndDate"); + String errorMessage = (String) request.getAttribute("errorMessage"); + Double extContAmt = (Double) request.getAttribute("extContAmt"); + %> + <% if (errorMessage != null) { %> +
      + Failure +
      +

      Failed To Extend The Contract

      +

      <%= errorMessage %>

      + <% } else { %> +
      + Success +
      +

      Contract Extended Successfully

      +

      + Contract Number: + <%= extContNum %>
      Extension Start Date: + <%= extContStartDate %>
      Extension End Date: + <%= extContEndDate %>
      Extension Work Order Amount: + ₹ <%= String.format("%,.2f", extContAmt) %> +

      + <% } %> + +
      +
      + <%@include file="includes/footer.jsp"%> + + + \ No newline at end of file diff --git a/src/main/webapp/flatpickr-4.6.13/css/flatpickr.min.css b/src/main/webapp/flatpickr-4.6.13/css/flatpickr.min.css new file mode 100644 index 0000000..589203c --- /dev/null +++ b/src/main/webapp/flatpickr-4.6.13/css/flatpickr.min.css @@ -0,0 +1,793 @@ +.flatpickr-calendar { + background: transparent; + opacity: 0; + display: none; + text-align: center; + visibility: hidden; + padding: 0; + -webkit-animation: none; + animation: none; + direction: ltr; + border: 0; + font-size: 14px; + line-height: 24px; + border-radius: 5px; + position: absolute; + width: 307.875px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -ms-touch-action: manipulation; + touch-action: manipulation; + background: #fff; + -webkit-box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, + 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0, 0, 0, 0.08); + box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, + 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0, 0, 0, 0.08); +} +.flatpickr-calendar.open, +.flatpickr-calendar.inline { + opacity: 1; + max-height: 640px; + visibility: visible; +} +.flatpickr-calendar.open { + display: inline-block; + z-index: 99999; +} +.flatpickr-calendar.animate.open { + -webkit-animation: fpFadeInDown 300ms cubic-bezier(0.23, 1, 0.32, 1); + animation: fpFadeInDown 300ms cubic-bezier(0.23, 1, 0.32, 1); +} +.flatpickr-calendar.inline { + display: block; + position: relative; + top: 2px; +} +.flatpickr-calendar.static { + position: absolute; + top: calc(100% + 2px); +} +.flatpickr-calendar.static.open { + z-index: 999; + display: block; +} +.flatpickr-calendar.multiMonth + .flatpickr-days + .dayContainer:nth-child(n + 1) + .flatpickr-day.inRange:nth-child(7n + 7) { + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.flatpickr-calendar.multiMonth + .flatpickr-days + .dayContainer:nth-child(n + 2) + .flatpickr-day.inRange:nth-child(7n + 1) { + -webkit-box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; + box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; +} +.flatpickr-calendar .hasWeeks .dayContainer, +.flatpickr-calendar .hasTime .dayContainer { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.flatpickr-calendar .hasWeeks .dayContainer { + border-left: 0; +} +.flatpickr-calendar.hasTime .flatpickr-time { + height: 40px; + border-top: 1px solid #e6e6e6; +} +.flatpickr-calendar.noCalendar.hasTime .flatpickr-time { + height: auto; +} +.flatpickr-calendar:before, +.flatpickr-calendar:after { + position: absolute; + display: block; + pointer-events: none; + border: solid transparent; + content: ""; + height: 0; + width: 0; + left: 22px; +} +.flatpickr-calendar.rightMost:before, +.flatpickr-calendar.arrowRight:before, +.flatpickr-calendar.rightMost:after, +.flatpickr-calendar.arrowRight:after { + left: auto; + right: 22px; +} +.flatpickr-calendar.arrowCenter:before, +.flatpickr-calendar.arrowCenter:after { + left: 50%; + right: 50%; +} +.flatpickr-calendar:before { + border-width: 5px; + margin: 0 -5px; +} +.flatpickr-calendar:after { + border-width: 4px; + margin: 0 -4px; +} +.flatpickr-calendar.arrowTop:before, +.flatpickr-calendar.arrowTop:after { + bottom: 100%; +} +.flatpickr-calendar.arrowTop:before { + border-bottom-color: #e6e6e6; +} +.flatpickr-calendar.arrowTop:after { + border-bottom-color: #fff; +} +.flatpickr-calendar.arrowBottom:before, +.flatpickr-calendar.arrowBottom:after { + top: 100%; +} +.flatpickr-calendar.arrowBottom:before { + border-top-color: #e6e6e6; +} +.flatpickr-calendar.arrowBottom:after { + border-top-color: #fff; +} +.flatpickr-calendar:focus { + outline: 0; +} +.flatpickr-wrapper { + position: relative; + display: inline-block; +} +.flatpickr-months { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} +.flatpickr-months .flatpickr-month { + background: transparent; + color: rgba(0, 0, 0, 0.9); + fill: rgba(0, 0, 0, 0.9); + height: 34px; + line-height: 1; + text-align: center; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: hidden; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +.flatpickr-months .flatpickr-prev-month, +.flatpickr-months .flatpickr-next-month { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-decoration: none; + cursor: pointer; + position: absolute; + top: 0; + height: 34px; + padding: 10px; + z-index: 3; + color: rgba(0, 0, 0, 0.9); + fill: rgba(0, 0, 0, 0.9); +} +.flatpickr-months .flatpickr-prev-month.flatpickr-disabled, +.flatpickr-months .flatpickr-next-month.flatpickr-disabled { + display: none; +} +.flatpickr-months .flatpickr-prev-month i, +.flatpickr-months .flatpickr-next-month i { + position: relative; +} +.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month, +.flatpickr-months .flatpickr-next-month.flatpickr-prev-month { + /* + /*rtl:begin:ignore*/ + left: 0; /* + /*rtl:end:ignore*/ +} /* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month.flatpickr-next-month, +.flatpickr-months .flatpickr-next-month.flatpickr-next-month { + /* + /*rtl:begin:ignore*/ + right: 0; /* + /*rtl:end:ignore*/ +} /* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month:hover, +.flatpickr-months .flatpickr-next-month:hover { + color: #959ea9; +} +.flatpickr-months .flatpickr-prev-month:hover svg, +.flatpickr-months .flatpickr-next-month:hover svg { + fill: #f64747; +} +.flatpickr-months .flatpickr-prev-month svg, +.flatpickr-months .flatpickr-next-month svg { + width: 14px; + height: 14px; +} +.flatpickr-months .flatpickr-prev-month svg path, +.flatpickr-months .flatpickr-next-month svg path { + -webkit-transition: fill 0.1s; + transition: fill 0.1s; + fill: inherit; +} +.numInputWrapper { + position: relative; + height: auto; +} +.numInputWrapper input, +.numInputWrapper span { + display: inline-block; +} +.numInputWrapper input { + width: 100%; +} +.numInputWrapper input::-ms-clear { + display: none; +} +.numInputWrapper input::-webkit-outer-spin-button, +.numInputWrapper input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; +} +.numInputWrapper span { + position: absolute; + right: 0; + width: 14px; + padding: 0 4px 0 2px; + height: 50%; + line-height: 50%; + opacity: 0; + cursor: pointer; + border: 1px solid rgba(57, 57, 57, 0.15); + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.numInputWrapper span:hover { + background: rgba(0, 0, 0, 0.1); +} +.numInputWrapper span:active { + background: rgba(0, 0, 0, 0.2); +} +.numInputWrapper span:after { + display: block; + content: ""; + position: absolute; +} +.numInputWrapper span.arrowUp { + top: 0; + border-bottom: 0; +} +.numInputWrapper span.arrowUp:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-bottom: 4px solid rgba(57, 57, 57, 0.6); + top: 26%; +} +.numInputWrapper span.arrowDown { + top: 50%; +} +.numInputWrapper span.arrowDown:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid rgba(57, 57, 57, 0.6); + top: 40%; +} +.numInputWrapper span svg { + width: inherit; + height: auto; +} +.numInputWrapper span svg path { + fill: rgba(0, 0, 0, 0.5); +} +.numInputWrapper:hover { + background: rgba(0, 0, 0, 0.05); +} +.numInputWrapper:hover span { + opacity: 1; +} +.flatpickr-current-month { + font-size: 135%; + line-height: inherit; + font-weight: 300; + color: inherit; + position: absolute; + width: 75%; + left: 12.5%; + padding: 7.48px 0 0 0; + line-height: 1; + height: 34px; + display: inline-block; + text-align: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.flatpickr-current-month span.cur-month { + font-family: inherit; + font-weight: 700; + color: inherit; + display: inline-block; + margin-left: 0.5ch; + padding: 0; +} +.flatpickr-current-month span.cur-month:hover { + background: rgba(0, 0, 0, 0.05); +} +.flatpickr-current-month .numInputWrapper { + width: 6ch; + width: 7ch\0; + display: inline-block; +} +.flatpickr-current-month .numInputWrapper span.arrowUp:after { + border-bottom-color: rgba(0, 0, 0, 0.9); +} +.flatpickr-current-month .numInputWrapper span.arrowDown:after { + border-top-color: rgba(0, 0, 0, 0.9); +} +.flatpickr-current-month input.cur-year { + background: transparent; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + cursor: text; + padding: 0 0 0 0.5ch; + margin: 0; + display: inline-block; + font-size: inherit; + font-family: inherit; + font-weight: 300; + line-height: inherit; + height: auto; + border: 0; + border-radius: 0; + vertical-align: initial; + -webkit-appearance: textfield; + -moz-appearance: textfield; + appearance: textfield; +} +.flatpickr-current-month input.cur-year:focus { + outline: 0; +} +.flatpickr-current-month input.cur-year[disabled], +.flatpickr-current-month input.cur-year[disabled]:hover { + font-size: 100%; + color: rgba(0, 0, 0, 0.5); + background: transparent; + pointer-events: none; +} +.flatpickr-current-month .flatpickr-monthDropdown-months { + appearance: menulist; + background: transparent; + border: none; + border-radius: 0; + box-sizing: border-box; + color: inherit; + cursor: pointer; + font-size: inherit; + font-family: inherit; + font-weight: 300; + height: auto; + line-height: inherit; + margin: -1px 0 0 0; + outline: none; + padding: 0 0 0 0.5ch; + position: relative; + vertical-align: initial; + -webkit-box-sizing: border-box; + -webkit-appearance: menulist; + -moz-appearance: menulist; + width: auto; +} +.flatpickr-current-month .flatpickr-monthDropdown-months:focus, +.flatpickr-current-month .flatpickr-monthDropdown-months:active { + outline: none; +} +.flatpickr-current-month .flatpickr-monthDropdown-months:hover { + background: rgba(0, 0, 0, 0.05); +} +.flatpickr-current-month + .flatpickr-monthDropdown-months + .flatpickr-monthDropdown-month { + background-color: transparent; + outline: none; + padding: 0; +} +.flatpickr-weekdays { + background: transparent; + text-align: center; + overflow: hidden; + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 28px; +} +.flatpickr-weekdays .flatpickr-weekdaycontainer { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +span.flatpickr-weekday { + cursor: default; + font-size: 90%; + background: transparent; + color: rgba(0, 0, 0, 0.54); + line-height: 1; + margin: 0; + text-align: center; + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + font-weight: bolder; +} +.dayContainer, +.flatpickr-weeks { + padding: 1px 0 0 0; +} +.flatpickr-days { + position: relative; + overflow: hidden; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; + width: 307.875px; +} +.flatpickr-days:focus { + outline: 0; +} +.dayContainer { + padding: 0; + outline: 0; + text-align: left; + width: 307.875px; + min-width: 307.875px; + max-width: 307.875px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + display: -ms-flexbox; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-wrap: wrap; + -ms-flex-pack: justify; + -webkit-justify-content: space-around; + justify-content: space-around; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; +} +.dayContainer + .dayContainer { + -webkit-box-shadow: -1px 0 0 #e6e6e6; + box-shadow: -1px 0 0 #e6e6e6; +} +.flatpickr-day { + background: none; + border: 1px solid transparent; + border-radius: 150px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: #393939; + cursor: pointer; + font-weight: 400; + width: 14.2857143%; + -webkit-flex-basis: 14.2857143%; + -ms-flex-preferred-size: 14.2857143%; + flex-basis: 14.2857143%; + max-width: 39px; + height: 39px; + line-height: 39px; + margin: 0; + display: inline-block; + position: relative; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; +} +.flatpickr-day.inRange, +.flatpickr-day.prevMonthDay.inRange, +.flatpickr-day.nextMonthDay.inRange, +.flatpickr-day.today.inRange, +.flatpickr-day.prevMonthDay.today.inRange, +.flatpickr-day.nextMonthDay.today.inRange, +.flatpickr-day:hover, +.flatpickr-day.prevMonthDay:hover, +.flatpickr-day.nextMonthDay:hover, +.flatpickr-day:focus, +.flatpickr-day.prevMonthDay:focus, +.flatpickr-day.nextMonthDay:focus { + cursor: pointer; + outline: 0; + background: #e6e6e6; + border-color: #e6e6e6; +} +.flatpickr-day.today { + border-color: #959ea9; +} +.flatpickr-day.today:hover, +.flatpickr-day.today:focus { + border-color: #959ea9; + background: #959ea9; + color: #fff; +} +.flatpickr-day.selected, +.flatpickr-day.startRange, +.flatpickr-day.endRange, +.flatpickr-day.selected.inRange, +.flatpickr-day.startRange.inRange, +.flatpickr-day.endRange.inRange, +.flatpickr-day.selected:focus, +.flatpickr-day.startRange:focus, +.flatpickr-day.endRange:focus, +.flatpickr-day.selected:hover, +.flatpickr-day.startRange:hover, +.flatpickr-day.endRange:hover, +.flatpickr-day.selected.prevMonthDay, +.flatpickr-day.startRange.prevMonthDay, +.flatpickr-day.endRange.prevMonthDay, +.flatpickr-day.selected.nextMonthDay, +.flatpickr-day.startRange.nextMonthDay, +.flatpickr-day.endRange.nextMonthDay { + background: #569ff7; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + border-color: #569ff7; +} +.flatpickr-day.selected.startRange, +.flatpickr-day.startRange.startRange, +.flatpickr-day.endRange.startRange { + border-radius: 50px 0 0 50px; +} +.flatpickr-day.selected.endRange, +.flatpickr-day.startRange.endRange, +.flatpickr-day.endRange.endRange { + border-radius: 0 50px 50px 0; +} +.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n + 1)), +.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n + 1)), +.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n + 1)) { + -webkit-box-shadow: -10px 0 0 #569ff7; + box-shadow: -10px 0 0 #569ff7; +} +.flatpickr-day.selected.startRange.endRange, +.flatpickr-day.startRange.startRange.endRange, +.flatpickr-day.endRange.startRange.endRange { + border-radius: 50px; +} +.flatpickr-day.inRange { + border-radius: 0; + -webkit-box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; + box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; +} +.flatpickr-day.flatpickr-disabled, +.flatpickr-day.flatpickr-disabled:hover, +.flatpickr-day.prevMonthDay, +.flatpickr-day.nextMonthDay, +.flatpickr-day.notAllowed, +.flatpickr-day.notAllowed.prevMonthDay, +.flatpickr-day.notAllowed.nextMonthDay { + color: rgba(57, 57, 57, 0.3); + background: transparent; + border-color: transparent; + cursor: default; +} +.flatpickr-day.flatpickr-disabled, +.flatpickr-day.flatpickr-disabled:hover { + cursor: not-allowed; + color: rgba(57, 57, 57, 0.1); +} +.flatpickr-day.week.selected { + border-radius: 0; + -webkit-box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7; + box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7; +} +.flatpickr-day.hidden { + visibility: hidden; +} +.rangeMode .flatpickr-day { + margin-top: 1px; +} +.flatpickr-weekwrapper { + float: left; +} +.flatpickr-weekwrapper .flatpickr-weeks { + padding: 0 12px; + -webkit-box-shadow: 1px 0 0 #e6e6e6; + box-shadow: 1px 0 0 #e6e6e6; +} +.flatpickr-weekwrapper .flatpickr-weekday { + float: none; + width: 100%; + line-height: 28px; +} +.flatpickr-weekwrapper span.flatpickr-day, +.flatpickr-weekwrapper span.flatpickr-day:hover { + display: block; + width: 100%; + max-width: none; + color: rgba(57, 57, 57, 0.3); + background: transparent; + cursor: default; + border: none; +} +.flatpickr-innerContainer { + display: block; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; +} +.flatpickr-rContainer { + display: inline-block; + padding: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.flatpickr-time { + text-align: center; + outline: 0; + display: block; + height: 0; + line-height: 40px; + max-height: 40px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} +.flatpickr-time:after { + content: ""; + display: table; + clear: both; +} +.flatpickr-time .numInputWrapper { + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + width: 40%; + height: 40px; + float: left; +} +.flatpickr-time .numInputWrapper span.arrowUp:after { + border-bottom-color: #393939; +} +.flatpickr-time .numInputWrapper span.arrowDown:after { + border-top-color: #393939; +} +.flatpickr-time.hasSeconds .numInputWrapper { + width: 26%; +} +.flatpickr-time.time24hr .numInputWrapper { + width: 49%; +} +.flatpickr-time input { + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + border: 0; + border-radius: 0; + text-align: center; + margin: 0; + padding: 0; + height: inherit; + line-height: inherit; + color: #393939; + font-size: 14px; + position: relative; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: textfield; + -moz-appearance: textfield; + appearance: textfield; +} +.flatpickr-time input.flatpickr-hour { + font-weight: bold; +} +.flatpickr-time input.flatpickr-minute, +.flatpickr-time input.flatpickr-second { + font-weight: 400; +} +.flatpickr-time input:focus { + outline: 0; + border: 0; +} +.flatpickr-time .flatpickr-time-separator, +.flatpickr-time .flatpickr-am-pm { + height: inherit; + float: left; + line-height: inherit; + color: #393939; + font-weight: bold; + width: 2%; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-align-self: center; + -ms-flex-item-align: center; + align-self: center; +} +.flatpickr-time .flatpickr-am-pm { + outline: 0; + width: 18%; + cursor: pointer; + text-align: center; + font-weight: 400; +} +.flatpickr-time input:hover, +.flatpickr-time .flatpickr-am-pm:hover, +.flatpickr-time input:focus, +.flatpickr-time .flatpickr-am-pm:focus { + background: #eee; +} +.flatpickr-input[readonly] { + cursor: pointer; +} +@-webkit-keyframes fpFadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fpFadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} diff --git a/src/main/webapp/flatpickr-4.6.13/js/flatpickr.js b/src/main/webapp/flatpickr-4.6.13/js/flatpickr.js new file mode 100644 index 0000000..30302ed --- /dev/null +++ b/src/main/webapp/flatpickr-4.6.13/js/flatpickr.js @@ -0,0 +1,1379 @@ +/* flatpickr v4.6.13,, @license MIT */ ! function(e, n) { + "object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define && define.amd ? define(n) : (e = "undefined" != typeof globalThis ? globalThis : e || self).flatpickr = n() +}(this, (function() { + "use strict"; + var e = function() { + return (e = Object.assign || function(e) { + for (var n, t = 1, a = arguments.length; t < a; t++) + for (var i in n = arguments[t]) Object.prototype.hasOwnProperty.call(n, i) && (e[i] = n[i]); + return e + }).apply(this, arguments) + }; + + function n() { + for (var e = 0, n = 0, t = arguments.length; n < t; n++) e += arguments[n].length; + var a = Array(e), + i = 0; + for (n = 0; n < t; n++) + for (var o = arguments[n], r = 0, l = o.length; r < l; r++, i++) a[i] = o[r]; + return a + } + var t = ["onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange", "onPreCalendarPosition"], + a = { + _disable: [], + allowInput: !1, + allowInvalidPreload: !1, + altFormat: "F j, Y", + altInput: !1, + altInputClass: "form-control input", + animate: "object" == typeof window && -1 === window.navigator.userAgent.indexOf("MSIE"), + ariaDateFormat: "F j, Y", + autoFillDefaultTime: !0, + clickOpens: !0, + closeOnSelect: !0, + conjunction: ", ", + dateFormat: "Y-m-d", + defaultHour: 12, + defaultMinute: 0, + defaultSeconds: 0, + disable: [], + disableMobile: !1, + enableSeconds: !1, + enableTime: !1, + errorHandler: function(e) { + return "undefined" != typeof console && console.warn(e) + }, + getWeek: function(e) { + var n = new Date(e.getTime()); + n.setHours(0, 0, 0, 0), n.setDate(n.getDate() + 3 - (n.getDay() + 6) % 7); + var t = new Date(n.getFullYear(), 0, 4); + return 1 + Math.round(((n.getTime() - t.getTime()) / 864e5 - 3 + (t.getDay() + 6) % 7) / 7) + }, + hourIncrement: 1, + ignoredFocusElements: [], + inline: !1, + locale: "default", + minuteIncrement: 5, + mode: "single", + monthSelectorType: "dropdown", + nextArrow: "", + noCalendar: !1, + now: new Date, + onChange: [], + onClose: [], + onDayCreate: [], + onDestroy: [], + onKeyDown: [], + onMonthChange: [], + onOpen: [], + onParseConfig: [], + onReady: [], + onValueUpdate: [], + onYearChange: [], + onPreCalendarPosition: [], + plugins: [], + position: "auto", + positionElement: void 0, + prevArrow: "", + shorthandCurrentMonth: !1, + showMonths: 1, + static: !1, + time_24hr: !1, + weekNumbers: !1, + wrap: !1 + }, + i = { + weekdays: { + shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + }, + months: { + shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] + }, + daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + firstDayOfWeek: 0, + ordinal: function(e) { + var n = e % 100; + if (n > 3 && n < 21) return "th"; + switch (n % 10) { + case 1: + return "st"; + case 2: + return "nd"; + case 3: + return "rd"; + default: + return "th" + } + }, + rangeSeparator: " to ", + weekAbbreviation: "Wk", + scrollTitle: "Scroll to increment", + toggleTitle: "Click to toggle", + amPM: ["AM", "PM"], + yearAriaLabel: "Year", + monthAriaLabel: "Month", + hourAriaLabel: "Hour", + minuteAriaLabel: "Minute", + time_24hr: !1 + }, + o = function(e, n) { + return void 0 === n && (n = 2), ("000" + e).slice(-1 * n) + }, + r = function(e) { + return !0 === e ? 1 : 0 + }; + + function l(e, n) { + var t; + return function() { + var a = this, + i = arguments; + clearTimeout(t), t = setTimeout((function() { + return e.apply(a, i) + }), n) + } + } + var c = function(e) { + return e instanceof Array ? e : [e] + }; + + function s(e, n, t) { + if (!0 === t) return e.classList.add(n); + e.classList.remove(n) + } + + function d(e, n, t) { + var a = window.document.createElement(e); + return n = n || "", t = t || "", a.className = n, void 0 !== t && (a.textContent = t), a + } + + function u(e) { + for (; e.firstChild;) e.removeChild(e.firstChild) + } + + function f(e, n) { + return n(e) ? e : e.parentNode ? f(e.parentNode, n) : void 0 + } + + function m(e, n) { + var t = d("div", "numInputWrapper"), + a = d("input", "numInput " + e), + i = d("span", "arrowUp"), + o = d("span", "arrowDown"); + if (-1 === navigator.userAgent.indexOf("MSIE 9.0") ? a.type = "number" : (a.type = "text", a.pattern = "\\d*"), void 0 !== n) + for (var r in n) a.setAttribute(r, n[r]); + return t.appendChild(a), t.appendChild(i), t.appendChild(o), t + } + + function g(e) { + try { + return "function" == typeof e.composedPath ? e.composedPath()[0] : e.target + } catch (n) { + return e.target + } + } + var p = function() {}, + h = function(e, n, t) { + return t.months[n ? "shorthand" : "longhand"][e] + }, + v = { + D: p, + F: function(e, n, t) { + e.setMonth(t.months.longhand.indexOf(n)) + }, + G: function(e, n) { + e.setHours((e.getHours() >= 12 ? 12 : 0) + parseFloat(n)) + }, + H: function(e, n) { + e.setHours(parseFloat(n)) + }, + J: function(e, n) { + e.setDate(parseFloat(n)) + }, + K: function(e, n, t) { + e.setHours(e.getHours() % 12 + 12 * r(new RegExp(t.amPM[1], "i").test(n))) + }, + M: function(e, n, t) { + e.setMonth(t.months.shorthand.indexOf(n)) + }, + S: function(e, n) { + e.setSeconds(parseFloat(n)) + }, + U: function(e, n) { + return new Date(1e3 * parseFloat(n)) + }, + W: function(e, n, t) { + var a = parseInt(n), + i = new Date(e.getFullYear(), 0, 2 + 7 * (a - 1), 0, 0, 0, 0); + return i.setDate(i.getDate() - i.getDay() + t.firstDayOfWeek), i + }, + Y: function(e, n) { + e.setFullYear(parseFloat(n)) + }, + Z: function(e, n) { + return new Date(n) + }, + d: function(e, n) { + e.setDate(parseFloat(n)) + }, + h: function(e, n) { + e.setHours((e.getHours() >= 12 ? 12 : 0) + parseFloat(n)) + }, + i: function(e, n) { + e.setMinutes(parseFloat(n)) + }, + j: function(e, n) { + e.setDate(parseFloat(n)) + }, + l: p, + m: function(e, n) { + e.setMonth(parseFloat(n) - 1) + }, + n: function(e, n) { + e.setMonth(parseFloat(n) - 1) + }, + s: function(e, n) { + e.setSeconds(parseFloat(n)) + }, + u: function(e, n) { + return new Date(parseFloat(n)) + }, + w: p, + y: function(e, n) { + e.setFullYear(2e3 + parseFloat(n)) + } + }, + D = { + D: "", + F: "", + G: "(\\d\\d|\\d)", + H: "(\\d\\d|\\d)", + J: "(\\d\\d|\\d)\\w+", + K: "", + M: "", + S: "(\\d\\d|\\d)", + U: "(.+)", + W: "(\\d\\d|\\d)", + Y: "(\\d{4})", + Z: "(.+)", + d: "(\\d\\d|\\d)", + h: "(\\d\\d|\\d)", + i: "(\\d\\d|\\d)", + j: "(\\d\\d|\\d)", + l: "", + m: "(\\d\\d|\\d)", + n: "(\\d\\d|\\d)", + s: "(\\d\\d|\\d)", + u: "(.+)", + w: "(\\d\\d|\\d)", + y: "(\\d{2})" + }, + w = { + Z: function(e) { + return e.toISOString() + }, + D: function(e, n, t) { + return n.weekdays.shorthand[w.w(e, n, t)] + }, + F: function(e, n, t) { + return h(w.n(e, n, t) - 1, !1, n) + }, + G: function(e, n, t) { + return o(w.h(e, n, t)) + }, + H: function(e) { + return o(e.getHours()) + }, + J: function(e, n) { + return void 0 !== n.ordinal ? e.getDate() + n.ordinal(e.getDate()) : e.getDate() + }, + K: function(e, n) { + return n.amPM[r(e.getHours() > 11)] + }, + M: function(e, n) { + return h(e.getMonth(), !0, n) + }, + S: function(e) { + return o(e.getSeconds()) + }, + U: function(e) { + return e.getTime() / 1e3 + }, + W: function(e, n, t) { + return t.getWeek(e) + }, + Y: function(e) { + return o(e.getFullYear(), 4) + }, + d: function(e) { + return o(e.getDate()) + }, + h: function(e) { + return e.getHours() % 12 ? e.getHours() % 12 : 12 + }, + i: function(e) { + return o(e.getMinutes()) + }, + j: function(e) { + return e.getDate() + }, + l: function(e, n) { + return n.weekdays.longhand[e.getDay()] + }, + m: function(e) { + return o(e.getMonth() + 1) + }, + n: function(e) { + return e.getMonth() + 1 + }, + s: function(e) { + return e.getSeconds() + }, + u: function(e) { + return e.getTime() + }, + w: function(e) { + return e.getDay() + }, + y: function(e) { + return String(e.getFullYear()).substring(2) + } + }, + b = function(e) { + var n = e.config, + t = void 0 === n ? a : n, + o = e.l10n, + r = void 0 === o ? i : o, + l = e.isMobile, + c = void 0 !== l && l; + return function(e, n, a) { + var i = a || r; + return void 0 === t.formatDate || c ? n.split("").map((function(n, a, o) { + return w[n] && "\\" !== o[a - 1] ? w[n](e, i, t) : "\\" !== n ? n : "" + })).join("") : t.formatDate(e, n, i) + } + }, + C = function(e) { + var n = e.config, + t = void 0 === n ? a : n, + o = e.l10n, + r = void 0 === o ? i : o; + return function(e, n, i, o) { + if (0 === e || e) { + var l, c = o || r, + s = e; + if (e instanceof Date) l = new Date(e.getTime()); + else if ("string" != typeof e && void 0 !== e.toFixed) l = new Date(e); + else if ("string" == typeof e) { + var d = n || (t || a).dateFormat, + u = String(e).trim(); + if ("today" === u) l = new Date, i = !0; + else if (t && t.parseDate) l = t.parseDate(e, d); + else if (/Z$/.test(u) || /GMT$/.test(u)) l = new Date(e); + else { + for (var f = void 0, m = [], g = 0, p = 0, h = ""; g < d.length; g++) { + var w = d[g], + b = "\\" === w, + C = "\\" === d[g - 1] || b; + if (D[w] && !C) { + h += D[w]; + var M = new RegExp(h).exec(e); + M && (f = !0) && m["Y" !== w ? "push" : "unshift"]({ + fn: v[w], + val: M[++p] + }) + } else b || (h += ".") + } + l = t && t.noCalendar ? new Date((new Date).setHours(0, 0, 0, 0)) : new Date((new Date).getFullYear(), 0, 1, 0, 0, 0, 0), m.forEach((function(e) { + var n = e.fn, + t = e.val; + return l = n(l, t, c) || l + })), l = f ? l : void 0 + } + } + if (l instanceof Date && !isNaN(l.getTime())) return !0 === i && l.setHours(0, 0, 0, 0), l; + t.errorHandler(new Error("Invalid date provided: " + s)) + } + } + }; + + function M(e, n, t) { + return void 0 === t && (t = !0), !1 !== t ? new Date(e.getTime()).setHours(0, 0, 0, 0) - new Date(n.getTime()).setHours(0, 0, 0, 0) : e.getTime() - n.getTime() + } + var y = function(e, n, t) { + return 3600 * e + 60 * n + t + }, + x = 864e5; + + function E(e) { + var n = e.defaultHour, + t = e.defaultMinute, + a = e.defaultSeconds; + if (void 0 !== e.minDate) { + var i = e.minDate.getHours(), + o = e.minDate.getMinutes(), + r = e.minDate.getSeconds(); + n < i && (n = i), n === i && t < o && (t = o), n === i && t === o && a < r && (a = e.minDate.getSeconds()) + } + if (void 0 !== e.maxDate) { + var l = e.maxDate.getHours(), + c = e.maxDate.getMinutes(); + (n = Math.min(n, l)) === l && (t = Math.min(c, t)), n === l && t === c && (a = e.maxDate.getSeconds()) + } + return { + hours: n, + minutes: t, + seconds: a + } + } + "function" != typeof Object.assign && (Object.assign = function(e) { + for (var n = [], t = 1; t < arguments.length; t++) n[t - 1] = arguments[t]; + if (!e) throw TypeError("Cannot convert undefined or null to object"); + for (var a = function(n) { + n && Object.keys(n).forEach((function(t) { + return e[t] = n[t] + })) + }, i = 0, o = n; i < o.length; i++) { + var r = o[i]; + a(r) + } + return e + }); + + function k(p, v) { + var w = { + config: e(e({}, a), I.defaultConfig), + l10n: i + }; + + function k() { + var e; + return (null === (e = w.calendarContainer) || void 0 === e ? void 0 : e.getRootNode()).activeElement || document.activeElement + } + + function T(e) { + return e.bind(w) + } + + function S() { + var e = w.config; + !1 === e.weekNumbers && 1 === e.showMonths || !0 !== e.noCalendar && window.requestAnimationFrame((function() { + if (void 0 !== w.calendarContainer && (w.calendarContainer.style.visibility = "hidden", w.calendarContainer.style.display = "block"), void 0 !== w.daysContainer) { + var n = (w.days.offsetWidth + 1) * e.showMonths; + w.daysContainer.style.width = n + "px", w.calendarContainer.style.width = n + (void 0 !== w.weekWrapper ? w.weekWrapper.offsetWidth : 0) + "px", w.calendarContainer.style.removeProperty("visibility"), w.calendarContainer.style.removeProperty("display") + } + })) + } + + function _(e) { + if (0 === w.selectedDates.length) { + var n = void 0 === w.config.minDate || M(new Date, w.config.minDate) >= 0 ? new Date : new Date(w.config.minDate.getTime()), + t = E(w.config); + n.setHours(t.hours, t.minutes, t.seconds, n.getMilliseconds()), w.selectedDates = [n], w.latestSelectedDateObj = n + } + void 0 !== e && "blur" !== e.type && function(e) { + e.preventDefault(); + var n = "keydown" === e.type, + t = g(e), + a = t; + void 0 !== w.amPM && t === w.amPM && (w.amPM.textContent = w.l10n.amPM[r(w.amPM.textContent === w.l10n.amPM[0])]); + var i = parseFloat(a.getAttribute("min")), + l = parseFloat(a.getAttribute("max")), + c = parseFloat(a.getAttribute("step")), + s = parseInt(a.value, 10), + d = e.delta || (n ? 38 === e.which ? 1 : -1 : 0), + u = s + c * d; + if (void 0 !== a.value && 2 === a.value.length) { + var f = a === w.hourElement, + m = a === w.minuteElement; + u < i ? (u = l + u + r(!f) + (r(f) && r(!w.amPM)), m && L(void 0, -1, w.hourElement)) : u > l && (u = a === w.hourElement ? u - l - r(!w.amPM) : i, m && L(void 0, 1, w.hourElement)), w.amPM && f && (1 === c ? u + s === 23 : Math.abs(u - s) > c) && (w.amPM.textContent = w.l10n.amPM[r(w.amPM.textContent === w.l10n.amPM[0])]), a.value = o(u) + } + }(e); + var a = w._input.value; + O(), ye(), w._input.value !== a && w._debouncedChange() + } + + function O() { + if (void 0 !== w.hourElement && void 0 !== w.minuteElement) { + var e, n, t = (parseInt(w.hourElement.value.slice(-2), 10) || 0) % 24, + a = (parseInt(w.minuteElement.value, 10) || 0) % 60, + i = void 0 !== w.secondElement ? (parseInt(w.secondElement.value, 10) || 0) % 60 : 0; + void 0 !== w.amPM && (e = t, n = w.amPM.textContent, t = e % 12 + 12 * r(n === w.l10n.amPM[1])); + var o = void 0 !== w.config.minTime || w.config.minDate && w.minDateHasTime && w.latestSelectedDateObj && 0 === M(w.latestSelectedDateObj, w.config.minDate, !0), + l = void 0 !== w.config.maxTime || w.config.maxDate && w.maxDateHasTime && w.latestSelectedDateObj && 0 === M(w.latestSelectedDateObj, w.config.maxDate, !0); + if (void 0 !== w.config.maxTime && void 0 !== w.config.minTime && w.config.minTime > w.config.maxTime) { + var c = y(w.config.minTime.getHours(), w.config.minTime.getMinutes(), w.config.minTime.getSeconds()), + s = y(w.config.maxTime.getHours(), w.config.maxTime.getMinutes(), w.config.maxTime.getSeconds()), + d = y(t, a, i); + if (d > s && d < c) { + var u = function(e) { + var n = Math.floor(e / 3600), + t = (e - 3600 * n) / 60; + return [n, t, e - 3600 * n - 60 * t] + }(c); + t = u[0], a = u[1], i = u[2] + } + } else { + if (l) { + var f = void 0 !== w.config.maxTime ? w.config.maxTime : w.config.maxDate; + (t = Math.min(t, f.getHours())) === f.getHours() && (a = Math.min(a, f.getMinutes())), a === f.getMinutes() && (i = Math.min(i, f.getSeconds())) + } + if (o) { + var m = void 0 !== w.config.minTime ? w.config.minTime : w.config.minDate; + (t = Math.max(t, m.getHours())) === m.getHours() && a < m.getMinutes() && (a = m.getMinutes()), a === m.getMinutes() && (i = Math.max(i, m.getSeconds())) + } + } + A(t, a, i) + } + } + + function F(e) { + var n = e || w.latestSelectedDateObj; + n && n instanceof Date && A(n.getHours(), n.getMinutes(), n.getSeconds()) + } + + function A(e, n, t) { + void 0 !== w.latestSelectedDateObj && w.latestSelectedDateObj.setHours(e % 24, n, t || 0, 0), w.hourElement && w.minuteElement && !w.isMobile && (w.hourElement.value = o(w.config.time_24hr ? e : (12 + e) % 12 + 12 * r(e % 12 == 0)), w.minuteElement.value = o(n), void 0 !== w.amPM && (w.amPM.textContent = w.l10n.amPM[r(e >= 12)]), void 0 !== w.secondElement && (w.secondElement.value = o(t))) + } + + function N(e) { + var n = g(e), + t = parseInt(n.value) + (e.delta || 0); + (t / 1e3 > 1 || "Enter" === e.key && !/[^\d]/.test(t.toString())) && ee(t) + } + + function P(e, n, t, a) { + return n instanceof Array ? n.forEach((function(n) { + return P(e, n, t, a) + })) : e instanceof Array ? e.forEach((function(e) { + return P(e, n, t, a) + })) : (e.addEventListener(n, t, a), void w._handlers.push({ + remove: function() { + return e.removeEventListener(n, t, a) + } + })) + } + + function Y() { + De("onChange") + } + + function j(e, n) { + var t = void 0 !== e ? w.parseDate(e) : w.latestSelectedDateObj || (w.config.minDate && w.config.minDate > w.now ? w.config.minDate : w.config.maxDate && w.config.maxDate < w.now ? w.config.maxDate : w.now), + a = w.currentYear, + i = w.currentMonth; + try { + void 0 !== t && (w.currentYear = t.getFullYear(), w.currentMonth = t.getMonth()) + } catch (e) { + e.message = "Invalid date supplied: " + t, w.config.errorHandler(e) + } + n && w.currentYear !== a && (De("onYearChange"), q()), !n || w.currentYear === a && w.currentMonth === i || De("onMonthChange"), w.redraw() + } + + function H(e) { + var n = g(e); + ~n.className.indexOf("arrow") && L(e, n.classList.contains("arrowUp") ? 1 : -1) + } + + function L(e, n, t) { + var a = e && g(e), + i = t || a && a.parentNode && a.parentNode.firstChild, + o = we("increment"); + o.delta = n, i && i.dispatchEvent(o) + } + + function R(e, n, t, a) { + var i = ne(n, !0), + o = d("span", e, n.getDate().toString()); + return o.dateObj = n, o.$i = a, o.setAttribute("aria-label", w.formatDate(n, w.config.ariaDateFormat)), -1 === e.indexOf("hidden") && 0 === M(n, w.now) && (w.todayDateElem = o, o.classList.add("today"), o.setAttribute("aria-current", "date")), i ? (o.tabIndex = -1, be(n) && (o.classList.add("selected"), w.selectedDateElem = o, "range" === w.config.mode && (s(o, "startRange", w.selectedDates[0] && 0 === M(n, w.selectedDates[0], !0)), s(o, "endRange", w.selectedDates[1] && 0 === M(n, w.selectedDates[1], !0)), "nextMonthDay" === e && o.classList.add("inRange")))) : o.classList.add("flatpickr-disabled"), "range" === w.config.mode && function(e) { + return !("range" !== w.config.mode || w.selectedDates.length < 2) && (M(e, w.selectedDates[0]) >= 0 && M(e, w.selectedDates[1]) <= 0) + }(n) && !be(n) && o.classList.add("inRange"), w.weekNumbers && 1 === w.config.showMonths && "prevMonthDay" !== e && a % 7 == 6 && w.weekNumbers.insertAdjacentHTML("beforeend", "" + w.config.getWeek(n) + ""), De("onDayCreate", o), o + } + + function W(e) { + e.focus(), "range" === w.config.mode && oe(e) + } + + function B(e) { + for (var n = e > 0 ? 0 : w.config.showMonths - 1, t = e > 0 ? w.config.showMonths : -1, a = n; a != t; a += e) + for (var i = w.daysContainer.children[a], o = e > 0 ? 0 : i.children.length - 1, r = e > 0 ? i.children.length : -1, l = o; l != r; l += e) { + var c = i.children[l]; + if (-1 === c.className.indexOf("hidden") && ne(c.dateObj)) return c + } + } + + function J(e, n) { + var t = k(), + a = te(t || document.body), + i = void 0 !== e ? e : a ? t : void 0 !== w.selectedDateElem && te(w.selectedDateElem) ? w.selectedDateElem : void 0 !== w.todayDateElem && te(w.todayDateElem) ? w.todayDateElem : B(n > 0 ? 1 : -1); + void 0 === i ? w._input.focus() : a ? function(e, n) { + for (var t = -1 === e.className.indexOf("Month") ? e.dateObj.getMonth() : w.currentMonth, a = n > 0 ? w.config.showMonths : -1, i = n > 0 ? 1 : -1, o = t - w.currentMonth; o != a; o += i) + for (var r = w.daysContainer.children[o], l = t - w.currentMonth === o ? e.$i + n : n < 0 ? r.children.length - 1 : 0, c = r.children.length, s = l; s >= 0 && s < c && s != (n > 0 ? c : -1); s += i) { + var d = r.children[s]; + if (-1 === d.className.indexOf("hidden") && ne(d.dateObj) && Math.abs(e.$i - s) >= Math.abs(n)) return W(d) + } + w.changeMonth(i), J(B(i), 0) + }(i, n) : W(i) + } + + function K(e, n) { + for (var t = (new Date(e, n, 1).getDay() - w.l10n.firstDayOfWeek + 7) % 7, a = w.utils.getDaysInMonth((n - 1 + 12) % 12, e), i = w.utils.getDaysInMonth(n, e), o = window.document.createDocumentFragment(), r = w.config.showMonths > 1, l = r ? "prevMonthDay hidden" : "prevMonthDay", c = r ? "nextMonthDay hidden" : "nextMonthDay", s = a + 1 - t, u = 0; s <= a; s++, u++) o.appendChild(R("flatpickr-day " + l, new Date(e, n - 1, s), 0, u)); + for (s = 1; s <= i; s++, u++) o.appendChild(R("flatpickr-day", new Date(e, n, s), 0, u)); + for (var f = i + 1; f <= 42 - t && (1 === w.config.showMonths || u % 7 != 0); f++, u++) o.appendChild(R("flatpickr-day " + c, new Date(e, n + 1, f % i), 0, u)); + var m = d("div", "dayContainer"); + return m.appendChild(o), m + } + + function U() { + if (void 0 !== w.daysContainer) { + u(w.daysContainer), w.weekNumbers && u(w.weekNumbers); + for (var e = document.createDocumentFragment(), n = 0; n < w.config.showMonths; n++) { + var t = new Date(w.currentYear, w.currentMonth, 1); + t.setMonth(w.currentMonth + n), e.appendChild(K(t.getFullYear(), t.getMonth())) + } + w.daysContainer.appendChild(e), w.days = w.daysContainer.firstChild, "range" === w.config.mode && 1 === w.selectedDates.length && oe() + } + } + + function q() { + if (!(w.config.showMonths > 1 || "dropdown" !== w.config.monthSelectorType)) { + var e = function(e) { + return !(void 0 !== w.config.minDate && w.currentYear === w.config.minDate.getFullYear() && e < w.config.minDate.getMonth()) && !(void 0 !== w.config.maxDate && w.currentYear === w.config.maxDate.getFullYear() && e > w.config.maxDate.getMonth()) + }; + w.monthsDropdownContainer.tabIndex = -1, w.monthsDropdownContainer.innerHTML = ""; + for (var n = 0; n < 12; n++) + if (e(n)) { + var t = d("option", "flatpickr-monthDropdown-month"); + t.value = new Date(w.currentYear, n).getMonth().toString(), t.textContent = h(n, w.config.shorthandCurrentMonth, w.l10n), t.tabIndex = -1, w.currentMonth === n && (t.selected = !0), w.monthsDropdownContainer.appendChild(t) + } + } + } + + function $() { + var e, n = d("div", "flatpickr-month"), + t = window.document.createDocumentFragment(); + w.config.showMonths > 1 || "static" === w.config.monthSelectorType ? e = d("span", "cur-month") : (w.monthsDropdownContainer = d("select", "flatpickr-monthDropdown-months"), w.monthsDropdownContainer.setAttribute("aria-label", w.l10n.monthAriaLabel), P(w.monthsDropdownContainer, "change", (function(e) { + var n = g(e), + t = parseInt(n.value, 10); + w.changeMonth(t - w.currentMonth), De("onMonthChange") + })), q(), e = w.monthsDropdownContainer); + var a = m("cur-year", { + tabindex: "-1" + }), + i = a.getElementsByTagName("input")[0]; + i.setAttribute("aria-label", w.l10n.yearAriaLabel), w.config.minDate && i.setAttribute("min", w.config.minDate.getFullYear().toString()), w.config.maxDate && (i.setAttribute("max", w.config.maxDate.getFullYear().toString()), i.disabled = !!w.config.minDate && w.config.minDate.getFullYear() === w.config.maxDate.getFullYear()); + var o = d("div", "flatpickr-current-month"); + return o.appendChild(e), o.appendChild(a), t.appendChild(o), n.appendChild(t), { + container: n, + yearElement: i, + monthElement: e + } + } + + function V() { + u(w.monthNav), w.monthNav.appendChild(w.prevMonthNav), w.config.showMonths && (w.yearElements = [], w.monthElements = []); + for (var e = w.config.showMonths; e--;) { + var n = $(); + w.yearElements.push(n.yearElement), w.monthElements.push(n.monthElement), w.monthNav.appendChild(n.container) + } + w.monthNav.appendChild(w.nextMonthNav) + } + + function z() { + w.weekdayContainer ? u(w.weekdayContainer) : w.weekdayContainer = d("div", "flatpickr-weekdays"); + for (var e = w.config.showMonths; e--;) { + var n = d("div", "flatpickr-weekdaycontainer"); + w.weekdayContainer.appendChild(n) + } + return G(), w.weekdayContainer + } + + function G() { + if (w.weekdayContainer) { + var e = w.l10n.firstDayOfWeek, + t = n(w.l10n.weekdays.shorthand); + e > 0 && e < t.length && (t = n(t.splice(e, t.length), t.splice(0, e))); + for (var a = w.config.showMonths; a--;) w.weekdayContainer.children[a].innerHTML = "\n \n " + t.join("") + "\n \n " + } + } + + function Z(e, n) { + void 0 === n && (n = !0); + var t = n ? e : e - w.currentMonth; + t < 0 && !0 === w._hidePrevMonthArrow || t > 0 && !0 === w._hideNextMonthArrow || (w.currentMonth += t, (w.currentMonth < 0 || w.currentMonth > 11) && (w.currentYear += w.currentMonth > 11 ? 1 : -1, w.currentMonth = (w.currentMonth + 12) % 12, De("onYearChange"), q()), U(), De("onMonthChange"), Ce()) + } + + function Q(e) { + return w.calendarContainer.contains(e) + } + + function X(e) { + if (w.isOpen && !w.config.inline) { + var n = g(e), + t = Q(n), + a = !(n === w.input || n === w.altInput || w.element.contains(n) || e.path && e.path.indexOf && (~e.path.indexOf(w.input) || ~e.path.indexOf(w.altInput))) && !t && !Q(e.relatedTarget), + i = !w.config.ignoredFocusElements.some((function(e) { + return e.contains(n) + })); + a && i && (w.config.allowInput && w.setDate(w._input.value, !1, w.config.altInput ? w.config.altFormat : w.config.dateFormat), void 0 !== w.timeContainer && void 0 !== w.minuteElement && void 0 !== w.hourElement && "" !== w.input.value && void 0 !== w.input.value && _(), w.close(), w.config && "range" === w.config.mode && 1 === w.selectedDates.length && w.clear(!1)) + } + } + + function ee(e) { + if (!(!e || w.config.minDate && e < w.config.minDate.getFullYear() || w.config.maxDate && e > w.config.maxDate.getFullYear())) { + var n = e, + t = w.currentYear !== n; + w.currentYear = n || w.currentYear, w.config.maxDate && w.currentYear === w.config.maxDate.getFullYear() ? w.currentMonth = Math.min(w.config.maxDate.getMonth(), w.currentMonth) : w.config.minDate && w.currentYear === w.config.minDate.getFullYear() && (w.currentMonth = Math.max(w.config.minDate.getMonth(), w.currentMonth)), t && (w.redraw(), De("onYearChange"), q()) + } + } + + function ne(e, n) { + var t; + void 0 === n && (n = !0); + var a = w.parseDate(e, void 0, n); + if (w.config.minDate && a && M(a, w.config.minDate, void 0 !== n ? n : !w.minDateHasTime) < 0 || w.config.maxDate && a && M(a, w.config.maxDate, void 0 !== n ? n : !w.maxDateHasTime) > 0) return !1; + if (!w.config.enable && 0 === w.config.disable.length) return !0; + if (void 0 === a) return !1; + for (var i = !!w.config.enable, o = null !== (t = w.config.enable) && void 0 !== t ? t : w.config.disable, r = 0, l = void 0; r < o.length; r++) { + if ("function" == typeof(l = o[r]) && l(a)) return i; + if (l instanceof Date && void 0 !== a && l.getTime() === a.getTime()) return i; + if ("string" == typeof l) { + var c = w.parseDate(l, void 0, !0); + return c && c.getTime() === a.getTime() ? i : !i + } + if ("object" == typeof l && void 0 !== a && l.from && l.to && a.getTime() >= l.from.getTime() && a.getTime() <= l.to.getTime()) return i + } + return !i + } + + function te(e) { + return void 0 !== w.daysContainer && (-1 === e.className.indexOf("hidden") && -1 === e.className.indexOf("flatpickr-disabled") && w.daysContainer.contains(e)) + } + + function ae(e) { + var n = e.target === w._input, + t = w._input.value.trimEnd() !== Me(); + !n || !t || e.relatedTarget && Q(e.relatedTarget) || w.setDate(w._input.value, !0, e.target === w.altInput ? w.config.altFormat : w.config.dateFormat) + } + + function ie(e) { + var n = g(e), + t = w.config.wrap ? p.contains(n) : n === w._input, + a = w.config.allowInput, + i = w.isOpen && (!a || !t), + o = w.config.inline && t && !a; + if (13 === e.keyCode && t) { + if (a) return w.setDate(w._input.value, !0, n === w.altInput ? w.config.altFormat : w.config.dateFormat), w.close(), n.blur(); + w.open() + } else if (Q(n) || i || o) { + var r = !!w.timeContainer && w.timeContainer.contains(n); + switch (e.keyCode) { + case 13: + r ? (e.preventDefault(), _(), fe()) : me(e); + break; + case 27: + e.preventDefault(), fe(); + break; + case 8: + case 46: + t && !w.config.allowInput && (e.preventDefault(), w.clear()); + break; + case 37: + case 39: + if (r || t) w.hourElement && w.hourElement.focus(); + else { + e.preventDefault(); + var l = k(); + if (void 0 !== w.daysContainer && (!1 === a || l && te(l))) { + var c = 39 === e.keyCode ? 1 : -1; + e.ctrlKey ? (e.stopPropagation(), Z(c), J(B(1), 0)) : J(void 0, c) + } + } + break; + case 38: + case 40: + e.preventDefault(); + var s = 40 === e.keyCode ? 1 : -1; + w.daysContainer && void 0 !== n.$i || n === w.input || n === w.altInput ? e.ctrlKey ? (e.stopPropagation(), ee(w.currentYear - s), J(B(1), 0)) : r || J(void 0, 7 * s) : n === w.currentYearElement ? ee(w.currentYear - s) : w.config.enableTime && (!r && w.hourElement && w.hourElement.focus(), _(e), w._debouncedChange()); + break; + case 9: + if (r) { + var d = [w.hourElement, w.minuteElement, w.secondElement, w.amPM].concat(w.pluginElements).filter((function(e) { + return e + })), + u = d.indexOf(n); + if (-1 !== u) { + var f = d[u + (e.shiftKey ? -1 : 1)]; + e.preventDefault(), (f || w._input).focus() + } + } else !w.config.noCalendar && w.daysContainer && w.daysContainer.contains(n) && e.shiftKey && (e.preventDefault(), w._input.focus()) + } + } + if (void 0 !== w.amPM && n === w.amPM) switch (e.key) { + case w.l10n.amPM[0].charAt(0): + case w.l10n.amPM[0].charAt(0).toLowerCase(): + w.amPM.textContent = w.l10n.amPM[0], O(), ye(); + break; + case w.l10n.amPM[1].charAt(0): + case w.l10n.amPM[1].charAt(0).toLowerCase(): + w.amPM.textContent = w.l10n.amPM[1], O(), ye() + }(t || Q(n)) && De("onKeyDown", e) + } + + function oe(e, n) { + if (void 0 === n && (n = "flatpickr-day"), 1 === w.selectedDates.length && (!e || e.classList.contains(n) && !e.classList.contains("flatpickr-disabled"))) { + for (var t = e ? e.dateObj.getTime() : w.days.firstElementChild.dateObj.getTime(), a = w.parseDate(w.selectedDates[0], void 0, !0).getTime(), i = Math.min(t, w.selectedDates[0].getTime()), o = Math.max(t, w.selectedDates[0].getTime()), r = !1, l = 0, c = 0, s = i; s < o; s += x) ne(new Date(s), !0) || (r = r || s > i && s < o, s < a && (!l || s > l) ? l = s : s > a && (!c || s < c) && (c = s)); + Array.from(w.rContainer.querySelectorAll("*:nth-child(-n+" + w.config.showMonths + ") > ." + n)).forEach((function(n) { + var i, o, s, d = n.dateObj.getTime(), + u = l > 0 && d < l || c > 0 && d > c; + if (u) return n.classList.add("notAllowed"), void["inRange", "startRange", "endRange"].forEach((function(e) { + n.classList.remove(e) + })); + r && !u || (["startRange", "inRange", "endRange", "notAllowed"].forEach((function(e) { + n.classList.remove(e) + })), void 0 !== e && (e.classList.add(t <= w.selectedDates[0].getTime() ? "startRange" : "endRange"), a < t && d === a ? n.classList.add("startRange") : a > t && d === a && n.classList.add("endRange"), d >= l && (0 === c || d <= c) && (o = a, s = t, (i = d) > Math.min(o, s) && i < Math.max(o, s)) && n.classList.add("inRange"))) + })) + } + } + + function re() { + !w.isOpen || w.config.static || w.config.inline || de() + } + + function le(e) { + return function(n) { + var t = w.config["_" + e + "Date"] = w.parseDate(n, w.config.dateFormat), + a = w.config["_" + ("min" === e ? "max" : "min") + "Date"]; + void 0 !== t && (w["min" === e ? "minDateHasTime" : "maxDateHasTime"] = t.getHours() > 0 || t.getMinutes() > 0 || t.getSeconds() > 0), w.selectedDates && (w.selectedDates = w.selectedDates.filter((function(e) { + return ne(e) + })), w.selectedDates.length || "min" !== e || F(t), ye()), w.daysContainer && (ue(), void 0 !== t ? w.currentYearElement[e] = t.getFullYear().toString() : w.currentYearElement.removeAttribute(e), w.currentYearElement.disabled = !!a && void 0 !== t && a.getFullYear() === t.getFullYear()) + } + } + + function ce() { + return w.config.wrap ? p.querySelector("[data-input]") : p + } + + function se() { + "object" != typeof w.config.locale && void 0 === I.l10ns[w.config.locale] && w.config.errorHandler(new Error("flatpickr: invalid locale " + w.config.locale)), w.l10n = e(e({}, I.l10ns.default), "object" == typeof w.config.locale ? w.config.locale : "default" !== w.config.locale ? I.l10ns[w.config.locale] : void 0), D.D = "(" + w.l10n.weekdays.shorthand.join("|") + ")", D.l = "(" + w.l10n.weekdays.longhand.join("|") + ")", D.M = "(" + w.l10n.months.shorthand.join("|") + ")", D.F = "(" + w.l10n.months.longhand.join("|") + ")", D.K = "(" + w.l10n.amPM[0] + "|" + w.l10n.amPM[1] + "|" + w.l10n.amPM[0].toLowerCase() + "|" + w.l10n.amPM[1].toLowerCase() + ")", void 0 === e(e({}, v), JSON.parse(JSON.stringify(p.dataset || {}))).time_24hr && void 0 === I.defaultConfig.time_24hr && (w.config.time_24hr = w.l10n.time_24hr), w.formatDate = b(w), w.parseDate = C({ + config: w.config, + l10n: w.l10n + }) + } + + function de(e) { + if ("function" != typeof w.config.position) { + if (void 0 !== w.calendarContainer) { + De("onPreCalendarPosition"); + var n = e || w._positionElement, + t = Array.prototype.reduce.call(w.calendarContainer.children, (function(e, n) { + return e + n.offsetHeight + }), 0), + a = w.calendarContainer.offsetWidth, + i = w.config.position.split(" "), + o = i[0], + r = i.length > 1 ? i[1] : null, + l = n.getBoundingClientRect(), + c = window.innerHeight - l.bottom, + d = "above" === o || "below" !== o && c < t && l.top > t, + u = window.pageYOffset + l.top + (d ? -t - 2 : n.offsetHeight + 2); + if (s(w.calendarContainer, "arrowTop", !d), s(w.calendarContainer, "arrowBottom", d), !w.config.inline) { + var f = window.pageXOffset + l.left, + m = !1, + g = !1; + "center" === r ? (f -= (a - l.width) / 2, m = !0) : "right" === r && (f -= a - l.width, g = !0), s(w.calendarContainer, "arrowLeft", !m && !g), s(w.calendarContainer, "arrowCenter", m), s(w.calendarContainer, "arrowRight", g); + var p = window.document.body.offsetWidth - (window.pageXOffset + l.right), + h = f + a > window.document.body.offsetWidth, + v = p + a > window.document.body.offsetWidth; + if (s(w.calendarContainer, "rightMost", h), !w.config.static) + if (w.calendarContainer.style.top = u + "px", h) + if (v) { + var D = function() { + for (var e = null, n = 0; n < document.styleSheets.length; n++) { + var t = document.styleSheets[n]; + if (t.cssRules) { + try { + t.cssRules + } catch (e) { + continue + } + e = t; + break + } + } + return null != e ? e : (a = document.createElement("style"), document.head.appendChild(a), a.sheet); + var a + }(); + if (void 0 === D) return; + var b = window.document.body.offsetWidth, + C = Math.max(0, b / 2 - a / 2), + M = D.cssRules.length, + y = "{left:" + l.left + "px;right:auto;}"; + s(w.calendarContainer, "rightMost", !1), s(w.calendarContainer, "centerMost", !0), D.insertRule(".flatpickr-calendar.centerMost:before,.flatpickr-calendar.centerMost:after" + y, M), w.calendarContainer.style.left = C + "px", w.calendarContainer.style.right = "auto" + } else w.calendarContainer.style.left = "auto", w.calendarContainer.style.right = p + "px"; + else w.calendarContainer.style.left = f + "px", w.calendarContainer.style.right = "auto" + } + } + } else w.config.position(w, e) + } + + function ue() { + w.config.noCalendar || w.isMobile || (q(), Ce(), U()) + } + + function fe() { + w._input.focus(), -1 !== window.navigator.userAgent.indexOf("MSIE") || void 0 !== navigator.msMaxTouchPoints ? setTimeout(w.close, 0) : w.close() + } + + function me(e) { + e.preventDefault(), e.stopPropagation(); + var n = f(g(e), (function(e) { + return e.classList && e.classList.contains("flatpickr-day") && !e.classList.contains("flatpickr-disabled") && !e.classList.contains("notAllowed") + })); + if (void 0 !== n) { + var t = n, + a = w.latestSelectedDateObj = new Date(t.dateObj.getTime()), + i = (a.getMonth() < w.currentMonth || a.getMonth() > w.currentMonth + w.config.showMonths - 1) && "range" !== w.config.mode; + if (w.selectedDateElem = t, "single" === w.config.mode) w.selectedDates = [a]; + else if ("multiple" === w.config.mode) { + var o = be(a); + o ? w.selectedDates.splice(parseInt(o), 1) : w.selectedDates.push(a) + } else "range" === w.config.mode && (2 === w.selectedDates.length && w.clear(!1, !1), w.latestSelectedDateObj = a, w.selectedDates.push(a), 0 !== M(a, w.selectedDates[0], !0) && w.selectedDates.sort((function(e, n) { + return e.getTime() - n.getTime() + }))); + if (O(), i) { + var r = w.currentYear !== a.getFullYear(); + w.currentYear = a.getFullYear(), w.currentMonth = a.getMonth(), r && (De("onYearChange"), q()), De("onMonthChange") + } + if (Ce(), U(), ye(), i || "range" === w.config.mode || 1 !== w.config.showMonths ? void 0 !== w.selectedDateElem && void 0 === w.hourElement && w.selectedDateElem && w.selectedDateElem.focus() : W(t), void 0 !== w.hourElement && void 0 !== w.hourElement && w.hourElement.focus(), w.config.closeOnSelect) { + var l = "single" === w.config.mode && !w.config.enableTime, + c = "range" === w.config.mode && 2 === w.selectedDates.length && !w.config.enableTime; + (l || c) && fe() + } + Y() + } + } + w.parseDate = C({ + config: w.config, + l10n: w.l10n + }), w._handlers = [], w.pluginElements = [], w.loadedPlugins = [], w._bind = P, w._setHoursFromDate = F, w._positionCalendar = de, w.changeMonth = Z, w.changeYear = ee, w.clear = function(e, n) { + void 0 === e && (e = !0); + void 0 === n && (n = !0); + w.input.value = "", void 0 !== w.altInput && (w.altInput.value = ""); + void 0 !== w.mobileInput && (w.mobileInput.value = ""); + w.selectedDates = [], w.latestSelectedDateObj = void 0, !0 === n && (w.currentYear = w._initialDate.getFullYear(), w.currentMonth = w._initialDate.getMonth()); + if (!0 === w.config.enableTime) { + var t = E(w.config), + a = t.hours, + i = t.minutes, + o = t.seconds; + A(a, i, o) + } + w.redraw(), e && De("onChange") + }, w.close = function() { + w.isOpen = !1, w.isMobile || (void 0 !== w.calendarContainer && w.calendarContainer.classList.remove("open"), void 0 !== w._input && w._input.classList.remove("active")); + De("onClose") + }, w.onMouseOver = oe, w._createElement = d, w.createDay = R, w.destroy = function() { + void 0 !== w.config && De("onDestroy"); + for (var e = w._handlers.length; e--;) w._handlers[e].remove(); + if (w._handlers = [], w.mobileInput) w.mobileInput.parentNode && w.mobileInput.parentNode.removeChild(w.mobileInput), w.mobileInput = void 0; + else if (w.calendarContainer && w.calendarContainer.parentNode) + if (w.config.static && w.calendarContainer.parentNode) { + var n = w.calendarContainer.parentNode; + if (n.lastChild && n.removeChild(n.lastChild), n.parentNode) { + for (; n.firstChild;) n.parentNode.insertBefore(n.firstChild, n); + n.parentNode.removeChild(n) + } + } else w.calendarContainer.parentNode.removeChild(w.calendarContainer); + w.altInput && (w.input.type = "text", w.altInput.parentNode && w.altInput.parentNode.removeChild(w.altInput), delete w.altInput); + w.input && (w.input.type = w.input._type, w.input.classList.remove("flatpickr-input"), w.input.removeAttribute("readonly")); + ["_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "monthsDropdownContainer", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config"].forEach((function(e) { + try { + delete w[e] + } catch (e) {} + })) + }, w.isEnabled = ne, w.jumpToDate = j, w.updateValue = ye, w.open = function(e, n) { + void 0 === n && (n = w._positionElement); + if (!0 === w.isMobile) { + if (e) { + e.preventDefault(); + var t = g(e); + t && t.blur() + } + return void 0 !== w.mobileInput && (w.mobileInput.focus(), w.mobileInput.click()), void De("onOpen") + } + if (w._input.disabled || w.config.inline) return; + var a = w.isOpen; + w.isOpen = !0, a || (w.calendarContainer.classList.add("open"), w._input.classList.add("active"), De("onOpen"), de(n)); + !0 === w.config.enableTime && !0 === w.config.noCalendar && (!1 !== w.config.allowInput || void 0 !== e && w.timeContainer.contains(e.relatedTarget) || setTimeout((function() { + return w.hourElement.select() + }), 50)) + }, w.redraw = ue, w.set = function(e, n) { + if (null !== e && "object" == typeof e) + for (var a in Object.assign(w.config, e), e) void 0 !== ge[a] && ge[a].forEach((function(e) { + return e() + })); + else w.config[e] = n, void 0 !== ge[e] ? ge[e].forEach((function(e) { + return e() + })) : t.indexOf(e) > -1 && (w.config[e] = c(n)); + w.redraw(), ye(!0) + }, w.setDate = function(e, n, t) { + void 0 === n && (n = !1); + void 0 === t && (t = w.config.dateFormat); + if (0 !== e && !e || e instanceof Array && 0 === e.length) return w.clear(n); + pe(e, t), w.latestSelectedDateObj = w.selectedDates[w.selectedDates.length - 1], w.redraw(), j(void 0, n), F(), 0 === w.selectedDates.length && w.clear(!1); + ye(n), n && De("onChange") + }, w.toggle = function(e) { + if (!0 === w.isOpen) return w.close(); + w.open(e) + }; + var ge = { + locale: [se, G], + showMonths: [V, S, z], + minDate: [j], + maxDate: [j], + positionElement: [ve], + clickOpens: [function() { + !0 === w.config.clickOpens ? (P(w._input, "focus", w.open), P(w._input, "click", w.open)) : (w._input.removeEventListener("focus", w.open), w._input.removeEventListener("click", w.open)) + }] + }; + + function pe(e, n) { + var t = []; + if (e instanceof Array) t = e.map((function(e) { + return w.parseDate(e, n) + })); + else if (e instanceof Date || "number" == typeof e) t = [w.parseDate(e, n)]; + else if ("string" == typeof e) switch (w.config.mode) { + case "single": + case "time": + t = [w.parseDate(e, n)]; + break; + case "multiple": + t = e.split(w.config.conjunction).map((function(e) { + return w.parseDate(e, n) + })); + break; + case "range": + t = e.split(w.l10n.rangeSeparator).map((function(e) { + return w.parseDate(e, n) + })) + } else w.config.errorHandler(new Error("Invalid date supplied: " + JSON.stringify(e))); + w.selectedDates = w.config.allowInvalidPreload ? t : t.filter((function(e) { + return e instanceof Date && ne(e, !1) + })), "range" === w.config.mode && w.selectedDates.sort((function(e, n) { + return e.getTime() - n.getTime() + })) + } + + function he(e) { + return e.slice().map((function(e) { + return "string" == typeof e || "number" == typeof e || e instanceof Date ? w.parseDate(e, void 0, !0) : e && "object" == typeof e && e.from && e.to ? { + from: w.parseDate(e.from, void 0), + to: w.parseDate(e.to, void 0) + } : e + })).filter((function(e) { + return e + })) + } + + function ve() { + w._positionElement = w.config.positionElement || w._input + } + + function De(e, n) { + if (void 0 !== w.config) { + var t = w.config[e]; + if (void 0 !== t && t.length > 0) + for (var a = 0; t[a] && a < t.length; a++) t[a](w.selectedDates, w.input.value, w, n); + "onChange" === e && (w.input.dispatchEvent(we("change")), w.input.dispatchEvent(we("input"))) + } + } + + function we(e) { + var n = document.createEvent("Event"); + return n.initEvent(e, !0, !0), n + } + + function be(e) { + for (var n = 0; n < w.selectedDates.length; n++) { + var t = w.selectedDates[n]; + if (t instanceof Date && 0 === M(t, e)) return "" + n + } + return !1 + } + + function Ce() { + w.config.noCalendar || w.isMobile || !w.monthNav || (w.yearElements.forEach((function(e, n) { + var t = new Date(w.currentYear, w.currentMonth, 1); + t.setMonth(w.currentMonth + n), w.config.showMonths > 1 || "static" === w.config.monthSelectorType ? w.monthElements[n].textContent = h(t.getMonth(), w.config.shorthandCurrentMonth, w.l10n) + " " : w.monthsDropdownContainer.value = t.getMonth().toString(), e.value = t.getFullYear().toString() + })), w._hidePrevMonthArrow = void 0 !== w.config.minDate && (w.currentYear === w.config.minDate.getFullYear() ? w.currentMonth <= w.config.minDate.getMonth() : w.currentYear < w.config.minDate.getFullYear()), w._hideNextMonthArrow = void 0 !== w.config.maxDate && (w.currentYear === w.config.maxDate.getFullYear() ? w.currentMonth + 1 > w.config.maxDate.getMonth() : w.currentYear > w.config.maxDate.getFullYear())) + } + + function Me(e) { + var n = e || (w.config.altInput ? w.config.altFormat : w.config.dateFormat); + return w.selectedDates.map((function(e) { + return w.formatDate(e, n) + })).filter((function(e, n, t) { + return "range" !== w.config.mode || w.config.enableTime || t.indexOf(e) === n + })).join("range" !== w.config.mode ? w.config.conjunction : w.l10n.rangeSeparator) + } + + function ye(e) { + void 0 === e && (e = !0), void 0 !== w.mobileInput && w.mobileFormatStr && (w.mobileInput.value = void 0 !== w.latestSelectedDateObj ? w.formatDate(w.latestSelectedDateObj, w.mobileFormatStr) : ""), w.input.value = Me(w.config.dateFormat), void 0 !== w.altInput && (w.altInput.value = Me(w.config.altFormat)), !1 !== e && De("onValueUpdate") + } + + function xe(e) { + var n = g(e), + t = w.prevMonthNav.contains(n), + a = w.nextMonthNav.contains(n); + t || a ? Z(t ? -1 : 1) : w.yearElements.indexOf(n) >= 0 ? n.select() : n.classList.contains("arrowUp") ? w.changeYear(w.currentYear + 1) : n.classList.contains("arrowDown") && w.changeYear(w.currentYear - 1) + } + return function() { + w.element = w.input = p, w.isOpen = !1, + function() { + var n = ["wrap", "weekNumbers", "allowInput", "allowInvalidPreload", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"], + i = e(e({}, JSON.parse(JSON.stringify(p.dataset || {}))), v), + o = {}; + w.config.parseDate = i.parseDate, w.config.formatDate = i.formatDate, Object.defineProperty(w.config, "enable", { + get: function() { + return w.config._enable + }, + set: function(e) { + w.config._enable = he(e) + } + }), Object.defineProperty(w.config, "disable", { + get: function() { + return w.config._disable + }, + set: function(e) { + w.config._disable = he(e) + } + }); + var r = "time" === i.mode; + if (!i.dateFormat && (i.enableTime || r)) { + var l = I.defaultConfig.dateFormat || a.dateFormat; + o.dateFormat = i.noCalendar || r ? "H:i" + (i.enableSeconds ? ":S" : "") : l + " H:i" + (i.enableSeconds ? ":S" : "") + } + if (i.altInput && (i.enableTime || r) && !i.altFormat) { + var s = I.defaultConfig.altFormat || a.altFormat; + o.altFormat = i.noCalendar || r ? "h:i" + (i.enableSeconds ? ":S K" : " K") : s + " h:i" + (i.enableSeconds ? ":S" : "") + " K" + } + Object.defineProperty(w.config, "minDate", { + get: function() { + return w.config._minDate + }, + set: le("min") + }), Object.defineProperty(w.config, "maxDate", { + get: function() { + return w.config._maxDate + }, + set: le("max") + }); + var d = function(e) { + return function(n) { + w.config["min" === e ? "_minTime" : "_maxTime"] = w.parseDate(n, "H:i:S") + } + }; + Object.defineProperty(w.config, "minTime", { + get: function() { + return w.config._minTime + }, + set: d("min") + }), Object.defineProperty(w.config, "maxTime", { + get: function() { + return w.config._maxTime + }, + set: d("max") + }), "time" === i.mode && (w.config.noCalendar = !0, w.config.enableTime = !0); + Object.assign(w.config, o, i); + for (var u = 0; u < n.length; u++) w.config[n[u]] = !0 === w.config[n[u]] || "true" === w.config[n[u]]; + t.filter((function(e) { + return void 0 !== w.config[e] + })).forEach((function(e) { + w.config[e] = c(w.config[e] || []).map(T) + })), w.isMobile = !w.config.disableMobile && !w.config.inline && "single" === w.config.mode && !w.config.disable.length && !w.config.enable && !w.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + for (u = 0; u < w.config.plugins.length; u++) { + var f = w.config.plugins[u](w) || {}; + for (var m in f) t.indexOf(m) > -1 ? w.config[m] = c(f[m]).map(T).concat(w.config[m]) : void 0 === i[m] && (w.config[m] = f[m]) + } + i.altInputClass || (w.config.altInputClass = ce().className + " " + w.config.altInputClass); + De("onParseConfig") + }(), se(), + function() { + if (w.input = ce(), !w.input) return void w.config.errorHandler(new Error("Invalid input element specified")); + w.input._type = w.input.type, w.input.type = "text", w.input.classList.add("flatpickr-input"), w._input = w.input, w.config.altInput && (w.altInput = d(w.input.nodeName, w.config.altInputClass), w._input = w.altInput, w.altInput.placeholder = w.input.placeholder, w.altInput.disabled = w.input.disabled, w.altInput.required = w.input.required, w.altInput.tabIndex = w.input.tabIndex, w.altInput.type = "text", w.input.setAttribute("type", "hidden"), !w.config.static && w.input.parentNode && w.input.parentNode.insertBefore(w.altInput, w.input.nextSibling)); + w.config.allowInput || w._input.setAttribute("readonly", "readonly"); + ve() + }(), + function() { + w.selectedDates = [], w.now = w.parseDate(w.config.now) || new Date; + var e = w.config.defaultDate || ("INPUT" !== w.input.nodeName && "TEXTAREA" !== w.input.nodeName || !w.input.placeholder || w.input.value !== w.input.placeholder ? w.input.value : null); + e && pe(e, w.config.dateFormat); + w._initialDate = w.selectedDates.length > 0 ? w.selectedDates[0] : w.config.minDate && w.config.minDate.getTime() > w.now.getTime() ? w.config.minDate : w.config.maxDate && w.config.maxDate.getTime() < w.now.getTime() ? w.config.maxDate : w.now, w.currentYear = w._initialDate.getFullYear(), w.currentMonth = w._initialDate.getMonth(), w.selectedDates.length > 0 && (w.latestSelectedDateObj = w.selectedDates[0]); + void 0 !== w.config.minTime && (w.config.minTime = w.parseDate(w.config.minTime, "H:i")); + void 0 !== w.config.maxTime && (w.config.maxTime = w.parseDate(w.config.maxTime, "H:i")); + w.minDateHasTime = !!w.config.minDate && (w.config.minDate.getHours() > 0 || w.config.minDate.getMinutes() > 0 || w.config.minDate.getSeconds() > 0), w.maxDateHasTime = !!w.config.maxDate && (w.config.maxDate.getHours() > 0 || w.config.maxDate.getMinutes() > 0 || w.config.maxDate.getSeconds() > 0) + }(), w.utils = { + getDaysInMonth: function(e, n) { + return void 0 === e && (e = w.currentMonth), void 0 === n && (n = w.currentYear), 1 === e && (n % 4 == 0 && n % 100 != 0 || n % 400 == 0) ? 29 : w.l10n.daysInMonth[e] + } + }, w.isMobile || function() { + var e = window.document.createDocumentFragment(); + if (w.calendarContainer = d("div", "flatpickr-calendar"), w.calendarContainer.tabIndex = -1, !w.config.noCalendar) { + if (e.appendChild((w.monthNav = d("div", "flatpickr-months"), w.yearElements = [], w.monthElements = [], w.prevMonthNav = d("span", "flatpickr-prev-month"), w.prevMonthNav.innerHTML = w.config.prevArrow, w.nextMonthNav = d("span", "flatpickr-next-month"), w.nextMonthNav.innerHTML = w.config.nextArrow, V(), Object.defineProperty(w, "_hidePrevMonthArrow", { + get: function() { + return w.__hidePrevMonthArrow + }, + set: function(e) { + w.__hidePrevMonthArrow !== e && (s(w.prevMonthNav, "flatpickr-disabled", e), w.__hidePrevMonthArrow = e) + } + }), Object.defineProperty(w, "_hideNextMonthArrow", { + get: function() { + return w.__hideNextMonthArrow + }, + set: function(e) { + w.__hideNextMonthArrow !== e && (s(w.nextMonthNav, "flatpickr-disabled", e), w.__hideNextMonthArrow = e) + } + }), w.currentYearElement = w.yearElements[0], Ce(), w.monthNav)), w.innerContainer = d("div", "flatpickr-innerContainer"), w.config.weekNumbers) { + var n = function() { + w.calendarContainer.classList.add("hasWeeks"); + var e = d("div", "flatpickr-weekwrapper"); + e.appendChild(d("span", "flatpickr-weekday", w.l10n.weekAbbreviation)); + var n = d("div", "flatpickr-weeks"); + return e.appendChild(n), { + weekWrapper: e, + weekNumbers: n + } + }(), + t = n.weekWrapper, + a = n.weekNumbers; + w.innerContainer.appendChild(t), w.weekNumbers = a, w.weekWrapper = t + } + w.rContainer = d("div", "flatpickr-rContainer"), w.rContainer.appendChild(z()), w.daysContainer || (w.daysContainer = d("div", "flatpickr-days"), w.daysContainer.tabIndex = -1), U(), w.rContainer.appendChild(w.daysContainer), w.innerContainer.appendChild(w.rContainer), e.appendChild(w.innerContainer) + } + w.config.enableTime && e.appendChild(function() { + w.calendarContainer.classList.add("hasTime"), w.config.noCalendar && w.calendarContainer.classList.add("noCalendar"); + var e = E(w.config); + w.timeContainer = d("div", "flatpickr-time"), w.timeContainer.tabIndex = -1; + var n = d("span", "flatpickr-time-separator", ":"), + t = m("flatpickr-hour", { + "aria-label": w.l10n.hourAriaLabel + }); + w.hourElement = t.getElementsByTagName("input")[0]; + var a = m("flatpickr-minute", { + "aria-label": w.l10n.minuteAriaLabel + }); + w.minuteElement = a.getElementsByTagName("input")[0], w.hourElement.tabIndex = w.minuteElement.tabIndex = -1, w.hourElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getHours() : w.config.time_24hr ? e.hours : function(e) { + switch (e % 24) { + case 0: + case 12: + return 12; + default: + return e % 12 + } + }(e.hours)), w.minuteElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getMinutes() : e.minutes), w.hourElement.setAttribute("step", w.config.hourIncrement.toString()), w.minuteElement.setAttribute("step", w.config.minuteIncrement.toString()), w.hourElement.setAttribute("min", w.config.time_24hr ? "0" : "1"), w.hourElement.setAttribute("max", w.config.time_24hr ? "23" : "12"), w.hourElement.setAttribute("maxlength", "2"), w.minuteElement.setAttribute("min", "0"), w.minuteElement.setAttribute("max", "59"), w.minuteElement.setAttribute("maxlength", "2"), w.timeContainer.appendChild(t), w.timeContainer.appendChild(n), w.timeContainer.appendChild(a), w.config.time_24hr && w.timeContainer.classList.add("time24hr"); + if (w.config.enableSeconds) { + w.timeContainer.classList.add("hasSeconds"); + var i = m("flatpickr-second"); + w.secondElement = i.getElementsByTagName("input")[0], w.secondElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getSeconds() : e.seconds), w.secondElement.setAttribute("step", w.minuteElement.getAttribute("step")), w.secondElement.setAttribute("min", "0"), w.secondElement.setAttribute("max", "59"), w.secondElement.setAttribute("maxlength", "2"), w.timeContainer.appendChild(d("span", "flatpickr-time-separator", ":")), w.timeContainer.appendChild(i) + } + w.config.time_24hr || (w.amPM = d("span", "flatpickr-am-pm", w.l10n.amPM[r((w.latestSelectedDateObj ? w.hourElement.value : w.config.defaultHour) > 11)]), w.amPM.title = w.l10n.toggleTitle, w.amPM.tabIndex = -1, w.timeContainer.appendChild(w.amPM)); + return w.timeContainer + }()); + s(w.calendarContainer, "rangeMode", "range" === w.config.mode), s(w.calendarContainer, "animate", !0 === w.config.animate), s(w.calendarContainer, "multiMonth", w.config.showMonths > 1), w.calendarContainer.appendChild(e); + var i = void 0 !== w.config.appendTo && void 0 !== w.config.appendTo.nodeType; + if ((w.config.inline || w.config.static) && (w.calendarContainer.classList.add(w.config.inline ? "inline" : "static"), w.config.inline && (!i && w.element.parentNode ? w.element.parentNode.insertBefore(w.calendarContainer, w._input.nextSibling) : void 0 !== w.config.appendTo && w.config.appendTo.appendChild(w.calendarContainer)), w.config.static)) { + var l = d("div", "flatpickr-wrapper"); + w.element.parentNode && w.element.parentNode.insertBefore(l, w.element), l.appendChild(w.element), w.altInput && l.appendChild(w.altInput), l.appendChild(w.calendarContainer) + } + w.config.static || w.config.inline || (void 0 !== w.config.appendTo ? w.config.appendTo : window.document.body).appendChild(w.calendarContainer) + }(), + function() { + w.config.wrap && ["open", "close", "toggle", "clear"].forEach((function(e) { + Array.prototype.forEach.call(w.element.querySelectorAll("[data-" + e + "]"), (function(n) { + return P(n, "click", w[e]) + })) + })); + if (w.isMobile) return void + function() { + var e = w.config.enableTime ? w.config.noCalendar ? "time" : "datetime-local" : "date"; + w.mobileInput = d("input", w.input.className + " flatpickr-mobile"), w.mobileInput.tabIndex = 1, w.mobileInput.type = e, w.mobileInput.disabled = w.input.disabled, w.mobileInput.required = w.input.required, w.mobileInput.placeholder = w.input.placeholder, w.mobileFormatStr = "datetime-local" === e ? "Y-m-d\\TH:i:S" : "date" === e ? "Y-m-d" : "H:i:S", w.selectedDates.length > 0 && (w.mobileInput.defaultValue = w.mobileInput.value = w.formatDate(w.selectedDates[0], w.mobileFormatStr)); + w.config.minDate && (w.mobileInput.min = w.formatDate(w.config.minDate, "Y-m-d")); + w.config.maxDate && (w.mobileInput.max = w.formatDate(w.config.maxDate, "Y-m-d")); + w.input.getAttribute("step") && (w.mobileInput.step = String(w.input.getAttribute("step"))); + w.input.type = "hidden", void 0 !== w.altInput && (w.altInput.type = "hidden"); + try { + w.input.parentNode && w.input.parentNode.insertBefore(w.mobileInput, w.input.nextSibling) + } catch (e) {} + P(w.mobileInput, "change", (function(e) { + w.setDate(g(e).value, !1, w.mobileFormatStr), De("onChange"), De("onClose") + })) + }(); + var e = l(re, 50); + w._debouncedChange = l(Y, 300), w.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent) && P(w.daysContainer, "mouseover", (function(e) { + "range" === w.config.mode && oe(g(e)) + })); + P(w._input, "keydown", ie), void 0 !== w.calendarContainer && P(w.calendarContainer, "keydown", ie); + w.config.inline || w.config.static || P(window, "resize", e); + void 0 !== window.ontouchstart ? P(window.document, "touchstart", X) : P(window.document, "mousedown", X); + P(window.document, "focus", X, { + capture: !0 + }), !0 === w.config.clickOpens && (P(w._input, "focus", w.open), P(w._input, "click", w.open)); + void 0 !== w.daysContainer && (P(w.monthNav, "click", xe), P(w.monthNav, ["keyup", "increment"], N), P(w.daysContainer, "click", me)); + if (void 0 !== w.timeContainer && void 0 !== w.minuteElement && void 0 !== w.hourElement) { + var n = function(e) { + return g(e).select() + }; + P(w.timeContainer, ["increment"], _), P(w.timeContainer, "blur", _, { + capture: !0 + }), P(w.timeContainer, "click", H), P([w.hourElement, w.minuteElement], ["focus", "click"], n), void 0 !== w.secondElement && P(w.secondElement, "focus", (function() { + return w.secondElement && w.secondElement.select() + })), void 0 !== w.amPM && P(w.amPM, "click", (function(e) { + _(e) + })) + } + w.config.allowInput && P(w._input, "blur", ae) + }(), (w.selectedDates.length || w.config.noCalendar) && (w.config.enableTime && F(w.config.noCalendar ? w.latestSelectedDateObj : void 0), ye(!1)), S(); + var n = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + !w.isMobile && n && de(), De("onReady") + }(), w + } + + function T(e, n) { + for (var t = Array.prototype.slice.call(e).filter((function(e) { + return e instanceof HTMLElement + })), a = [], i = 0; i < t.length; i++) { + var o = t[i]; + try { + if (null !== o.getAttribute("data-fp-omit")) continue; + void 0 !== o._flatpickr && (o._flatpickr.destroy(), o._flatpickr = void 0), o._flatpickr = k(o, n || {}), a.push(o._flatpickr) + } catch (e) { + console.error(e) + } + } + return 1 === a.length ? a[0] : a + } + "undefined" != typeof HTMLElement && "undefined" != typeof HTMLCollection && "undefined" != typeof NodeList && (HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function(e) { + return T(this, e) + }, HTMLElement.prototype.flatpickr = function(e) { + return T([this], e) + }); + var I = function(e, n) { + return "string" == typeof e ? T(window.document.querySelectorAll(e), n) : e instanceof Node ? T([e], n) : T(e, n) + }; + return I.defaultConfig = {}, I.l10ns = { + en: e({}, i), + default: e({}, i) + }, I.localize = function(n) { + I.l10ns.default = e(e({}, I.l10ns.default), n) + }, I.setDefaults = function(n) { + I.defaultConfig = e(e({}, I.defaultConfig), n) + }, I.parseDate = C({}), I.formatDate = b({}), I.compareDates = M, "undefined" != typeof jQuery && void 0 !== jQuery.fn && (jQuery.fn.flatpickr = function(e) { + return T(this, e) + }), Date.prototype.fp_incr = function(e) { + return new Date(this.getFullYear(), this.getMonth(), this.getDate() + ("string" == typeof e ? parseInt(e, 10) : e)) + }, "undefined" != typeof window && (window.flatpickr = I), I +})); \ No newline at end of file diff --git a/src/main/webapp/font-awesome-6.5.1/css/all.min.css b/src/main/webapp/font-awesome-6.5.1/css/all.min.css new file mode 100644 index 0000000..095792c --- /dev/null +++ b/src/main/webapp/font-awesome-6.5.1/css/all.min.css @@ -0,0 +1,6995 @@ +/*! + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2023 Fonticons, Inc. + */ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Free"); + font-weight: var(--fa-style, 900); +} +.fa, +.fa-brands, +.fa-classic, +.fa-regular, +.fa-sharp, +.fa-solid, +.fab, +.far, +.fas { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; +} +.fa-classic, +.fa-regular, +.fa-solid, +.far, +.fas { + font-family: "Font Awesome 6 Free"; +} +.fa-brands, +.fab { + font-family: "Font Awesome 6 Brands"; +} +.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-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; +} +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; +} +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; +} +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; +} +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; +} +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; +} +.fa-fw { + text-align: center; + width: 1.25em; +} +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; +} +.fa-ul > li { + position: relative; +} +.fa-li { + left: calc(var(--fa-li-width, 2em) * -1); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; +} +.fa-border { + border-radius: var(--fa-border-radius, 0.1em); + border: var(--fa-border-width, 0.08em) var(--fa-border-style, solid) + var(--fa-border-color, #eee); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); +} +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); +} +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); +} +.fa-beat { + -webkit-animation-name: fa-beat; + animation-name: fa-beat; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); +} +.fa-bounce { + -webkit-animation-name: fa-bounce; + animation-name: fa-bounce; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.28, 0.84, 0.42, 1) + ); + animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.28, 0.84, 0.42, 1) + ); +} +.fa-fade { + -webkit-animation-name: fa-fade; + animation-name: fa-fade; + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); + animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); +} +.fa-beat-fade, +.fa-fade { + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); +} +.fa-beat-fade { + -webkit-animation-name: fa-beat-fade; + animation-name: fa-beat-fade; + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); + animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); +} +.fa-flip { + -webkit-animation-name: fa-flip; + animation-name: fa-flip; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); +} +.fa-shake { + -webkit-animation-name: fa-shake; + animation-name: fa-shake; + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); +} +.fa-shake, +.fa-spin { + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); +} +.fa-spin { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-duration: var(--fa-animation-duration, 2s); + animation-duration: var(--fa-animation-duration, 2s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); +} +.fa-spin-reverse { + --fa-animation-direction: reverse; +} +.fa-pulse, +.fa-spin-pulse { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); + animation-timing-function: var(--fa-animation-timing, steps(8)); +} +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-beat-fade, + .fa-bounce, + .fa-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + -webkit-animation-delay: -1ms; + animation-delay: -1ms; + -webkit-animation-duration: 1ms; + animation-duration: 1ms; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-transition-delay: 0s; + transition-delay: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; + } +} +@-webkit-keyframes fa-beat { + 0%, + 90% { + -webkit-transform: scale(1); + transform: scale(1); + } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); + } +} +@keyframes fa-beat { + 0%, + 90% { + -webkit-transform: scale(1); + transform: scale(1); + } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); + } +} +@-webkit-keyframes fa-bounce { + 0% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + 10% { + -webkit-transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + } + 30% { + -webkit-transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + } + 50% { + -webkit-transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + } + 57% { + -webkit-transform: scale(1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1) translateY(var(--fa-bounce-rebound, -0.125em)); + } + 64% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + to { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } +} +@keyframes fa-bounce { + 0% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + 10% { + -webkit-transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + } + 30% { + -webkit-transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + } + 50% { + -webkit-transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + } + 57% { + -webkit-transform: scale(1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1) translateY(var(--fa-bounce-rebound, -0.125em)); + } + 64% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + to { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } +} +@-webkit-keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); + } +} +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); + } +} +@-webkit-keyframes fa-beat-fade { + 0%, + to { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); + } +} +@keyframes fa-beat-fade { + 0%, + to { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); + } +} +@-webkit-keyframes fa-flip { + 50% { + -webkit-transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + } +} +@keyframes fa-flip { + 50% { + -webkit-transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + } +} +@-webkit-keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); + } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + 8%, + 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); + } + 12%, + 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); + } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); + } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); + } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); + } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); + } + 40%, + to { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); + } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + 8%, + 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); + } + 12%, + 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); + } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); + } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); + } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); + } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); + } + 40%, + to { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +.fa-rotate-90 { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); +} +.fa-flip-vertical { + -webkit-transform: scaleY(-1); + transform: scaleY(-1); +} +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + -webkit-transform: scale(-1); + transform: scale(-1); +} +.fa-rotate-by { + -webkit-transform: rotate(var(--fa-rotate-angle, none)); + transform: rotate(var(--fa-rotate-angle, 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%; + z-index: var(--fa-stack-z-index, auto); +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: var(--fa-inverse, #fff); +} + +.fa-0:before { + content: "\30"; +} +.fa-1:before { + content: "\31"; +} +.fa-2:before { + content: "\32"; +} +.fa-3:before { + content: "\33"; +} +.fa-4:before { + content: "\34"; +} +.fa-5:before { + content: "\35"; +} +.fa-6:before { + content: "\36"; +} +.fa-7:before { + content: "\37"; +} +.fa-8:before { + content: "\38"; +} +.fa-9:before { + content: "\39"; +} +.fa-fill-drip:before { + content: "\f576"; +} +.fa-arrows-to-circle:before { + content: "\e4bd"; +} +.fa-chevron-circle-right:before, +.fa-circle-chevron-right:before { + content: "\f138"; +} +.fa-at:before { + content: "\40"; +} +.fa-trash-alt:before, +.fa-trash-can:before { + content: "\f2ed"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-user-times:before, +.fa-user-xmark:before { + content: "\f235"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-comment-alt:before, +.fa-message:before { + content: "\f27a"; +} +.fa-info:before { + content: "\f129"; +} +.fa-compress-alt:before, +.fa-down-left-and-up-right-to-center:before { + content: "\f422"; +} +.fa-explosion:before { + content: "\e4e9"; +} +.fa-file-alt:before, +.fa-file-lines:before, +.fa-file-text:before { + content: "\f15c"; +} +.fa-wave-square:before { + content: "\f83e"; +} +.fa-ring:before { + content: "\f70b"; +} +.fa-building-un:before { + content: "\e4d9"; +} +.fa-dice-three:before { + content: "\f527"; +} +.fa-calendar-alt:before, +.fa-calendar-days:before { + content: "\f073"; +} +.fa-anchor-circle-check:before { + content: "\e4aa"; +} +.fa-building-circle-arrow-right:before { + content: "\e4d1"; +} +.fa-volleyball-ball:before, +.fa-volleyball:before { + content: "\f45f"; +} +.fa-arrows-up-to-line:before { + content: "\e4c2"; +} +.fa-sort-desc:before, +.fa-sort-down:before { + content: "\f0dd"; +} +.fa-circle-minus:before, +.fa-minus-circle:before { + content: "\f056"; +} +.fa-door-open:before { + content: "\f52b"; +} +.fa-right-from-bracket:before, +.fa-sign-out-alt:before { + content: "\f2f5"; +} +.fa-atom:before { + content: "\f5d2"; +} +.fa-soap:before { + content: "\e06e"; +} +.fa-heart-music-camera-bolt:before, +.fa-icons:before { + content: "\f86d"; +} +.fa-microphone-alt-slash:before, +.fa-microphone-lines-slash:before { + content: "\f539"; +} +.fa-bridge-circle-check:before { + content: "\e4c9"; +} +.fa-pump-medical:before { + content: "\e06a"; +} +.fa-fingerprint:before { + content: "\f577"; +} +.fa-hand-point-right:before { + content: "\f0a4"; +} +.fa-magnifying-glass-location:before, +.fa-search-location:before { + content: "\f689"; +} +.fa-forward-step:before, +.fa-step-forward:before { + content: "\f051"; +} +.fa-face-smile-beam:before, +.fa-smile-beam:before { + content: "\f5b8"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-football-ball:before, +.fa-football:before { + content: "\f44e"; +} +.fa-school-circle-exclamation:before { + content: "\e56c"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-angle-double-down:before, +.fa-angles-down:before { + content: "\f103"; +} +.fa-users-rectangle:before { + content: "\e594"; +} +.fa-people-roof:before { + content: "\e537"; +} +.fa-people-line:before { + content: "\e534"; +} +.fa-beer-mug-empty:before, +.fa-beer:before { + content: "\f0fc"; +} +.fa-diagram-predecessor:before { + content: "\e477"; +} +.fa-arrow-up-long:before, +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-burn:before, +.fa-fire-flame-simple:before { + content: "\f46a"; +} +.fa-male:before, +.fa-person:before { + content: "\f183"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-file-csv:before { + content: "\f6dd"; +} +.fa-menorah:before { + content: "\f676"; +} +.fa-truck-plane:before { + content: "\e58f"; +} +.fa-record-vinyl:before { + content: "\f8d9"; +} +.fa-face-grin-stars:before, +.fa-grin-stars:before { + content: "\f587"; +} +.fa-bong:before { + content: "\f55c"; +} +.fa-pastafarianism:before, +.fa-spaghetti-monster-flying:before { + content: "\f67b"; +} +.fa-arrow-down-up-across-line:before { + content: "\e4af"; +} +.fa-spoon:before, +.fa-utensil-spoon:before { + content: "\f2e5"; +} +.fa-jar-wheat:before { + content: "\e517"; +} +.fa-envelopes-bulk:before, +.fa-mail-bulk:before { + content: "\f674"; +} +.fa-file-circle-exclamation:before { + content: "\e4eb"; +} +.fa-circle-h:before, +.fa-hospital-symbol:before { + content: "\f47e"; +} +.fa-pager:before { + content: "\f815"; +} +.fa-address-book:before, +.fa-contact-book:before { + content: "\f2b9"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-k:before { + content: "\4b"; +} +.fa-landmark-flag:before { + content: "\e51c"; +} +.fa-pencil-alt:before, +.fa-pencil:before { + content: "\f303"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-file-clipboard:before, +.fa-paste:before { + content: "\f0ea"; +} +.fa-code-pull-request:before { + content: "\e13c"; +} +.fa-clipboard-list:before { + content: "\f46d"; +} +.fa-truck-loading:before, +.fa-truck-ramp-box:before { + content: "\f4de"; +} +.fa-user-check:before { + content: "\f4fc"; +} +.fa-vial-virus:before { + content: "\e597"; +} +.fa-sheet-plastic:before { + content: "\e571"; +} +.fa-blog:before { + content: "\f781"; +} +.fa-user-ninja:before { + content: "\f504"; +} +.fa-person-arrow-up-from-line:before { + content: "\e539"; +} +.fa-scroll-torah:before, +.fa-torah:before { + content: "\f6a0"; +} +.fa-broom-ball:before, +.fa-quidditch-broom-ball:before, +.fa-quidditch:before { + content: "\f458"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-archive:before, +.fa-box-archive:before { + content: "\f187"; +} +.fa-person-drowning:before { + content: "\e545"; +} +.fa-arrow-down-9-1:before, +.fa-sort-numeric-desc:before, +.fa-sort-numeric-down-alt:before { + content: "\f886"; +} +.fa-face-grin-tongue-squint:before, +.fa-grin-tongue-squint:before { + content: "\f58a"; +} +.fa-spray-can:before { + content: "\f5bd"; +} +.fa-truck-monster:before { + content: "\f63b"; +} +.fa-w:before { + content: "\57"; +} +.fa-earth-africa:before, +.fa-globe-africa:before { + content: "\f57c"; +} +.fa-rainbow:before { + content: "\f75b"; +} +.fa-circle-notch:before { + content: "\f1ce"; +} +.fa-tablet-alt:before, +.fa-tablet-screen-button:before { + content: "\f3fa"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-trowel-bricks:before { + content: "\e58a"; +} +.fa-face-flushed:before, +.fa-flushed:before { + content: "\f579"; +} +.fa-hospital-user:before { + content: "\f80d"; +} +.fa-tent-arrow-left-right:before { + content: "\e57f"; +} +.fa-gavel:before, +.fa-legal:before { + content: "\f0e3"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-box-tissue:before { + content: "\e05b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-bell-concierge:before, +.fa-concierge-bell:before { + content: "\f562"; +} +.fa-pen-ruler:before, +.fa-pencil-ruler:before { + content: "\f5ae"; +} +.fa-people-arrows-left-right:before, +.fa-people-arrows:before { + content: "\e068"; +} +.fa-mars-and-venus-burst:before { + content: "\e523"; +} +.fa-caret-square-right:before, +.fa-square-caret-right:before { + content: "\f152"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-sun-plant-wilt:before { + content: "\e57a"; +} +.fa-toilets-portable:before { + content: "\e584"; +} +.fa-hockey-puck:before { + content: "\f453"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magnifying-glass-arrow-right:before { + content: "\e521"; +} +.fa-digital-tachograph:before, +.fa-tachograph-digital:before { + content: "\f566"; +} +.fa-users-slash:before { + content: "\e073"; +} +.fa-clover:before { + content: "\e139"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f3e5"; +} +.fa-star-and-crescent:before { + content: "\f699"; +} +.fa-house-fire:before { + content: "\e50c"; +} +.fa-minus-square:before, +.fa-square-minus:before { + content: "\f146"; +} +.fa-helicopter:before { + content: "\f533"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-caret-square-down:before, +.fa-square-caret-down:before { + content: "\f150"; +} +.fa-file-circle-question:before { + content: "\e4ef"; +} +.fa-laptop-code:before { + content: "\f5fc"; +} +.fa-swatchbook:before { + content: "\f5c3"; +} +.fa-prescription-bottle:before { + content: "\f485"; +} +.fa-bars:before, +.fa-navicon:before { + content: "\f0c9"; +} +.fa-people-group:before { + content: "\e533"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-heart-broken:before, +.fa-heart-crack:before { + content: "\f7a9"; +} +.fa-external-link-square-alt:before, +.fa-square-up-right:before { + content: "\f360"; +} +.fa-face-kiss-beam:before, +.fa-kiss-beam:before { + content: "\f597"; +} +.fa-film:before { + content: "\f008"; +} +.fa-ruler-horizontal:before { + content: "\f547"; +} +.fa-people-robbery:before { + content: "\e536"; +} +.fa-lightbulb:before { + content: "\f0eb"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-circle-exclamation:before, +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-school-circle-xmark:before { + content: "\e56d"; +} +.fa-arrow-right-from-bracket:before, +.fa-sign-out:before { + content: "\f08b"; +} +.fa-chevron-circle-down:before, +.fa-circle-chevron-down:before { + content: "\f13a"; +} +.fa-unlock-alt:before, +.fa-unlock-keyhole:before { + content: "\f13e"; +} +.fa-cloud-showers-heavy:before { + content: "\f740"; +} +.fa-headphones-alt:before, +.fa-headphones-simple:before { + content: "\f58f"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-circle-dollar-to-slot:before, +.fa-donate:before { + content: "\f4b9"; +} +.fa-memory:before { + content: "\f538"; +} +.fa-road-spikes:before { + content: "\e568"; +} +.fa-fire-burner:before { + content: "\e4f1"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-hanukiah:before { + content: "\f6e6"; +} +.fa-feather:before { + content: "\f52d"; +} +.fa-volume-down:before, +.fa-volume-low:before { + content: "\f027"; +} +.fa-comment-slash:before { + content: "\f4b3"; +} +.fa-cloud-sun-rain:before { + content: "\f743"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-wheat-alt:before, +.fa-wheat-awn:before { + content: "\e2cd"; +} +.fa-ankh:before { + content: "\f644"; +} +.fa-hands-holding-child:before { + content: "\e4fa"; +} +.fa-asterisk:before { + content: "\2a"; +} +.fa-check-square:before, +.fa-square-check:before { + content: "\f14a"; +} +.fa-peseta-sign:before { + content: "\e221"; +} +.fa-header:before, +.fa-heading:before { + content: "\f1dc"; +} +.fa-ghost:before { + content: "\f6e2"; +} +.fa-list-squares:before, +.fa-list:before { + content: "\f03a"; +} +.fa-phone-square-alt:before, +.fa-square-phone-flip:before { + content: "\f87b"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-circle-dot:before, +.fa-dot-circle:before { + content: "\f192"; +} +.fa-dizzy:before, +.fa-face-dizzy:before { + content: "\f567"; +} +.fa-egg:before { + content: "\f7fb"; +} +.fa-house-medical-circle-xmark:before { + content: "\e513"; +} +.fa-campground:before { + content: "\f6bb"; +} +.fa-folder-plus:before { + content: "\f65e"; +} +.fa-futbol-ball:before, +.fa-futbol:before, +.fa-soccer-ball:before { + content: "\f1e3"; +} +.fa-paint-brush:before, +.fa-paintbrush:before { + content: "\f1fc"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-gas-pump:before { + content: "\f52f"; +} +.fa-hot-tub-person:before, +.fa-hot-tub:before { + content: "\f593"; +} +.fa-map-location:before, +.fa-map-marked:before { + content: "\f59f"; +} +.fa-house-flood-water:before { + content: "\e50e"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-bridge-lock:before { + content: "\e4cc"; +} +.fa-sack-dollar:before { + content: "\f81d"; +} +.fa-edit:before, +.fa-pen-to-square:before { + content: "\f044"; +} +.fa-car-side:before { + content: "\f5e4"; +} +.fa-share-alt:before, +.fa-share-nodes:before { + content: "\f1e0"; +} +.fa-heart-circle-minus:before { + content: "\e4ff"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-microscope:before { + content: "\f610"; +} +.fa-sink:before { + content: "\e06d"; +} +.fa-bag-shopping:before, +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-arrow-down-z-a:before, +.fa-sort-alpha-desc:before, +.fa-sort-alpha-down-alt:before { + content: "\f881"; +} +.fa-mitten:before { + content: "\f7b5"; +} +.fa-person-rays:before { + content: "\e54d"; +} +.fa-users:before { + content: "\f0c0"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-flask-vial:before { + content: "\e4f3"; +} +.fa-hand-paper:before, +.fa-hand:before { + content: "\f256"; +} +.fa-om:before { + content: "\f679"; +} +.fa-worm:before { + content: "\e599"; +} +.fa-house-circle-xmark:before { + content: "\e50b"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-hand-spock:before { + content: "\f259"; +} +.fa-stopwatch:before { + content: "\f2f2"; +} +.fa-face-kiss:before, +.fa-kiss:before { + content: "\f596"; +} +.fa-bridge-circle-xmark:before { + content: "\e4cb"; +} +.fa-face-grin-tongue:before, +.fa-grin-tongue:before { + content: "\f589"; +} +.fa-chess-bishop:before { + content: "\f43a"; +} +.fa-face-grin-wink:before, +.fa-grin-wink:before { + content: "\f58c"; +} +.fa-deaf:before, +.fa-deafness:before, +.fa-ear-deaf:before, +.fa-hard-of-hearing:before { + content: "\f2a4"; +} +.fa-road-circle-check:before { + content: "\e564"; +} +.fa-dice-five:before { + content: "\f523"; +} +.fa-rss-square:before, +.fa-square-rss:before { + content: "\f143"; +} +.fa-land-mine-on:before { + content: "\e51b"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-stamp:before { + content: "\f5bf"; +} +.fa-stairs:before { + content: "\e289"; +} +.fa-i:before { + content: "\49"; +} +.fa-hryvnia-sign:before, +.fa-hryvnia:before { + content: "\f6f2"; +} +.fa-pills:before { + content: "\f484"; +} +.fa-face-grin-wide:before, +.fa-grin-alt:before { + content: "\f581"; +} +.fa-tooth:before { + content: "\f5c9"; +} +.fa-v:before { + content: "\56"; +} +.fa-bangladeshi-taka-sign:before { + content: "\e2e6"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-rod-asclepius:before, +.fa-rod-snake:before, +.fa-staff-aesculapius:before, +.fa-staff-snake:before { + content: "\e579"; +} +.fa-head-side-cough-slash:before { + content: "\e062"; +} +.fa-ambulance:before, +.fa-truck-medical:before { + content: "\f0f9"; +} +.fa-wheat-awn-circle-exclamation:before { + content: "\e598"; +} +.fa-snowman:before { + content: "\f7d0"; +} +.fa-mortar-pestle:before { + content: "\f5a7"; +} +.fa-road-barrier:before { + content: "\e562"; +} +.fa-school:before { + content: "\f549"; +} +.fa-igloo:before { + content: "\f7ae"; +} +.fa-joint:before { + content: "\f595"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-horse:before { + content: "\f6f0"; +} +.fa-q:before { + content: "\51"; +} +.fa-g:before { + content: "\47"; +} +.fa-notes-medical:before { + content: "\f481"; +} +.fa-temperature-2:before, +.fa-temperature-half:before, +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-dong-sign:before { + content: "\e169"; +} +.fa-capsules:before { + content: "\f46b"; +} +.fa-poo-bolt:before, +.fa-poo-storm:before { + content: "\f75a"; +} +.fa-face-frown-open:before, +.fa-frown-open:before { + content: "\f57a"; +} +.fa-hand-point-up:before { + content: "\f0a6"; +} +.fa-money-bill:before { + content: "\f0d6"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-umbrella-beach:before { + content: "\f5ca"; +} +.fa-helmet-un:before { + content: "\e503"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-bacon:before { + content: "\f7e5"; +} +.fa-hand-point-down:before { + content: "\f0a7"; +} +.fa-arrow-up-from-bracket:before { + content: "\e09a"; +} +.fa-folder-blank:before, +.fa-folder:before { + content: "\f07b"; +} +.fa-file-medical-alt:before, +.fa-file-waveform:before { + content: "\f478"; +} +.fa-radiation:before { + content: "\f7b9"; +} +.fa-chart-simple:before { + content: "\e473"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-vial:before { + content: "\f492"; +} +.fa-dashboard:before, +.fa-gauge-med:before, +.fa-gauge:before, +.fa-tachometer-alt-average:before { + content: "\f624"; +} +.fa-magic-wand-sparkles:before, +.fa-wand-magic-sparkles:before { + content: "\e2ca"; +} +.fa-e:before { + content: "\45"; +} +.fa-pen-alt:before, +.fa-pen-clip:before { + content: "\f305"; +} +.fa-bridge-circle-exclamation:before { + content: "\e4ca"; +} +.fa-user:before { + content: "\f007"; +} +.fa-school-circle-check:before { + content: "\e56b"; +} +.fa-dumpster:before { + content: "\f793"; +} +.fa-shuttle-van:before, +.fa-van-shuttle:before { + content: "\f5b6"; +} +.fa-building-user:before { + content: "\e4da"; +} +.fa-caret-square-left:before, +.fa-square-caret-left:before { + content: "\f191"; +} +.fa-highlighter:before { + content: "\f591"; +} +.fa-key:before { + content: "\f084"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-synagogue:before { + content: "\f69b"; +} +.fa-person-half-dress:before { + content: "\e548"; +} +.fa-road-bridge:before { + content: "\e563"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-c:before { + content: "\43"; +} +.fa-tablet-button:before { + content: "\f10a"; +} +.fa-building-lock:before { + content: "\e4d6"; +} +.fa-pizza-slice:before { + content: "\f818"; +} +.fa-money-bill-wave:before { + content: "\f53a"; +} +.fa-area-chart:before, +.fa-chart-area:before { + content: "\f1fe"; +} +.fa-house-flag:before { + content: "\e50d"; +} +.fa-person-circle-minus:before { + content: "\e540"; +} +.fa-ban:before, +.fa-cancel:before { + content: "\f05e"; +} +.fa-camera-rotate:before { + content: "\e0d8"; +} +.fa-air-freshener:before, +.fa-spray-can-sparkles:before { + content: "\f5d0"; +} +.fa-star:before { + content: "\f005"; +} +.fa-repeat:before { + content: "\f363"; +} +.fa-cross:before { + content: "\f654"; +} +.fa-box:before { + content: "\f466"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-arrow-pointer:before, +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-expand-arrows-alt:before, +.fa-maximize:before { + content: "\f31e"; +} +.fa-charging-station:before { + content: "\f5e7"; +} +.fa-shapes:before, +.fa-triangle-circle-square:before { + content: "\f61f"; +} +.fa-random:before, +.fa-shuffle:before { + content: "\f074"; +} +.fa-person-running:before, +.fa-running:before { + content: "\f70c"; +} +.fa-mobile-retro:before { + content: "\e527"; +} +.fa-grip-lines-vertical:before { + content: "\f7a5"; +} +.fa-spider:before { + content: "\f717"; +} +.fa-hands-bound:before { + content: "\e4f9"; +} +.fa-file-invoice-dollar:before { + content: "\f571"; +} +.fa-plane-circle-exclamation:before { + content: "\e556"; +} +.fa-x-ray:before { + content: "\f497"; +} +.fa-spell-check:before { + content: "\f891"; +} +.fa-slash:before { + content: "\f715"; +} +.fa-computer-mouse:before, +.fa-mouse:before { + content: "\f8cc"; +} +.fa-arrow-right-to-bracket:before, +.fa-sign-in:before { + content: "\f090"; +} +.fa-shop-slash:before, +.fa-store-alt-slash:before { + content: "\e070"; +} +.fa-server:before { + content: "\f233"; +} +.fa-virus-covid-slash:before { + content: "\e4a9"; +} +.fa-shop-lock:before { + content: "\e4a5"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-blender-phone:before { + content: "\f6b6"; +} +.fa-building-wheat:before { + content: "\e4db"; +} +.fa-person-breastfeeding:before { + content: "\e53a"; +} +.fa-right-to-bracket:before, +.fa-sign-in-alt:before { + content: "\f2f6"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-passport:before { + content: "\f5ab"; +} +.fa-heart-pulse:before, +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-people-carry-box:before, +.fa-people-carry:before { + content: "\f4ce"; +} +.fa-temperature-high:before { + content: "\f769"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-crown:before { + content: "\f521"; +} +.fa-weight-hanging:before { + content: "\f5cd"; +} +.fa-xmarks-lines:before { + content: "\e59a"; +} +.fa-file-prescription:before { + content: "\f572"; +} +.fa-weight-scale:before, +.fa-weight:before { + content: "\f496"; +} +.fa-user-friends:before, +.fa-user-group:before { + content: "\f500"; +} +.fa-arrow-up-a-z:before, +.fa-sort-alpha-up:before { + content: "\f15e"; +} +.fa-chess-knight:before { + content: "\f441"; +} +.fa-face-laugh-squint:before, +.fa-laugh-squint:before { + content: "\f59b"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-arrow-circle-up:before, +.fa-circle-arrow-up:before { + content: "\f0aa"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-person-walking:before, +.fa-walking:before { + content: "\f554"; +} +.fa-l:before { + content: "\4c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-bed-pulse:before, +.fa-procedures:before { + content: "\f487"; +} +.fa-shuttle-space:before, +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-face-laugh:before, +.fa-laugh:before { + content: "\f599"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-heart-circle-plus:before { + content: "\e500"; +} +.fa-code-fork:before { + content: "\e13b"; +} +.fa-city:before { + content: "\f64f"; +} +.fa-microphone-alt:before, +.fa-microphone-lines:before { + content: "\f3c9"; +} +.fa-pepper-hot:before { + content: "\f816"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-colon-sign:before { + content: "\e140"; +} +.fa-headset:before { + content: "\f590"; +} +.fa-store-slash:before { + content: "\e071"; +} +.fa-road-circle-xmark:before { + content: "\e566"; +} +.fa-user-minus:before { + content: "\f503"; +} +.fa-mars-stroke-up:before, +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-champagne-glasses:before, +.fa-glass-cheers:before { + content: "\f79f"; +} +.fa-clipboard:before { + content: "\f328"; +} +.fa-house-circle-exclamation:before { + content: "\e50a"; +} +.fa-file-arrow-up:before, +.fa-file-upload:before { + content: "\f574"; +} +.fa-wifi-3:before, +.fa-wifi-strong:before, +.fa-wifi:before { + content: "\f1eb"; +} +.fa-bath:before, +.fa-bathtub:before { + content: "\f2cd"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-user-edit:before, +.fa-user-pen:before { + content: "\f4ff"; +} +.fa-signature:before { + content: "\f5b7"; +} +.fa-stroopwafel:before { + content: "\f551"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-anchor-lock:before { + content: "\e4ad"; +} +.fa-building-ngo:before { + content: "\e4d7"; +} +.fa-manat-sign:before { + content: "\e1d5"; +} +.fa-not-equal:before { + content: "\f53e"; +} +.fa-border-style:before, +.fa-border-top-left:before { + content: "\f853"; +} +.fa-map-location-dot:before, +.fa-map-marked-alt:before { + content: "\f5a0"; +} +.fa-jedi:before { + content: "\f669"; +} +.fa-poll:before, +.fa-square-poll-vertical:before { + content: "\f681"; +} +.fa-mug-hot:before { + content: "\f7b6"; +} +.fa-battery-car:before, +.fa-car-battery:before { + content: "\f5df"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-dice-two:before { + content: "\f528"; +} +.fa-chess-queen:before { + content: "\f445"; +} +.fa-glasses:before { + content: "\f530"; +} +.fa-chess-board:before { + content: "\f43c"; +} +.fa-building-circle-check:before { + content: "\e4d2"; +} +.fa-person-chalkboard:before { + content: "\e53d"; +} +.fa-mars-stroke-h:before, +.fa-mars-stroke-right:before { + content: "\f22b"; +} +.fa-hand-back-fist:before, +.fa-hand-rock:before { + content: "\f255"; +} +.fa-caret-square-up:before, +.fa-square-caret-up:before { + content: "\f151"; +} +.fa-cloud-showers-water:before { + content: "\e4e4"; +} +.fa-bar-chart:before, +.fa-chart-bar:before { + content: "\f080"; +} +.fa-hands-bubbles:before, +.fa-hands-wash:before { + content: "\e05e"; +} +.fa-less-than-equal:before { + content: "\f537"; +} +.fa-train:before { + content: "\f238"; +} +.fa-eye-low-vision:before, +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-crow:before { + content: "\f520"; +} +.fa-sailboat:before { + content: "\e445"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-plus-square:before, +.fa-square-plus:before { + content: "\f0fe"; +} +.fa-torii-gate:before { + content: "\f6a1"; +} +.fa-frog:before { + content: "\f52e"; +} +.fa-bucket:before { + content: "\e4cf"; +} +.fa-image:before { + content: "\f03e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-cow:before { + content: "\f6c8"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-screwdriver:before { + content: "\f54a"; +} +.fa-folder-closed:before { + content: "\e185"; +} +.fa-house-tsunami:before { + content: "\e515"; +} +.fa-square-nfi:before { + content: "\e576"; +} +.fa-arrow-up-from-ground-water:before { + content: "\e4b5"; +} +.fa-glass-martini-alt:before, +.fa-martini-glass:before { + content: "\f57b"; +} +.fa-rotate-back:before, +.fa-rotate-backward:before, +.fa-rotate-left:before, +.fa-undo-alt:before { + content: "\f2ea"; +} +.fa-columns:before, +.fa-table-columns:before { + content: "\f0db"; +} +.fa-lemon:before { + content: "\f094"; +} +.fa-head-side-mask:before { + content: "\e063"; +} +.fa-handshake:before { + content: "\f2b5"; +} +.fa-gem:before { + content: "\f3a5"; +} +.fa-dolly-box:before, +.fa-dolly:before { + content: "\f472"; +} +.fa-smoking:before { + content: "\f48d"; +} +.fa-compress-arrows-alt:before, +.fa-minimize:before { + content: "\f78c"; +} +.fa-monument:before { + content: "\f5a6"; +} +.fa-snowplow:before { + content: "\f7d2"; +} +.fa-angle-double-right:before, +.fa-angles-right:before { + content: "\f101"; +} +.fa-cannabis:before { + content: "\f55f"; +} +.fa-circle-play:before, +.fa-play-circle:before { + content: "\f144"; +} +.fa-tablets:before { + content: "\f490"; +} +.fa-ethernet:before { + content: "\f796"; +} +.fa-eur:before, +.fa-euro-sign:before, +.fa-euro:before { + content: "\f153"; +} +.fa-chair:before { + content: "\f6c0"; +} +.fa-check-circle:before, +.fa-circle-check:before { + content: "\f058"; +} +.fa-circle-stop:before, +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-compass-drafting:before, +.fa-drafting-compass:before { + content: "\f568"; +} +.fa-plate-wheat:before { + content: "\e55a"; +} +.fa-icicles:before { + content: "\f7ad"; +} +.fa-person-shelter:before { + content: "\e54f"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-marker:before { + content: "\f5a1"; +} +.fa-face-laugh-beam:before, +.fa-laugh-beam:before { + content: "\f59a"; +} +.fa-helicopter-symbol:before { + content: "\e502"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-chevron-circle-up:before, +.fa-circle-chevron-up:before { + content: "\f139"; +} +.fa-lari-sign:before { + content: "\e1c8"; +} +.fa-volcano:before { + content: "\f770"; +} +.fa-person-walking-dashed-line-arrow-right:before { + content: "\e553"; +} +.fa-gbp:before, +.fa-pound-sign:before, +.fa-sterling-sign:before { + content: "\f154"; +} +.fa-viruses:before { + content: "\e076"; +} +.fa-square-person-confined:before { + content: "\e577"; +} +.fa-user-tie:before { + content: "\f508"; +} +.fa-arrow-down-long:before, +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-tent-arrow-down-to-line:before { + content: "\e57e"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-person-skating:before, +.fa-skating:before { + content: "\f7c5"; +} +.fa-filter-circle-dollar:before, +.fa-funnel-dollar:before { + content: "\f662"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-arrow-circle-down:before, +.fa-circle-arrow-down:before { + content: "\f0ab"; +} +.fa-arrow-right-to-file:before, +.fa-file-import:before { + content: "\f56f"; +} +.fa-external-link-square:before, +.fa-square-arrow-up-right:before { + content: "\f14c"; +} +.fa-box-open:before { + content: "\f49e"; +} +.fa-scroll:before { + content: "\f70e"; +} +.fa-spa:before { + content: "\f5bb"; +} +.fa-location-pin-lock:before { + content: "\e51f"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-hill-avalanche:before { + content: "\e507"; +} +.fa-temperature-0:before, +.fa-temperature-empty:before, +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-address-card:before, +.fa-contact-card:before, +.fa-vcard:before { + content: "\f2bb"; +} +.fa-balance-scale-right:before, +.fa-scale-unbalanced-flip:before { + content: "\f516"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-diamond-turn-right:before, +.fa-directions:before { + content: "\f5eb"; +} +.fa-burst:before { + content: "\e4dc"; +} +.fa-house-laptop:before, +.fa-laptop-house:before { + content: "\e066"; +} +.fa-face-tired:before, +.fa-tired:before { + content: "\f5c8"; +} +.fa-money-bills:before { + content: "\e1f3"; +} +.fa-smog:before { + content: "\f75f"; +} +.fa-crutch:before { + content: "\f7f7"; +} +.fa-cloud-arrow-up:before, +.fa-cloud-upload-alt:before, +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-palette:before { + content: "\f53f"; +} +.fa-arrows-turn-right:before { + content: "\e4c0"; +} +.fa-vest:before { + content: "\e085"; +} +.fa-ferry:before { + content: "\e4ea"; +} +.fa-arrows-down-to-people:before { + content: "\e4b9"; +} +.fa-seedling:before, +.fa-sprout:before { + content: "\f4d8"; +} +.fa-arrows-alt-h:before, +.fa-left-right:before { + content: "\f337"; +} +.fa-boxes-packing:before { + content: "\e4c7"; +} +.fa-arrow-circle-left:before, +.fa-circle-arrow-left:before { + content: "\f0a8"; +} +.fa-group-arrows-rotate:before { + content: "\e4f6"; +} +.fa-bowl-food:before { + content: "\e4c6"; +} +.fa-candy-cane:before { + content: "\f786"; +} +.fa-arrow-down-wide-short:before, +.fa-sort-amount-asc:before, +.fa-sort-amount-down:before { + content: "\f160"; +} +.fa-cloud-bolt:before, +.fa-thunderstorm:before { + content: "\f76c"; +} +.fa-remove-format:before, +.fa-text-slash:before { + content: "\f87d"; +} +.fa-face-smile-wink:before, +.fa-smile-wink:before { + content: "\f4da"; +} +.fa-file-word:before { + content: "\f1c2"; +} +.fa-file-powerpoint:before { + content: "\f1c4"; +} +.fa-arrows-h:before, +.fa-arrows-left-right:before { + content: "\f07e"; +} +.fa-house-lock:before { + content: "\e510"; +} +.fa-cloud-arrow-down:before, +.fa-cloud-download-alt:before, +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-children:before { + content: "\e4e1"; +} +.fa-blackboard:before, +.fa-chalkboard:before { + content: "\f51b"; +} +.fa-user-alt-slash:before, +.fa-user-large-slash:before { + content: "\f4fa"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-handshake-alt-slash:before, +.fa-handshake-simple-slash:before { + content: "\e05f"; +} +.fa-mattress-pillow:before { + content: "\e525"; +} +.fa-guarani-sign:before { + content: "\e19a"; +} +.fa-arrows-rotate:before, +.fa-refresh:before, +.fa-sync:before { + content: "\f021"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-cruzeiro-sign:before { + content: "\e152"; +} +.fa-greater-than-equal:before { + content: "\f532"; +} +.fa-shield-alt:before, +.fa-shield-halved:before { + content: "\f3ed"; +} +.fa-atlas:before, +.fa-book-atlas:before { + content: "\f558"; +} +.fa-virus:before { + content: "\e074"; +} +.fa-envelope-circle-check:before { + content: "\e4e8"; +} +.fa-layer-group:before { + content: "\f5fd"; +} +.fa-arrows-to-dot:before { + content: "\e4be"; +} +.fa-archway:before { + content: "\f557"; +} +.fa-heart-circle-check:before { + content: "\e4fd"; +} +.fa-house-chimney-crack:before, +.fa-house-damage:before { + content: "\f6f1"; +} +.fa-file-archive:before, +.fa-file-zipper:before { + content: "\f1c6"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-glass-martini:before, +.fa-martini-glass-empty:before { + content: "\f000"; +} +.fa-couch:before { + content: "\f4b8"; +} +.fa-cedi-sign:before { + content: "\e0df"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-church:before { + content: "\f51d"; +} +.fa-comments-dollar:before { + content: "\f653"; +} +.fa-democrat:before { + content: "\f747"; +} +.fa-z:before { + content: "\5a"; +} +.fa-person-skiing:before, +.fa-skiing:before { + content: "\f7c9"; +} +.fa-road-lock:before { + content: "\e567"; +} +.fa-a:before { + content: "\41"; +} +.fa-temperature-arrow-down:before, +.fa-temperature-down:before { + content: "\e03f"; +} +.fa-feather-alt:before, +.fa-feather-pointed:before { + content: "\f56b"; +} +.fa-p:before { + content: "\50"; +} +.fa-snowflake:before { + content: "\f2dc"; +} +.fa-newspaper:before { + content: "\f1ea"; +} +.fa-ad:before, +.fa-rectangle-ad:before { + content: "\f641"; +} +.fa-arrow-circle-right:before, +.fa-circle-arrow-right:before { + content: "\f0a9"; +} +.fa-filter-circle-xmark:before { + content: "\e17b"; +} +.fa-locust:before { + content: "\e520"; +} +.fa-sort:before, +.fa-unsorted:before { + content: "\f0dc"; +} +.fa-list-1-2:before, +.fa-list-numeric:before, +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-person-dress-burst:before { + content: "\e544"; +} +.fa-money-check-alt:before, +.fa-money-check-dollar:before { + content: "\f53d"; +} +.fa-vector-square:before { + content: "\f5cb"; +} +.fa-bread-slice:before { + content: "\f7ec"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-face-kiss-wink-heart:before, +.fa-kiss-wink-heart:before { + content: "\f598"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-question:before { + content: "\3f"; +} +.fa-file-signature:before { + content: "\f573"; +} +.fa-arrows-alt:before, +.fa-up-down-left-right:before { + content: "\f0b2"; +} +.fa-house-chimney-user:before { + content: "\e065"; +} +.fa-hand-holding-heart:before { + content: "\f4be"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-money-check:before { + content: "\f53c"; +} +.fa-star-half-alt:before, +.fa-star-half-stroke:before { + content: "\f5c0"; +} +.fa-code:before { + content: "\f121"; +} +.fa-glass-whiskey:before, +.fa-whiskey-glass:before { + content: "\f7a0"; +} +.fa-building-circle-exclamation:before { + content: "\e4d3"; +} +.fa-magnifying-glass-chart:before { + content: "\e522"; +} +.fa-arrow-up-right-from-square:before, +.fa-external-link:before { + content: "\f08e"; +} +.fa-cubes-stacked:before { + content: "\e4e6"; +} +.fa-krw:before, +.fa-won-sign:before, +.fa-won:before { + content: "\f159"; +} +.fa-virus-covid:before { + content: "\e4a8"; +} +.fa-austral-sign:before { + content: "\e0a9"; +} +.fa-f:before { + content: "\46"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-road:before { + content: "\f018"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-person-circle-plus:before { + content: "\e541"; +} +.fa-chart-pie:before, +.fa-pie-chart:before { + content: "\f200"; +} +.fa-bolt-lightning:before { + content: "\e0b7"; +} +.fa-sack-xmark:before { + content: "\e56a"; +} +.fa-file-excel:before { + content: "\f1c3"; +} +.fa-file-contract:before { + content: "\f56c"; +} +.fa-fish-fins:before { + content: "\e4f2"; +} +.fa-building-flag:before { + content: "\e4d5"; +} +.fa-face-grin-beam:before, +.fa-grin-beam:before { + content: "\f582"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-poop:before { + content: "\f619"; +} +.fa-location-pin:before, +.fa-map-marker:before { + content: "\f041"; +} +.fa-kaaba:before { + content: "\f66b"; +} +.fa-toilet-paper:before { + content: "\f71e"; +} +.fa-hard-hat:before, +.fa-hat-hard:before, +.fa-helmet-safety:before { + content: "\f807"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-arrow-alt-circle-right:before, +.fa-circle-right:before { + content: "\f35a"; +} +.fa-plane-circle-check:before { + content: "\e555"; +} +.fa-face-rolling-eyes:before, +.fa-meh-rolling-eyes:before { + content: "\f5a5"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-chart-line:before, +.fa-line-chart:before { + content: "\f201"; +} +.fa-mask-ventilator:before { + content: "\e524"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-map-signs:before, +.fa-signs-post:before { + content: "\f277"; +} +.fa-cash-register:before { + content: "\f788"; +} +.fa-person-circle-question:before { + content: "\e542"; +} +.fa-h:before { + content: "\48"; +} +.fa-tarp:before { + content: "\e57b"; +} +.fa-screwdriver-wrench:before, +.fa-tools:before { + content: "\f7d9"; +} +.fa-arrows-to-eye:before { + content: "\e4bf"; +} +.fa-plug-circle-bolt:before { + content: "\e55b"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-mars-and-venus:before { + content: "\f224"; +} +.fa-home-user:before, +.fa-house-user:before { + content: "\e1b0"; +} +.fa-dumpster-fire:before { + content: "\f794"; +} +.fa-house-crack:before { + content: "\e3b1"; +} +.fa-cocktail:before, +.fa-martini-glass-citrus:before { + content: "\f561"; +} +.fa-face-surprise:before, +.fa-surprise:before { + content: "\f5c2"; +} +.fa-bottle-water:before { + content: "\e4c5"; +} +.fa-circle-pause:before, +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-toilet-paper-slash:before { + content: "\e072"; +} +.fa-apple-alt:before, +.fa-apple-whole:before { + content: "\f5d1"; +} +.fa-kitchen-set:before { + content: "\e51a"; +} +.fa-r:before { + content: "\52"; +} +.fa-temperature-1:before, +.fa-temperature-quarter:before, +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-bitcoin-sign:before { + content: "\e0b4"; +} +.fa-shield-dog:before { + content: "\e573"; +} +.fa-solar-panel:before { + content: "\f5ba"; +} +.fa-lock-open:before { + content: "\f3c1"; +} +.fa-elevator:before { + content: "\e16d"; +} +.fa-money-bill-transfer:before { + content: "\e528"; +} +.fa-money-bill-trend-up:before { + content: "\e529"; +} +.fa-house-flood-water-circle-arrow-right:before { + content: "\e50f"; +} +.fa-poll-h:before, +.fa-square-poll-horizontal:before { + content: "\f682"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-backward-fast:before, +.fa-fast-backward:before { + content: "\f049"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-user-astronaut:before { + content: "\f4fb"; +} +.fa-plane-slash:before { + content: "\e069"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-basketball-ball:before, +.fa-basketball:before { + content: "\f434"; +} +.fa-satellite-dish:before { + content: "\f7c0"; +} +.fa-arrow-alt-circle-up:before, +.fa-circle-up:before { + content: "\f35b"; +} +.fa-mobile-alt:before, +.fa-mobile-screen-button:before { + content: "\f3cd"; +} +.fa-volume-high:before, +.fa-volume-up:before { + content: "\f028"; +} +.fa-users-rays:before { + content: "\e593"; +} +.fa-wallet:before { + content: "\f555"; +} +.fa-clipboard-check:before { + content: "\f46c"; +} +.fa-file-audio:before { + content: "\f1c7"; +} +.fa-burger:before, +.fa-hamburger:before { + content: "\f805"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-bugs:before { + content: "\e4d0"; +} +.fa-rupee-sign:before, +.fa-rupee:before { + content: "\f156"; +} +.fa-file-image:before { + content: "\f1c5"; +} +.fa-circle-question:before, +.fa-question-circle:before { + content: "\f059"; +} +.fa-plane-departure:before { + content: "\f5b0"; +} +.fa-handshake-slash:before { + content: "\e060"; +} +.fa-book-bookmark:before { + content: "\e0bb"; +} +.fa-code-branch:before { + content: "\f126"; +} +.fa-hat-cowboy:before { + content: "\f8c0"; +} +.fa-bridge:before { + content: "\e4c8"; +} +.fa-phone-alt:before, +.fa-phone-flip:before { + content: "\f879"; +} +.fa-truck-front:before { + content: "\e2b7"; +} +.fa-cat:before { + content: "\f6be"; +} +.fa-anchor-circle-exclamation:before { + content: "\e4ab"; +} +.fa-truck-field:before { + content: "\e58d"; +} +.fa-route:before { + content: "\f4d7"; +} +.fa-clipboard-question:before { + content: "\e4e3"; +} +.fa-panorama:before { + content: "\e209"; +} +.fa-comment-medical:before { + content: "\f7f5"; +} +.fa-teeth-open:before { + content: "\f62f"; +} +.fa-file-circle-minus:before { + content: "\e4ed"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-wine-glass:before { + content: "\f4e3"; +} +.fa-fast-forward:before, +.fa-forward-fast:before { + content: "\f050"; +} +.fa-face-meh-blank:before, +.fa-meh-blank:before { + content: "\f5a4"; +} +.fa-parking:before, +.fa-square-parking:before { + content: "\f540"; +} +.fa-house-signal:before { + content: "\e012"; +} +.fa-bars-progress:before, +.fa-tasks-alt:before { + content: "\f828"; +} +.fa-faucet-drip:before { + content: "\e006"; +} +.fa-cart-flatbed:before, +.fa-dolly-flatbed:before { + content: "\f474"; +} +.fa-ban-smoking:before, +.fa-smoking-ban:before { + content: "\f54d"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-mobile-button:before { + content: "\f10b"; +} +.fa-house-medical-flag:before { + content: "\e514"; +} +.fa-basket-shopping:before, +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-tape:before { + content: "\f4db"; +} +.fa-bus-alt:before, +.fa-bus-simple:before { + content: "\f55e"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-face-sad-cry:before, +.fa-sad-cry:before { + content: "\f5b3"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-person-military-to-person:before { + content: "\e54c"; +} +.fa-file-shield:before { + content: "\e4f0"; +} +.fa-user-slash:before { + content: "\f506"; +} +.fa-pen:before { + content: "\f304"; +} +.fa-tower-observation:before { + content: "\e586"; +} +.fa-file-code:before { + content: "\f1c9"; +} +.fa-signal-5:before, +.fa-signal-perfect:before, +.fa-signal:before { + content: "\f012"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-heart-circle-xmark:before { + content: "\e501"; +} +.fa-home-lg:before, +.fa-house-chimney:before { + content: "\e3af"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-face-frown:before, +.fa-frown:before { + content: "\f119"; +} +.fa-prescription:before { + content: "\f5b1"; +} +.fa-shop:before, +.fa-store-alt:before { + content: "\f54f"; +} +.fa-floppy-disk:before, +.fa-save:before { + content: "\f0c7"; +} +.fa-vihara:before { + content: "\f6a7"; +} +.fa-balance-scale-left:before, +.fa-scale-unbalanced:before { + content: "\f515"; +} +.fa-sort-asc:before, +.fa-sort-up:before { + content: "\f0de"; +} +.fa-comment-dots:before, +.fa-commenting:before { + content: "\f4ad"; +} +.fa-plant-wilt:before { + content: "\e5aa"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-face-grin-squint:before, +.fa-grin-squint:before { + content: "\f585"; +} +.fa-hand-holding-dollar:before, +.fa-hand-holding-usd:before { + content: "\f4c0"; +} +.fa-bacterium:before { + content: "\e05a"; +} +.fa-hand-pointer:before { + content: "\f25a"; +} +.fa-drum-steelpan:before { + content: "\f56a"; +} +.fa-hand-scissors:before { + content: "\f257"; +} +.fa-hands-praying:before, +.fa-praying-hands:before { + content: "\f684"; +} +.fa-arrow-right-rotate:before, +.fa-arrow-rotate-forward:before, +.fa-arrow-rotate-right:before, +.fa-redo:before { + content: "\f01e"; +} +.fa-biohazard:before { + content: "\f780"; +} +.fa-location-crosshairs:before, +.fa-location:before { + content: "\f601"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-child-dress:before { + content: "\e59c"; +} +.fa-users-between-lines:before { + content: "\e591"; +} +.fa-lungs-virus:before { + content: "\e067"; +} +.fa-face-grin-tears:before, +.fa-grin-tears:before { + content: "\f588"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-calendar-times:before, +.fa-calendar-xmark:before { + content: "\f273"; +} +.fa-child-reaching:before { + content: "\e59d"; +} +.fa-head-side-virus:before { + content: "\e064"; +} +.fa-user-cog:before, +.fa-user-gear:before { + content: "\f4fe"; +} +.fa-arrow-up-1-9:before, +.fa-sort-numeric-up:before { + content: "\f163"; +} +.fa-door-closed:before { + content: "\f52a"; +} +.fa-shield-virus:before { + content: "\e06c"; +} +.fa-dice-six:before { + content: "\f526"; +} +.fa-mosquito-net:before { + content: "\e52c"; +} +.fa-bridge-water:before { + content: "\e4ce"; +} +.fa-person-booth:before { + content: "\f756"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-hat-wizard:before { + content: "\f6e8"; +} +.fa-pen-fancy:before { + content: "\f5ac"; +} +.fa-digging:before, +.fa-person-digging:before { + content: "\f85e"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-gauge-simple-med:before, +.fa-gauge-simple:before, +.fa-tachometer-average:before { + content: "\f629"; +} +.fa-book-medical:before { + content: "\f7e6"; +} +.fa-poo:before { + content: "\f2fe"; +} +.fa-quote-right-alt:before, +.fa-quote-right:before { + content: "\f10e"; +} +.fa-shirt:before, +.fa-t-shirt:before, +.fa-tshirt:before { + content: "\f553"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-divide:before { + content: "\f529"; +} +.fa-tenge-sign:before, +.fa-tenge:before { + content: "\f7d7"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-hands-holding:before { + content: "\f4c2"; +} +.fa-hands-clapping:before { + content: "\e1a8"; +} +.fa-republican:before { + content: "\f75e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-person-circle-xmark:before { + content: "\e543"; +} +.fa-ruler:before { + content: "\f545"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-dice-d6:before { + content: "\f6d1"; +} +.fa-restroom:before { + content: "\f7bd"; +} +.fa-j:before { + content: "\4a"; +} +.fa-users-viewfinder:before { + content: "\e595"; +} +.fa-file-video:before { + content: "\f1c8"; +} +.fa-external-link-alt:before, +.fa-up-right-from-square:before { + content: "\f35d"; +} +.fa-table-cells:before, +.fa-th:before { + content: "\f00a"; +} +.fa-file-pdf:before { + content: "\f1c1"; +} +.fa-bible:before, +.fa-book-bible:before { + content: "\f647"; +} +.fa-o:before { + content: "\4f"; +} +.fa-medkit:before, +.fa-suitcase-medical:before { + content: "\f0fa"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-otter:before { + content: "\f700"; +} +.fa-female:before, +.fa-person-dress:before { + content: "\f182"; +} +.fa-comment-dollar:before { + content: "\f651"; +} +.fa-briefcase-clock:before, +.fa-business-time:before { + content: "\f64a"; +} +.fa-table-cells-large:before, +.fa-th-large:before { + content: "\f009"; +} +.fa-book-tanakh:before, +.fa-tanakh:before { + content: "\f827"; +} +.fa-phone-volume:before, +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-hat-cowboy-side:before { + content: "\f8c1"; +} +.fa-clipboard-user:before { + content: "\f7f3"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-lira-sign:before { + content: "\f195"; +} +.fa-satellite:before { + content: "\f7bf"; +} +.fa-plane-lock:before { + content: "\e558"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-birthday-cake:before, +.fa-cake-candles:before, +.fa-cake:before { + content: "\f1fd"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-angle-double-up:before, +.fa-angles-up:before { + content: "\f102"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-arrow-right-to-city:before { + content: "\e4b3"; +} +.fa-ribbon:before { + content: "\f4d6"; +} +.fa-lungs:before { + content: "\f604"; +} +.fa-arrow-up-9-1:before, +.fa-sort-numeric-up-alt:before { + content: "\f887"; +} +.fa-litecoin-sign:before { + content: "\e1d3"; +} +.fa-border-none:before { + content: "\f850"; +} +.fa-circle-nodes:before { + content: "\e4e2"; +} +.fa-parachute-box:before { + content: "\f4cd"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-truck-field-un:before { + content: "\e58e"; +} +.fa-hourglass-empty:before, +.fa-hourglass:before { + content: "\f254"; +} +.fa-mountain:before { + content: "\f6fc"; +} +.fa-user-doctor:before, +.fa-user-md:before { + content: "\f0f0"; +} +.fa-circle-info:before, +.fa-info-circle:before { + content: "\f05a"; +} +.fa-cloud-meatball:before { + content: "\f73b"; +} +.fa-camera-alt:before, +.fa-camera:before { + content: "\f030"; +} +.fa-square-virus:before { + content: "\e578"; +} +.fa-meteor:before { + content: "\f753"; +} +.fa-car-on:before { + content: "\e4dd"; +} +.fa-sleigh:before { + content: "\f7cc"; +} +.fa-arrow-down-1-9:before, +.fa-sort-numeric-asc:before, +.fa-sort-numeric-down:before { + content: "\f162"; +} +.fa-hand-holding-droplet:before, +.fa-hand-holding-water:before { + content: "\f4c1"; +} +.fa-water:before { + content: "\f773"; +} +.fa-calendar-check:before { + content: "\f274"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-prescription-bottle-alt:before, +.fa-prescription-bottle-medical:before { + content: "\f486"; +} +.fa-landmark:before { + content: "\f66f"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-person-cane:before { + content: "\e53c"; +} +.fa-tent:before { + content: "\e57d"; +} +.fa-vest-patches:before { + content: "\e086"; +} +.fa-check-double:before { + content: "\f560"; +} +.fa-arrow-down-a-z:before, +.fa-sort-alpha-asc:before, +.fa-sort-alpha-down:before { + content: "\f15d"; +} +.fa-money-bill-wheat:before { + content: "\e52a"; +} +.fa-cookie:before { + content: "\f563"; +} +.fa-arrow-left-rotate:before, +.fa-arrow-rotate-back:before, +.fa-arrow-rotate-backward:before, +.fa-arrow-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-hard-drive:before, +.fa-hdd:before { + content: "\f0a0"; +} +.fa-face-grin-squint-tears:before, +.fa-grin-squint-tears:before { + content: "\f586"; +} +.fa-dumbbell:before { + content: "\f44b"; +} +.fa-list-alt:before, +.fa-rectangle-list:before { + content: "\f022"; +} +.fa-tarp-droplet:before { + content: "\e57c"; +} +.fa-house-medical-circle-check:before { + content: "\e511"; +} +.fa-person-skiing-nordic:before, +.fa-skiing-nordic:before { + content: "\f7ca"; +} +.fa-calendar-plus:before { + content: "\f271"; +} +.fa-plane-arrival:before { + content: "\f5af"; +} +.fa-arrow-alt-circle-left:before, +.fa-circle-left:before { + content: "\f359"; +} +.fa-subway:before, +.fa-train-subway:before { + content: "\f239"; +} +.fa-chart-gantt:before { + content: "\e0e4"; +} +.fa-indian-rupee-sign:before, +.fa-indian-rupee:before, +.fa-inr:before { + content: "\e1bc"; +} +.fa-crop-alt:before, +.fa-crop-simple:before { + content: "\f565"; +} +.fa-money-bill-1:before, +.fa-money-bill-alt:before { + content: "\f3d1"; +} +.fa-left-long:before, +.fa-long-arrow-alt-left:before { + content: "\f30a"; +} +.fa-dna:before { + content: "\f471"; +} +.fa-virus-slash:before { + content: "\e075"; +} +.fa-minus:before, +.fa-subtract:before { + content: "\f068"; +} +.fa-chess:before { + content: "\f439"; +} +.fa-arrow-left-long:before, +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-plug-circle-check:before { + content: "\e55c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-franc-sign:before { + content: "\e18f"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-american-sign-language-interpreting:before, +.fa-asl-interpreting:before, +.fa-hands-american-sign-language-interpreting:before, +.fa-hands-asl-interpreting:before { + content: "\f2a3"; +} +.fa-cog:before, +.fa-gear:before { + content: "\f013"; +} +.fa-droplet-slash:before, +.fa-tint-slash:before { + content: "\f5c7"; +} +.fa-mosque:before { + content: "\f678"; +} +.fa-mosquito:before { + content: "\e52b"; +} +.fa-star-of-david:before { + content: "\f69a"; +} +.fa-person-military-rifle:before { + content: "\e54b"; +} +.fa-cart-shopping:before, +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-vials:before { + content: "\f493"; +} +.fa-plug-circle-plus:before { + content: "\e55f"; +} +.fa-place-of-worship:before { + content: "\f67f"; +} +.fa-grip-vertical:before { + content: "\f58e"; +} +.fa-arrow-turn-up:before, +.fa-level-up:before { + content: "\f148"; +} +.fa-u:before { + content: "\55"; +} +.fa-square-root-alt:before, +.fa-square-root-variable:before { + content: "\f698"; +} +.fa-clock-four:before, +.fa-clock:before { + content: "\f017"; +} +.fa-backward-step:before, +.fa-step-backward:before { + content: "\f048"; +} +.fa-pallet:before { + content: "\f482"; +} +.fa-faucet:before { + content: "\e005"; +} +.fa-baseball-bat-ball:before { + content: "\f432"; +} +.fa-s:before { + content: "\53"; +} +.fa-timeline:before { + content: "\e29c"; +} +.fa-keyboard:before { + content: "\f11c"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-clinic-medical:before, +.fa-house-chimney-medical:before { + content: "\f7f2"; +} +.fa-temperature-3:before, +.fa-temperature-three-quarters:before, +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-mobile-android-alt:before, +.fa-mobile-screen:before { + content: "\f3cf"; +} +.fa-plane-up:before { + content: "\e22d"; +} +.fa-piggy-bank:before { + content: "\f4d3"; +} +.fa-battery-3:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-mountain-city:before { + content: "\e52e"; +} +.fa-coins:before { + content: "\f51e"; +} +.fa-khanda:before { + content: "\f66d"; +} +.fa-sliders-h:before, +.fa-sliders:before { + content: "\f1de"; +} +.fa-folder-tree:before { + content: "\f802"; +} +.fa-network-wired:before { + content: "\f6ff"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-hamsa:before { + content: "\f665"; +} +.fa-cent-sign:before { + content: "\e3f5"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-person-pregnant:before { + content: "\e31e"; +} +.fa-wand-sparkles:before { + content: "\f72b"; +} +.fa-ellipsis-v:before, +.fa-ellipsis-vertical:before { + content: "\f142"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-long-arrow-alt-right:before, +.fa-right-long:before { + content: "\f30b"; +} +.fa-flag-usa:before { + content: "\f74d"; +} +.fa-laptop-file:before { + content: "\e51d"; +} +.fa-teletype:before, +.fa-tty:before { + content: "\f1e4"; +} +.fa-diagram-next:before { + content: "\e476"; +} +.fa-person-rifle:before { + content: "\e54e"; +} +.fa-house-medical-circle-exclamation:before { + content: "\e512"; +} +.fa-closed-captioning:before { + content: "\f20a"; +} +.fa-hiking:before, +.fa-person-hiking:before { + content: "\f6ec"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-images:before { + content: "\f302"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-people-pulling:before { + content: "\e535"; +} +.fa-n:before { + content: "\4e"; +} +.fa-cable-car:before, +.fa-tram:before { + content: "\f7da"; +} +.fa-cloud-rain:before { + content: "\f73d"; +} +.fa-building-circle-xmark:before { + content: "\e4d4"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-arrows-down-to-line:before { + content: "\e4b8"; +} +.fa-download:before { + content: "\f019"; +} +.fa-face-grin:before, +.fa-grin:before { + content: "\f580"; +} +.fa-backspace:before, +.fa-delete-left:before { + content: "\f55a"; +} +.fa-eye-dropper-empty:before, +.fa-eye-dropper:before, +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-file-circle-check:before { + content: "\e5a0"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-mobile-android:before, +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f3ce"; +} +.fa-face-meh:before, +.fa-meh:before { + content: "\f11a"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-book-dead:before, +.fa-book-skull:before { + content: "\f6b7"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-heart-circle-exclamation:before { + content: "\e4fe"; +} +.fa-home-alt:before, +.fa-home-lg-alt:before, +.fa-home:before, +.fa-house:before { + content: "\f015"; +} +.fa-calendar-week:before { + content: "\f784"; +} +.fa-laptop-medical:before { + content: "\f812"; +} +.fa-b:before { + content: "\42"; +} +.fa-file-medical:before { + content: "\f477"; +} +.fa-dice-one:before { + content: "\f525"; +} +.fa-kiwi-bird:before { + content: "\f535"; +} +.fa-arrow-right-arrow-left:before, +.fa-exchange:before { + content: "\f0ec"; +} +.fa-redo-alt:before, +.fa-rotate-forward:before, +.fa-rotate-right:before { + content: "\f2f9"; +} +.fa-cutlery:before, +.fa-utensils:before { + content: "\f2e7"; +} +.fa-arrow-up-wide-short:before, +.fa-sort-amount-up:before { + content: "\f161"; +} +.fa-mill-sign:before { + content: "\e1ed"; +} +.fa-bowl-rice:before { + content: "\e2eb"; +} +.fa-skull:before { + content: "\f54c"; +} +.fa-broadcast-tower:before, +.fa-tower-broadcast:before { + content: "\f519"; +} +.fa-truck-pickup:before { + content: "\f63c"; +} +.fa-long-arrow-alt-up:before, +.fa-up-long:before { + content: "\f30c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-code-merge:before { + content: "\f387"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-hurricane:before { + content: "\f751"; +} +.fa-mound:before { + content: "\e52d"; +} +.fa-toilet-portable:before { + content: "\e583"; +} +.fa-compact-disc:before { + content: "\f51f"; +} +.fa-file-arrow-down:before, +.fa-file-download:before { + content: "\f56d"; +} +.fa-caravan:before { + content: "\f8ff"; +} +.fa-shield-cat:before { + content: "\e572"; +} +.fa-bolt:before, +.fa-zap:before { + content: "\f0e7"; +} +.fa-glass-water:before { + content: "\e4f4"; +} +.fa-oil-well:before { + content: "\e532"; +} +.fa-vault:before { + content: "\e2c5"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-toilet:before { + content: "\f7d8"; +} +.fa-plane-circle-xmark:before { + content: "\e557"; +} +.fa-cny:before, +.fa-jpy:before, +.fa-rmb:before, +.fa-yen-sign:before, +.fa-yen:before { + content: "\f157"; +} +.fa-rouble:before, +.fa-rub:before, +.fa-ruble-sign:before, +.fa-ruble:before { + content: "\f158"; +} +.fa-sun:before { + content: "\f185"; +} +.fa-guitar:before { + content: "\f7a6"; +} +.fa-face-laugh-wink:before, +.fa-laugh-wink:before { + content: "\f59c"; +} +.fa-horse-head:before { + content: "\f7ab"; +} +.fa-bore-hole:before { + content: "\e4c3"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-arrow-alt-circle-down:before, +.fa-circle-down:before { + content: "\f358"; +} +.fa-arrows-turn-to-dots:before { + content: "\e4c1"; +} +.fa-florin-sign:before { + content: "\e184"; +} +.fa-arrow-down-short-wide:before, +.fa-sort-amount-desc:before, +.fa-sort-amount-down-alt:before { + content: "\f884"; +} +.fa-less-than:before { + content: "\3c"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-car-tunnel:before { + content: "\e4de"; +} +.fa-head-side-cough:before { + content: "\e061"; +} +.fa-grip-lines:before { + content: "\f7a4"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-user-lock:before { + content: "\f502"; +} +.fa-arrow-right-long:before, +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-anchor-circle-xmark:before { + content: "\e4ac"; +} +.fa-ellipsis-h:before, +.fa-ellipsis:before { + content: "\f141"; +} +.fa-chess-pawn:before { + content: "\f443"; +} +.fa-first-aid:before, +.fa-kit-medical:before { + content: "\f479"; +} +.fa-person-through-window:before { + content: "\e5a9"; +} +.fa-toolbox:before { + content: "\f552"; +} +.fa-hands-holding-circle:before { + content: "\e4fb"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-credit-card-alt:before, +.fa-credit-card:before { + content: "\f09d"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-hand-holding-hand:before { + content: "\e4f7"; +} +.fa-book-open-reader:before, +.fa-book-reader:before { + content: "\f5da"; +} +.fa-mountain-sun:before { + content: "\e52f"; +} +.fa-arrows-left-right-to-line:before { + content: "\e4ba"; +} +.fa-dice-d20:before { + content: "\f6cf"; +} +.fa-truck-droplet:before { + content: "\e58c"; +} +.fa-file-circle-xmark:before { + content: "\e5a1"; +} +.fa-temperature-arrow-up:before, +.fa-temperature-up:before { + content: "\e040"; +} +.fa-medal:before { + content: "\f5a2"; +} +.fa-bed:before { + content: "\f236"; +} +.fa-h-square:before, +.fa-square-h:before { + content: "\f0fd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-temperature-4:before, +.fa-temperature-full:before, +.fa-thermometer-4:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-plug-circle-xmark:before { + content: "\e560"; +} +.fa-star-of-life:before { + content: "\f621"; +} +.fa-phone-slash:before { + content: "\f3dd"; +} +.fa-paint-roller:before { + content: "\f5aa"; +} +.fa-hands-helping:before, +.fa-handshake-angle:before { + content: "\f4c4"; +} +.fa-location-dot:before, +.fa-map-marker-alt:before { + content: "\f3c5"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-greater-than:before { + content: "\3e"; +} +.fa-person-swimming:before, +.fa-swimmer:before { + content: "\f5c4"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-droplet:before, +.fa-tint:before { + content: "\f043"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-earth-america:before, +.fa-earth-americas:before, +.fa-earth:before, +.fa-globe-americas:before { + content: "\f57d"; +} +.fa-person-burst:before { + content: "\e53b"; +} +.fa-dove:before { + content: "\f4ba"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-socks:before { + content: "\f696"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-section:before { + content: "\e447"; +} +.fa-gauge-high:before, +.fa-tachometer-alt-fast:before, +.fa-tachometer-alt:before { + content: "\f625"; +} +.fa-envelope-open-text:before { + content: "\f658"; +} +.fa-hospital-alt:before, +.fa-hospital-wide:before, +.fa-hospital:before { + content: "\f0f8"; +} +.fa-wine-bottle:before { + content: "\f72f"; +} +.fa-chess-rook:before { + content: "\f447"; +} +.fa-bars-staggered:before, +.fa-reorder:before, +.fa-stream:before { + content: "\f550"; +} +.fa-dharmachakra:before { + content: "\f655"; +} +.fa-hotdog:before { + content: "\f80f"; +} +.fa-blind:before, +.fa-person-walking-with-cane:before { + content: "\f29d"; +} +.fa-drum:before { + content: "\f569"; +} +.fa-ice-cream:before { + content: "\f810"; +} +.fa-heart-circle-bolt:before { + content: "\e4fc"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-check-to-slot:before, +.fa-vote-yea:before { + content: "\f772"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-boxes-alt:before, +.fa-boxes-stacked:before, +.fa-boxes:before { + content: "\f468"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-assistive-listening-systems:before, +.fa-ear-listen:before { + content: "\f2a2"; +} +.fa-tree-city:before { + content: "\e587"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-font:before { + content: "\f031"; +} +.fa-rupiah-sign:before { + content: "\e23d"; +} +.fa-magnifying-glass:before, +.fa-search:before { + content: "\f002"; +} +.fa-ping-pong-paddle-ball:before, +.fa-table-tennis-paddle-ball:before, +.fa-table-tennis:before { + content: "\f45d"; +} +.fa-diagnoses:before, +.fa-person-dots-from-line:before { + content: "\f470"; +} +.fa-trash-can-arrow-up:before, +.fa-trash-restore-alt:before { + content: "\f82a"; +} +.fa-naira-sign:before { + content: "\e1f6"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-walkie-talkie:before { + content: "\f8ef"; +} +.fa-file-edit:before, +.fa-file-pen:before { + content: "\f31c"; +} +.fa-receipt:before { + content: "\f543"; +} +.fa-pen-square:before, +.fa-pencil-square:before, +.fa-square-pen:before { + content: "\f14b"; +} +.fa-suitcase-rolling:before { + content: "\f5c1"; +} +.fa-person-circle-exclamation:before { + content: "\e53f"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-battery-5:before, +.fa-battery-full:before, +.fa-battery:before { + content: "\f240"; +} +.fa-skull-crossbones:before { + content: "\f714"; +} +.fa-code-compare:before { + content: "\e13a"; +} +.fa-list-dots:before, +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-school-lock:before { + content: "\e56f"; +} +.fa-tower-cell:before { + content: "\e585"; +} +.fa-down-long:before, +.fa-long-arrow-alt-down:before { + content: "\f309"; +} +.fa-ranking-star:before { + content: "\e561"; +} +.fa-chess-king:before { + content: "\f43f"; +} +.fa-person-harassing:before { + content: "\e549"; +} +.fa-brazilian-real-sign:before { + content: "\e46c"; +} +.fa-landmark-alt:before, +.fa-landmark-dome:before { + content: "\f752"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-television:before, +.fa-tv-alt:before, +.fa-tv:before { + content: "\f26c"; +} +.fa-shrimp:before { + content: "\e448"; +} +.fa-list-check:before, +.fa-tasks:before { + content: "\f0ae"; +} +.fa-jug-detergent:before { + content: "\e519"; +} +.fa-circle-user:before, +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-shield:before { + content: "\f505"; +} +.fa-wind:before { + content: "\f72e"; +} +.fa-car-burst:before, +.fa-car-crash:before { + content: "\f5e1"; +} +.fa-y:before { + content: "\59"; +} +.fa-person-snowboarding:before, +.fa-snowboarding:before { + content: "\f7ce"; +} +.fa-shipping-fast:before, +.fa-truck-fast:before { + content: "\f48b"; +} +.fa-fish:before { + content: "\f578"; +} +.fa-user-graduate:before { + content: "\f501"; +} +.fa-adjust:before, +.fa-circle-half-stroke:before { + content: "\f042"; +} +.fa-clapperboard:before { + content: "\e131"; +} +.fa-circle-radiation:before, +.fa-radiation-alt:before { + content: "\f7ba"; +} +.fa-baseball-ball:before, +.fa-baseball:before { + content: "\f433"; +} +.fa-jet-fighter-up:before { + content: "\e518"; +} +.fa-diagram-project:before, +.fa-project-diagram:before { + content: "\f542"; +} +.fa-copy:before { + content: "\f0c5"; +} +.fa-volume-mute:before, +.fa-volume-times:before, +.fa-volume-xmark:before { + content: "\f6a9"; +} +.fa-hand-sparkles:before { + content: "\e05d"; +} +.fa-grip-horizontal:before, +.fa-grip:before { + content: "\f58d"; +} +.fa-share-from-square:before, +.fa-share-square:before { + content: "\f14d"; +} +.fa-child-combatant:before, +.fa-child-rifle:before { + content: "\e4e0"; +} +.fa-gun:before { + content: "\e19b"; +} +.fa-phone-square:before, +.fa-square-phone:before { + content: "\f098"; +} +.fa-add:before, +.fa-plus:before { + content: "\2b"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-computer:before { + content: "\e4e5"; +} +.fa-close:before, +.fa-multiply:before, +.fa-remove:before, +.fa-times:before, +.fa-xmark:before { + content: "\f00d"; +} +.fa-arrows-up-down-left-right:before, +.fa-arrows:before { + content: "\f047"; +} +.fa-chalkboard-teacher:before, +.fa-chalkboard-user:before { + content: "\f51c"; +} +.fa-peso-sign:before { + content: "\e222"; +} +.fa-building-shield:before { + content: "\e4d8"; +} +.fa-baby:before { + content: "\f77c"; +} +.fa-users-line:before { + content: "\e592"; +} +.fa-quote-left-alt:before, +.fa-quote-left:before { + content: "\f10d"; +} +.fa-tractor:before { + content: "\f722"; +} +.fa-trash-arrow-up:before, +.fa-trash-restore:before { + content: "\f829"; +} +.fa-arrow-down-up-lock:before { + content: "\e4b0"; +} +.fa-lines-leaning:before { + content: "\e51e"; +} +.fa-ruler-combined:before { + content: "\f546"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-equals:before { + content: "\3d"; +} +.fa-blender:before { + content: "\f517"; +} +.fa-teeth:before { + content: "\f62e"; +} +.fa-ils:before, +.fa-shekel-sign:before, +.fa-shekel:before, +.fa-sheqel-sign:before, +.fa-sheqel:before { + content: "\f20b"; +} +.fa-map:before { + content: "\f279"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-photo-film:before, +.fa-photo-video:before { + content: "\f87c"; +} +.fa-folder-minus:before { + content: "\f65d"; +} +.fa-store:before { + content: "\f54e"; +} +.fa-arrow-trend-up:before { + content: "\e098"; +} +.fa-plug-circle-minus:before { + content: "\e55e"; +} +.fa-sign-hanging:before, +.fa-sign:before { + content: "\f4d9"; +} +.fa-bezier-curve:before { + content: "\f55b"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-tablet-android:before, +.fa-tablet:before { + content: "\f3fb"; +} +.fa-school-flag:before { + content: "\e56e"; +} +.fa-fill:before { + content: "\f575"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-drumstick-bite:before { + content: "\f6d7"; +} +.fa-holly-berry:before { + content: "\f7aa"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-bacteria:before { + content: "\e059"; +} +.fa-hand-lizard:before { + content: "\f258"; +} +.fa-notdef:before { + content: "\e1fe"; +} +.fa-disease:before { + content: "\f7fa"; +} +.fa-briefcase-medical:before { + content: "\f469"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-car-alt:before, +.fa-car-rear:before { + content: "\f5de"; +} +.fa-pump-soap:before { + content: "\e06b"; +} +.fa-video-slash:before { + content: "\f4e2"; +} +.fa-battery-2:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-radio:before { + content: "\f8d7"; +} +.fa-baby-carriage:before, +.fa-carriage-baby:before { + content: "\f77d"; +} +.fa-traffic-light:before { + content: "\f637"; +} +.fa-thermometer:before { + content: "\f491"; +} +.fa-vr-cardboard:before { + content: "\f729"; +} +.fa-hand-middle-finger:before { + content: "\f806"; +} +.fa-percent:before, +.fa-percentage:before { + content: "\25"; +} +.fa-truck-moving:before { + content: "\f4df"; +} +.fa-glass-water-droplet:before { + content: "\e4f5"; +} +.fa-display:before { + content: "\e163"; +} +.fa-face-smile:before, +.fa-smile:before { + content: "\f118"; +} +.fa-thumb-tack:before, +.fa-thumbtack:before { + content: "\f08d"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-person-praying:before, +.fa-pray:before { + content: "\f683"; +} +.fa-hammer:before { + content: "\f6e3"; +} +.fa-hand-peace:before { + content: "\f25b"; +} +.fa-rotate:before, +.fa-sync-alt:before { + content: "\f2f1"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-robot:before { + content: "\f544"; +} +.fa-peace:before { + content: "\f67c"; +} +.fa-cogs:before, +.fa-gears:before { + content: "\f085"; +} +.fa-warehouse:before { + content: "\f494"; +} +.fa-arrow-up-right-dots:before { + content: "\e4b7"; +} +.fa-splotch:before { + content: "\f5bc"; +} +.fa-face-grin-hearts:before, +.fa-grin-hearts:before { + content: "\f584"; +} +.fa-dice-four:before { + content: "\f524"; +} +.fa-sim-card:before { + content: "\f7c4"; +} +.fa-transgender-alt:before, +.fa-transgender:before { + content: "\f225"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-arrow-turn-down:before, +.fa-level-down:before { + content: "\f149"; +} +.fa-person-falling-burst:before { + content: "\e547"; +} +.fa-award:before { + content: "\f559"; +} +.fa-ticket-alt:before, +.fa-ticket-simple:before { + content: "\f3ff"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-angle-double-left:before, +.fa-angles-left:before { + content: "\f100"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-clock-rotate-left:before, +.fa-history:before { + content: "\f1da"; +} +.fa-face-grin-beam-sweat:before, +.fa-grin-beam-sweat:before { + content: "\f583"; +} +.fa-arrow-right-from-file:before, +.fa-file-export:before { + content: "\f56e"; +} +.fa-shield-blank:before, +.fa-shield:before { + content: "\f132"; +} +.fa-arrow-up-short-wide:before, +.fa-sort-amount-up-alt:before { + content: "\f885"; +} +.fa-house-medical:before { + content: "\e3b2"; +} +.fa-golf-ball-tee:before, +.fa-golf-ball:before { + content: "\f450"; +} +.fa-chevron-circle-left:before, +.fa-circle-chevron-left:before { + content: "\f137"; +} +.fa-house-chimney-window:before { + content: "\e00d"; +} +.fa-pen-nib:before { + content: "\f5ad"; +} +.fa-tent-arrow-turn-left:before { + content: "\e580"; +} +.fa-tents:before { + content: "\e582"; +} +.fa-magic:before, +.fa-wand-magic:before { + content: "\f0d0"; +} +.fa-dog:before { + content: "\f6d3"; +} +.fa-carrot:before { + content: "\f787"; +} +.fa-moon:before { + content: "\f186"; +} +.fa-wine-glass-alt:before, +.fa-wine-glass-empty:before { + content: "\f5ce"; +} +.fa-cheese:before { + content: "\f7ef"; +} +.fa-yin-yang:before { + content: "\f6ad"; +} +.fa-music:before { + content: "\f001"; +} +.fa-code-commit:before { + content: "\f386"; +} +.fa-temperature-low:before { + content: "\f76b"; +} +.fa-biking:before, +.fa-person-biking:before { + content: "\f84a"; +} +.fa-broom:before { + content: "\f51a"; +} +.fa-shield-heart:before { + content: "\e574"; +} +.fa-gopuram:before { + content: "\f664"; +} +.fa-earth-oceania:before, +.fa-globe-oceania:before { + content: "\e47b"; +} +.fa-square-xmark:before, +.fa-times-square:before, +.fa-xmark-square:before { + content: "\f2d3"; +} +.fa-hashtag:before { + content: "\23"; +} +.fa-expand-alt:before, +.fa-up-right-and-down-left-from-center:before { + content: "\f424"; +} +.fa-oil-can:before { + content: "\f613"; +} +.fa-t:before { + content: "\54"; +} +.fa-hippo:before { + content: "\f6ed"; +} +.fa-chart-column:before { + content: "\e0e3"; +} +.fa-infinity:before { + content: "\f534"; +} +.fa-vial-circle-check:before { + content: "\e596"; +} +.fa-person-arrow-down-to-line:before { + content: "\e538"; +} +.fa-voicemail:before { + content: "\f897"; +} +.fa-fan:before { + content: "\f863"; +} +.fa-person-walking-luggage:before { + content: "\e554"; +} +.fa-arrows-alt-v:before, +.fa-up-down:before { + content: "\f338"; +} +.fa-cloud-moon-rain:before { + content: "\f73c"; +} +.fa-calendar:before { + content: "\f133"; +} +.fa-trailer:before { + content: "\e041"; +} +.fa-bahai:before, +.fa-haykal:before { + content: "\f666"; +} +.fa-sd-card:before { + content: "\f7c2"; +} +.fa-dragon:before { + content: "\f6d5"; +} +.fa-shoe-prints:before { + content: "\f54b"; +} +.fa-circle-plus:before, +.fa-plus-circle:before { + content: "\f055"; +} +.fa-face-grin-tongue-wink:before, +.fa-grin-tongue-wink:before { + content: "\f58b"; +} +.fa-hand-holding:before { + content: "\f4bd"; +} +.fa-plug-circle-exclamation:before { + content: "\e55d"; +} +.fa-chain-broken:before, +.fa-chain-slash:before, +.fa-link-slash:before, +.fa-unlink:before { + content: "\f127"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-person-walking-arrow-loop-left:before { + content: "\e551"; +} +.fa-arrow-up-z-a:before, +.fa-sort-alpha-up-alt:before { + content: "\f882"; +} +.fa-fire-alt:before, +.fa-fire-flame-curved:before { + content: "\f7e4"; +} +.fa-tornado:before { + content: "\f76f"; +} +.fa-file-circle-plus:before { + content: "\e494"; +} +.fa-book-quran:before, +.fa-quran:before { + content: "\f687"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-border-all:before { + content: "\f84c"; +} +.fa-angry:before, +.fa-face-angry:before { + content: "\f556"; +} +.fa-cookie-bite:before { + content: "\f564"; +} +.fa-arrow-trend-down:before { + content: "\e097"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-draw-polygon:before { + content: "\f5ee"; +} +.fa-balance-scale:before, +.fa-scale-balanced:before { + content: "\f24e"; +} +.fa-gauge-simple-high:before, +.fa-tachometer-fast:before, +.fa-tachometer:before { + content: "\f62a"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-desktop-alt:before, +.fa-desktop:before { + content: "\f390"; +} +.fa-m:before { + content: "\4d"; +} +.fa-table-list:before, +.fa-th-list:before { + content: "\f00b"; +} +.fa-comment-sms:before, +.fa-sms:before { + content: "\f7cd"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-battery-4:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-house-circle-check:before { + content: "\e509"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-diagram-successor:before { + content: "\e47a"; +} +.fa-truck-arrow-right:before { + content: "\e58b"; +} +.fa-arrows-split-up-and-left:before { + content: "\e4bc"; +} +.fa-fist-raised:before, +.fa-hand-fist:before { + content: "\f6de"; +} +.fa-cloud-moon:before { + content: "\f6c3"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-person-falling:before { + content: "\e546"; +} +.fa-image-portrait:before, +.fa-portrait:before { + content: "\f3e0"; +} +.fa-user-tag:before { + content: "\f507"; +} +.fa-rug:before { + content: "\e569"; +} +.fa-earth-europe:before, +.fa-globe-europe:before { + content: "\f7a2"; +} +.fa-cart-flatbed-suitcase:before, +.fa-luggage-cart:before { + content: "\f59d"; +} +.fa-rectangle-times:before, +.fa-rectangle-xmark:before, +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f410"; +} +.fa-baht-sign:before { + content: "\e0ac"; +} +.fa-book-open:before { + content: "\f518"; +} +.fa-book-journal-whills:before, +.fa-journal-whills:before { + content: "\f66a"; +} +.fa-handcuffs:before { + content: "\e4f8"; +} +.fa-exclamation-triangle:before, +.fa-triangle-exclamation:before, +.fa-warning:before { + content: "\f071"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-bottle-droplet:before { + content: "\e4c4"; +} +.fa-mask-face:before { + content: "\e1d7"; +} +.fa-hill-rockslide:before { + content: "\e508"; +} +.fa-exchange-alt:before, +.fa-right-left:before { + content: "\f362"; +} +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-road-circle-exclamation:before { + content: "\e565"; +} +.fa-dungeon:before { + content: "\f6d9"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-money-bill-1-wave:before, +.fa-money-bill-wave-alt:before { + content: "\f53b"; +} +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-hands:before, +.fa-sign-language:before, +.fa-signing:before { + content: "\f2a7"; +} +.fa-calendar-day:before { + content: "\f783"; +} +.fa-ladder-water:before, +.fa-swimming-pool:before, +.fa-water-ladder:before { + content: "\f5c5"; +} +.fa-arrows-up-down:before, +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-face-grimace:before, +.fa-grimace:before { + content: "\f57f"; +} +.fa-wheelchair-alt:before, +.fa-wheelchair-move:before { + content: "\e2ce"; +} +.fa-level-down-alt:before, +.fa-turn-down:before { + content: "\f3be"; +} +.fa-person-walking-arrow-right:before { + content: "\e552"; +} +.fa-envelope-square:before, +.fa-square-envelope:before { + content: "\f199"; +} +.fa-dice:before { + content: "\f522"; +} +.fa-bowling-ball:before { + content: "\f436"; +} +.fa-brain:before { + content: "\f5dc"; +} +.fa-band-aid:before, +.fa-bandage:before { + content: "\f462"; +} +.fa-calendar-minus:before { + content: "\f272"; +} +.fa-circle-xmark:before, +.fa-times-circle:before, +.fa-xmark-circle:before { + content: "\f057"; +} +.fa-gifts:before { + content: "\f79c"; +} +.fa-hotel:before { + content: "\f594"; +} +.fa-earth-asia:before, +.fa-globe-asia:before { + content: "\f57e"; +} +.fa-id-card-alt:before, +.fa-id-card-clip:before { + content: "\f47f"; +} +.fa-magnifying-glass-plus:before, +.fa-search-plus:before { + content: "\f00e"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-user-clock:before { + content: "\f4fd"; +} +.fa-allergies:before, +.fa-hand-dots:before { + content: "\f461"; +} +.fa-file-invoice:before { + content: "\f570"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-coffee:before, +.fa-mug-saucer:before { + content: "\f0f4"; +} +.fa-brush:before { + content: "\f55d"; +} +.fa-mask:before { + content: "\f6fa"; +} +.fa-magnifying-glass-minus:before, +.fa-search-minus:before { + content: "\f010"; +} +.fa-ruler-vertical:before { + content: "\f548"; +} +.fa-user-alt:before, +.fa-user-large:before { + content: "\f406"; +} +.fa-train-tram:before { + content: "\e5b4"; +} +.fa-user-nurse:before { + content: "\f82f"; +} +.fa-syringe:before { + content: "\f48e"; +} +.fa-cloud-sun:before { + content: "\f6c4"; +} +.fa-stopwatch-20:before { + content: "\e06f"; +} +.fa-square-full:before { + content: "\f45c"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-jar:before { + content: "\e516"; +} +.fa-note-sticky:before, +.fa-sticky-note:before { + content: "\f249"; +} +.fa-bug-slash:before { + content: "\e490"; +} +.fa-arrow-up-from-water-pump:before { + content: "\e4b6"; +} +.fa-bone:before { + content: "\f5d7"; +} +.fa-user-injured:before { + content: "\f728"; +} +.fa-face-sad-tear:before, +.fa-sad-tear:before { + content: "\f5b4"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-tent-arrows-down:before { + content: "\e581"; +} +.fa-exclamation:before { + content: "\21"; +} +.fa-arrows-spin:before { + content: "\e4bb"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-try:before, +.fa-turkish-lira-sign:before, +.fa-turkish-lira:before { + content: "\e2bb"; +} +.fa-dollar-sign:before, +.fa-dollar:before, +.fa-usd:before { + content: "\24"; +} +.fa-x:before { + content: "\58"; +} +.fa-magnifying-glass-dollar:before, +.fa-search-dollar:before { + content: "\f688"; +} +.fa-users-cog:before, +.fa-users-gear:before { + content: "\f509"; +} +.fa-person-military-pointing:before { + content: "\e54a"; +} +.fa-bank:before, +.fa-building-columns:before, +.fa-institution:before, +.fa-museum:before, +.fa-university:before { + content: "\f19c"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-trowel:before { + content: "\e589"; +} +.fa-d:before { + content: "\44"; +} +.fa-stapler:before { + content: "\e5af"; +} +.fa-masks-theater:before, +.fa-theater-masks:before { + content: "\f630"; +} +.fa-kip-sign:before { + content: "\e1c4"; +} +.fa-hand-point-left:before { + content: "\f0a5"; +} +.fa-handshake-alt:before, +.fa-handshake-simple:before { + content: "\f4c6"; +} +.fa-fighter-jet:before, +.fa-jet-fighter:before { + content: "\f0fb"; +} +.fa-share-alt-square:before, +.fa-square-share-nodes:before { + content: "\f1e1"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-plus-minus:before { + content: "\e43c"; +} +.fa-video-camera:before, +.fa-video:before { + content: "\f03d"; +} +.fa-graduation-cap:before, +.fa-mortar-board:before { + content: "\f19d"; +} +.fa-hand-holding-medical:before { + content: "\e05c"; +} +.fa-person-circle-check:before { + content: "\e53e"; +} +.fa-level-up-alt:before, +.fa-turn-up:before { + content: "\f3bf"; +} +.fa-sr-only, +.fa-sr-only-focusable:not(:focus), +.sr-only, +.sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} +:host, +:root { + --fa-style-family-brands: "Font Awesome 6 Brands"; + --fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands"; +} +@font-face { + font-family: "Font Awesome 6 Brands"; + font-style: normal; + font-weight: 400; + font-display: block; + src: url(../webfonts/fa-brands-400.woff2) format("woff2"), + url(../webfonts/fa-brands-400.ttf) format("truetype"); +} +.fa-brands, +.fab { + font-weight: 400; +} +.fa-monero:before { + content: "\f3d0"; +} +.fa-hooli:before { + content: "\f427"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-shopware:before { + content: "\f5b5"; +} +.fa-creative-commons-nc:before { + content: "\f4e8"; +} +.fa-aws:before { + content: "\f375"; +} +.fa-redhat:before { + content: "\f7bc"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-cloudflare:before { + content: "\e07d"; +} +.fa-ups:before { + content: "\f7e0"; +} +.fa-pixiv:before { + content: "\e640"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-dyalog:before { + content: "\f399"; +} +.fa-bity:before { + content: "\f37a"; +} +.fa-stackpath:before { + content: "\f842"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-guilded:before { + content: "\e07e"; +} +.fa-vnv:before { + content: "\f40b"; +} +.fa-js-square:before, +.fa-square-js:before { + content: "\f3b9"; +} +.fa-microsoft:before { + content: "\f3ca"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-orcid:before { + content: "\f8d2"; +} +.fa-java:before { + content: "\f4e4"; +} +.fa-invision:before { + content: "\f7b0"; +} +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; +} +.fa-centercode:before { + content: "\f380"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-hire-a-helper:before { + content: "\f3b0"; +} +.fa-creative-commons-by:before { + content: "\f4e7"; +} +.fa-unity:before { + content: "\e049"; +} +.fa-whmcs:before { + content: "\f40d"; +} +.fa-rocketchat:before { + content: "\f3e8"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-untappd:before { + content: "\f405"; +} +.fa-mailchimp:before { + content: "\f59e"; +} +.fa-css3-alt:before { + content: "\f38b"; +} +.fa-reddit-square:before, +.fa-square-reddit:before { + content: "\f1a2"; +} +.fa-vimeo-v:before { + content: "\f27d"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-square-font-awesome:before { + content: "\e5ad"; +} +.fa-deskpro:before { + content: "\f38f"; +} +.fa-brave:before { + content: "\e63c"; +} +.fa-sistrix:before { + content: "\f3ee"; +} +.fa-instagram-square:before, +.fa-square-instagram:before { + content: "\e055"; +} +.fa-battle-net:before { + content: "\f835"; +} +.fa-the-red-yeti:before { + content: "\f69d"; +} +.fa-hacker-news-square:before, +.fa-square-hacker-news:before { + content: "\f3af"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-threads:before { + content: "\e618"; +} +.fa-napster:before { + content: "\f3d2"; +} +.fa-snapchat-square:before, +.fa-square-snapchat:before { + content: "\f2ad"; +} +.fa-google-plus-g:before { + content: "\f0d5"; +} +.fa-artstation:before { + content: "\f77a"; +} +.fa-markdown:before { + content: "\f60f"; +} +.fa-sourcetree:before { + content: "\f7d3"; +} +.fa-google-plus:before { + content: "\f2b3"; +} +.fa-diaspora:before { + content: "\f791"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-phoenix-squadron:before { + content: "\f511"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-algolia:before { + content: "\f36c"; +} +.fa-red-river:before { + content: "\f3e3"; +} +.fa-creative-commons-sa:before { + content: "\f4ef"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-font-awesome-alt:before, +.fa-square-font-awesome-stroke:before { + content: "\f35c"; +} +.fa-atlassian:before { + content: "\f77b"; +} +.fa-linkedin-in:before { + content: "\f0e1"; +} +.fa-digital-ocean:before { + content: "\f391"; +} +.fa-nimblr:before { + content: "\f5a8"; +} +.fa-chromecast:before { + content: "\f838"; +} +.fa-evernote:before { + content: "\f839"; +} +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-creative-commons-sampling:before { + content: "\f4f0"; +} +.fa-adversal:before { + content: "\f36a"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-watchman-monitoring:before { + content: "\e087"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-weixin:before { + content: "\f1d7"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-git-alt:before { + content: "\f841"; +} +.fa-lyft:before { + content: "\f3c3"; +} +.fa-rev:before { + content: "\f5b2"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-wizards-of-the-coast:before { + content: "\f730"; +} +.fa-square-viadeo:before, +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.fa-centos:before { + content: "\f789"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-cloudsmith:before { + content: "\f384"; +} +.fa-opensuse:before { + content: "\e62b"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-dribbble-square:before, +.fa-square-dribbble:before { + content: "\f397"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-node:before { + content: "\f419"; +} +.fa-mix:before { + content: "\f3cb"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-cc-apple-pay:before { + content: "\f416"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-debian:before { + content: "\e60b"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-instalod:before { + content: "\e081"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-sellcast:before { + content: "\f2da"; +} +.fa-square-twitter:before, +.fa-twitter-square:before { + content: "\f081"; +} +.fa-r-project:before { + content: "\f4f7"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-freebsd:before { + content: "\f3a4"; +} +.fa-vuejs:before { + content: "\f41f"; +} +.fa-accusoft:before { + content: "\f369"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-fonticons-fi:before { + content: "\f3a2"; +} +.fa-app-store:before { + content: "\f36f"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-itunes-note:before { + content: "\f3b5"; +} +.fa-golang:before { + content: "\e40f"; +} +.fa-kickstarter:before { + content: "\f3bb"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-uncharted:before { + content: "\e084"; +} +.fa-firstdraft:before { + content: "\f3a1"; +} +.fa-square-youtube:before, +.fa-youtube-square:before { + content: "\f431"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-rendact:before, +.fa-wpressr:before { + content: "\f3e4"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-galactic-republic:before { + content: "\f50c"; +} +.fa-nfc-directional:before { + content: "\e530"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-joget:before { + content: "\f3b7"; +} +.fa-fedora:before { + content: "\f798"; +} +.fa-stripe-s:before { + content: "\f42a"; +} +.fa-meta:before { + content: "\e49b"; +} +.fa-laravel:before { + content: "\f3bd"; +} +.fa-hotjar:before { + content: "\f3b1"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-square-letterboxd:before { + content: "\e62e"; +} +.fa-sticker-mule:before { + content: "\f3f7"; +} +.fa-creative-commons-zero:before { + content: "\f4f3"; +} +.fa-hips:before { + content: "\f452"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-discord:before { + content: "\f392"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-app-store-ios:before { + content: "\f370"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-confluence:before { + content: "\f78d"; +} +.fa-shoelace:before { + content: "\e60c"; +} +.fa-mdb:before { + content: "\f8ca"; +} +.fa-dochub:before { + content: "\f394"; +} +.fa-accessible-icon:before { + content: "\f368"; +} +.fa-ebay:before { + content: "\f4f4"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-unsplash:before { + content: "\e07c"; +} +.fa-yarn:before { + content: "\f7e3"; +} +.fa-square-steam:before, +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-square-vimeo:before, +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-asymmetrik:before { + content: "\f372"; +} +.fa-font-awesome-flag:before, +.fa-font-awesome-logo-full:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-gratipay:before { + content: "\f184"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-hive:before { + content: "\e07f"; +} +.fa-gitkraken:before { + content: "\f3a6"; +} +.fa-keybase:before { + content: "\f4f5"; +} +.fa-apple-pay:before { + content: "\f415"; +} +.fa-padlet:before { + content: "\e4a0"; +} +.fa-amazon-pay:before { + content: "\f42c"; +} +.fa-github-square:before, +.fa-square-github:before { + content: "\f092"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-fedex:before { + content: "\f797"; +} +.fa-phoenix-framework:before { + content: "\f3dc"; +} +.fa-shopify:before { + content: "\e057"; +} +.fa-neos:before { + content: "\f612"; +} +.fa-square-threads:before { + content: "\e619"; +} +.fa-hackerrank:before { + content: "\f5f7"; +} +.fa-researchgate:before { + content: "\f4f8"; +} +.fa-swift:before { + content: "\f8e1"; +} +.fa-angular:before { + content: "\f420"; +} +.fa-speakap:before { + content: "\f3f3"; +} +.fa-angrycreative:before { + content: "\f36e"; +} +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-empire:before { + content: "\f1d1"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-google-scholar:before { + content: "\e63b"; +} +.fa-gitlab-square:before, +.fa-square-gitlab:before { + content: "\e5ae"; +} +.fa-studiovinari:before { + content: "\f3f8"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-goodreads:before { + content: "\f3a8"; +} +.fa-odnoklassniki-square:before, +.fa-square-odnoklassniki:before { + content: "\f264"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-sith:before { + content: "\f512"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-page4:before { + content: "\f3d7"; +} +.fa-hashnode:before { + content: "\e499"; +} +.fa-react:before { + content: "\f41b"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-squarespace:before { + content: "\f5be"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-creative-commons-share:before { + content: "\f4f2"; +} +.fa-bitcoin:before { + content: "\f379"; +} +.fa-keycdn:before { + content: "\f3ba"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-itch-io:before { + content: "\f83a"; +} +.fa-umbraco:before { + content: "\f8e8"; +} +.fa-galactic-senate:before { + content: "\f50d"; +} +.fa-ubuntu:before { + content: "\f7df"; +} +.fa-draft2digital:before { + content: "\f396"; +} +.fa-stripe:before { + content: "\f429"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-dhl:before { + content: "\f790"; +} +.fa-pinterest-square:before, +.fa-square-pinterest:before { + content: "\f0d3"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-blackberry:before { + content: "\f37b"; +} +.fa-creative-commons-pd:before { + content: "\f4ec"; +} +.fa-playstation:before { + content: "\f3df"; +} +.fa-quinscape:before { + content: "\f459"; +} +.fa-less:before { + content: "\f41d"; +} +.fa-blogger-b:before { + content: "\f37d"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-signal-messenger:before { + content: "\e663"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-typo3:before { + content: "\f42b"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-dailymotion:before { + content: "\e052"; +} +.fa-affiliatetheme:before { + content: "\f36b"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-bootstrap:before { + content: "\f836"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-nfc-symbol:before { + content: "\e531"; +} +.fa-mintbit:before { + content: "\e62f"; +} +.fa-ethereum:before { + content: "\f42e"; +} +.fa-speaker-deck:before { + content: "\f83c"; +} +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; +} +.fa-patreon:before { + content: "\f3d9"; +} +.fa-avianex:before { + content: "\f374"; +} +.fa-ello:before { + content: "\f5f1"; +} +.fa-gofore:before { + content: "\f3a7"; +} +.fa-bimobject:before { + content: "\f378"; +} +.fa-brave-reverse:before { + content: "\e63d"; +} +.fa-facebook-f:before { + content: "\f39e"; +} +.fa-google-plus-square:before, +.fa-square-google-plus:before { + content: "\f0d4"; +} +.fa-mandalorian:before { + content: "\f50f"; +} +.fa-first-order-alt:before { + content: "\f50a"; +} +.fa-osi:before { + content: "\f41a"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-d-and-d-beyond:before { + content: "\f6ca"; +} +.fa-periscope:before { + content: "\f3da"; +} +.fa-fulcrum:before { + content: "\f50b"; +} +.fa-cloudscale:before { + content: "\f383"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-mizuni:before { + content: "\f3cc"; +} +.fa-schlix:before { + content: "\f3ea"; +} +.fa-square-xing:before, +.fa-xing-square:before { + content: "\f169"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-cloudversify:before { + content: "\f385"; +} +.fa-usps:before { + content: "\f7e1"; +} +.fa-megaport:before { + content: "\f5a3"; +} +.fa-magento:before { + content: "\f3c4"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-fly:before { + content: "\f417"; +} +.fa-aviato:before { + content: "\f421"; +} +.fa-itunes:before { + content: "\f3b4"; +} +.fa-cuttlefish:before { + content: "\f38c"; +} +.fa-blogger:before { + content: "\f37c"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-viber:before { + content: "\f409"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-letterboxd:before { + content: "\e62d"; +} +.fa-symfony:before { + content: "\f83d"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-facebook-messenger:before { + content: "\f39f"; +} +.fa-audible:before { + content: "\f373"; +} +.fa-think-peaks:before { + content: "\f731"; +} +.fa-bilibili:before { + content: "\e3d9"; +} +.fa-erlang:before { + content: "\f39d"; +} +.fa-x-twitter:before { + content: "\e61b"; +} +.fa-cotton-bureau:before { + content: "\f89e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-42-group:before, +.fa-innosoft:before { + content: "\e080"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-elementor:before { + content: "\f430"; +} +.fa-pied-piper-square:before, +.fa-square-pied-piper:before { + content: "\e01e"; +} +.fa-creative-commons-nd:before { + content: "\f4eb"; +} +.fa-palfed:before { + content: "\f3d8"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-resolving:before { + content: "\f3e7"; +} +.fa-xbox:before { + content: "\f412"; +} +.fa-searchengin:before { + content: "\f3eb"; +} +.fa-tiktok:before { + content: "\e07b"; +} +.fa-facebook-square:before, +.fa-square-facebook:before { + content: "\f082"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-linkedin:before { + content: "\f08c"; +} +.fa-hubspot:before { + content: "\f3b2"; +} +.fa-deploydog:before { + content: "\f38e"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-mixer:before { + content: "\e056"; +} +.fa-lastfm-square:before, +.fa-square-lastfm:before { + content: "\f203"; +} +.fa-vimeo:before { + content: "\f40a"; +} +.fa-mendeley:before { + content: "\f7b3"; +} +.fa-uniregistry:before { + content: "\f404"; +} +.fa-figma:before { + content: "\f799"; +} +.fa-creative-commons-remix:before { + content: "\f4ee"; +} +.fa-cc-amazon-pay:before { + content: "\f42d"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-cmplid:before { + content: "\e360"; +} +.fa-upwork:before { + content: "\e641"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-gripfire:before { + content: "\f3ac"; +} +.fa-jedi-order:before { + content: "\f50e"; +} +.fa-uikit:before { + content: "\f403"; +} +.fa-fort-awesome-alt:before { + content: "\f3a3"; +} +.fa-phabricator:before { + content: "\f3db"; +} +.fa-ussunnah:before { + content: "\f407"; +} +.fa-earlybirds:before { + content: "\f39a"; +} +.fa-trade-federation:before { + content: "\f513"; +} +.fa-autoprefixer:before { + content: "\f41c"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-google-play:before { + content: "\f3ab"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-line:before { + content: "\f3c0"; +} +.fa-google-drive:before { + content: "\f3aa"; +} +.fa-servicestack:before { + content: "\f3ec"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-deezer:before { + content: "\e077"; +} +.fa-raspberry-pi:before { + content: "\f7bb"; +} +.fa-jira:before { + content: "\f7b1"; +} +.fa-docker:before { + content: "\f395"; +} +.fa-screenpal:before { + content: "\e570"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-gitter:before { + content: "\f426"; +} +.fa-d-and-d:before { + content: "\f38d"; +} +.fa-microblog:before { + content: "\e01a"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-pied-piper-hat:before { + content: "\f4e5"; +} +.fa-kickstarter-k:before { + content: "\f3bc"; +} +.fa-yandex:before { + content: "\f413"; +} +.fa-readme:before { + content: "\f4d5"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-sass:before { + content: "\f41e"; +} +.fa-wirsindhandwerk:before, +.fa-wsh:before { + content: "\e2d0"; +} +.fa-buromobelexperte:before { + content: "\f37f"; +} +.fa-salesforce:before { + content: "\f83b"; +} +.fa-octopus-deploy:before { + content: "\e082"; +} +.fa-medapps:before { + content: "\f3c6"; +} +.fa-ns8:before { + content: "\f3d5"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-apper:before { + content: "\f371"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-waze:before { + content: "\f83f"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-snapchat-ghost:before, +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-fantasy-flight-games:before { + content: "\f6dc"; +} +.fa-rust:before { + content: "\e07a"; +} +.fa-wix:before { + content: "\f5cf"; +} +.fa-behance-square:before, +.fa-square-behance:before { + content: "\f1b5"; +} +.fa-supple:before { + content: "\f3f9"; +} +.fa-webflow:before { + content: "\e65c"; +} +.fa-rebel:before { + content: "\f1d0"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-staylinked:before { + content: "\f3f5"; +} +.fa-kaggle:before { + content: "\f5fa"; +} +.fa-space-awesome:before { + content: "\e5ac"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-cpanel:before { + content: "\f388"; +} +.fa-goodreads-g:before { + content: "\f3a9"; +} +.fa-git-square:before, +.fa-square-git:before { + content: "\f1d2"; +} +.fa-square-tumblr:before, +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-perbyte:before { + content: "\e083"; +} +.fa-grunt:before { + content: "\f3ad"; +} +.fa-weebly:before { + content: "\f5cc"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-themeco:before { + content: "\f5c6"; +} +.fa-python:before { + content: "\f3e2"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-bots:before { + content: "\e340"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-hornbill:before { + content: "\f592"; +} +.fa-js:before { + content: "\f3b8"; +} +.fa-ideal:before { + content: "\e013"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-dev:before { + content: "\f6cc"; +} +.fa-sketch:before { + content: "\f7c6"; +} +.fa-yandex-international:before { + content: "\f414"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-uber:before { + content: "\f402"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-php:before { + content: "\f457"; +} +.fa-alipay:before { + content: "\f642"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-firefox-browser:before { + content: "\e007"; +} +.fa-replyd:before { + content: "\f3e6"; +} +.fa-suse:before { + content: "\f7d6"; +} +.fa-jenkins:before { + content: "\f3b6"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-rockrms:before { + content: "\f3e9"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-buffer:before { + content: "\f837"; +} +.fa-npm:before { + content: "\f3d4"; +} +.fa-yammer:before { + content: "\f840"; +} +.fa-btc:before { + content: "\f15a"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-stubber:before { + content: "\e5c7"; +} +.fa-telegram-plane:before, +.fa-telegram:before { + content: "\f2c6"; +} +.fa-old-republic:before { + content: "\f510"; +} +.fa-odysee:before { + content: "\e5c6"; +} +.fa-square-whatsapp:before, +.fa-whatsapp-square:before { + content: "\f40c"; +} +.fa-node-js:before { + content: "\f3d3"; +} +.fa-edge-legacy:before { + content: "\e078"; +} +.fa-slack-hash:before, +.fa-slack:before { + content: "\f198"; +} +.fa-medrt:before { + content: "\f3c8"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-vaadin:before { + content: "\f408"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-square-x-twitter:before { + content: "\e61a"; +} +.fa-reacteurope:before { + content: "\f75d"; +} +.fa-medium-m:before, +.fa-medium:before { + content: "\f23a"; +} +.fa-amilia:before { + content: "\f36d"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-flipboard:before { + content: "\f44d"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-critical-role:before { + content: "\f6c9"; +} +.fa-sitrox:before { + content: "\e44a"; +} +.fa-discourse:before { + content: "\f393"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-mastodon:before { + content: "\f4f6"; +} +.fa-airbnb:before { + content: "\f834"; +} +.fa-wolf-pack-battalion:before { + content: "\f514"; +} +.fa-buy-n-large:before { + content: "\f8a6"; +} +.fa-gulp:before { + content: "\f3ae"; +} +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; +} +.fa-strava:before { + content: "\f428"; +} +.fa-ember:before { + content: "\f423"; +} +.fa-canadian-maple-leaf:before { + content: "\f785"; +} +.fa-teamspeak:before { + content: "\f4f9"; +} +.fa-pushed:before { + content: "\f3e1"; +} +.fa-wordpress-simple:before { + content: "\f411"; +} +.fa-nutritionix:before { + content: "\f3d6"; +} +.fa-wodu:before { + content: "\e088"; +} +.fa-google-pay:before { + content: "\e079"; +} +.fa-intercom:before { + content: "\f7af"; +} +.fa-zhihu:before { + content: "\f63f"; +} +.fa-korvue:before { + content: "\f42f"; +} +.fa-pix:before { + content: "\e43a"; +} +.fa-steam-symbol:before { + content: "\f3f6"; +} +:host, +:root { + --fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free"; +} +@font-face { + font-family: "Font Awesome 6 Free"; + font-style: normal; + font-weight: 400; + font-display: block; + src: url(../webfonts/fa-regular-400.woff2) format("woff2"), + url(../webfonts/fa-regular-400.ttf) format("truetype"); +} +.fa-regular, +.far { + font-weight: 400; +} +:host, +:root { + --fa-style-family-classic: "Font Awesome 6 Free"; + --fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free"; +} +@font-face { + font-family: "Font Awesome 6 Free"; + font-style: normal; + font-weight: 900; + font-display: block; + src: url(../webfonts/fa-solid-900.woff2) format("woff2"), + url(../webfonts/fa-solid-900.ttf) format("truetype"); +} +.fa-solid, +.fas { + font-weight: 900; +} +@font-face { + font-family: "Font Awesome 5 Brands"; + font-display: block; + font-weight: 400; + src: url(../webfonts/fa-brands-400.woff2) format("woff2"), + url(../webfonts/fa-brands-400.ttf) format("truetype"); +} +@font-face { + font-family: "Font Awesome 5 Free"; + font-display: block; + font-weight: 900; + src: url(../webfonts/fa-solid-900.woff2) format("woff2"), + url(../webfonts/fa-solid-900.ttf) format("truetype"); +} +@font-face { + font-family: "Font Awesome 5 Free"; + font-display: block; + font-weight: 400; + src: url(../webfonts/fa-regular-400.woff2) format("woff2"), + url(../webfonts/fa-regular-400.ttf) format("truetype"); +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-solid-900.woff2) format("woff2"), + url(../webfonts/fa-solid-900.ttf) format("truetype"); +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-brands-400.woff2) format("woff2"), + url(../webfonts/fa-brands-400.ttf) format("truetype"); +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-regular-400.woff2) format("woff2"), + url(../webfonts/fa-regular-400.ttf) format("truetype"); + unicode-range: u+f003, u+f006, u+f014, u+f016-f017, u+f01a-f01b, u+f01d, + u+f022, u+f03e, u+f044, u+f046, u+f05c-f05d, u+f06e, u+f070, u+f087-f088, + u+f08a, u+f094, u+f096-f097, u+f09d, u+f0a0, u+f0a2, u+f0a4-f0a7, u+f0c5, + u+f0c7, u+f0e5-f0e6, u+f0eb, u+f0f6-f0f8, u+f10c, u+f114-f115, u+f118-f11a, + u+f11c-f11d, u+f133, u+f147, u+f14e, u+f150-f152, u+f185-f186, u+f18e, + u+f190-f192, u+f196, u+f1c1-f1c9, u+f1d9, u+f1db, u+f1e3, u+f1ea, u+f1f7, + u+f1f9, u+f20a, u+f247-f248, u+f24a, u+f24d, u+f255-f25b, u+f25d, + u+f271-f274, u+f278, u+f27b, u+f28c, u+f28e, u+f29c, u+f2b5, u+f2b7, u+f2ba, + u+f2bc, u+f2be, u+f2c0-f2c1, u+f2c3, u+f2d0, u+f2d2, u+f2d4, u+f2dc; +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-v4compatibility.woff2) format("woff2"), + url(../webfonts/fa-v4compatibility.ttf) format("truetype"); + unicode-range: u+f041, u+f047, u+f065-f066, u+f07d-f07e, u+f080, u+f08b, + u+f08e, u+f090, u+f09a, u+f0ac, u+f0ae, u+f0b2, u+f0d0, u+f0d6, u+f0e4, + u+f0ec, u+f10a-f10b, u+f123, u+f13e, u+f148-f149, u+f14c, u+f156, u+f15e, + u+f160-f161, u+f163, u+f175-f178, u+f195, u+f1f8, u+f219, u+f27a; +} diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-brands-400.ttf b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..5efb1d4 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-brands-400.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-brands-400.woff2 b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..36fbda7 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-brands-400.woff2 differ diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-regular-400.ttf b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..838b4e2 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-regular-400.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-regular-400.woff2 b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..b6cabba Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-regular-400.woff2 differ diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-solid-900.ttf b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..ec24749 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-solid-900.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-solid-900.woff2 b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..824d518 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-solid-900.woff2 differ diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-v4compatibility.ttf b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-v4compatibility.ttf new file mode 100644 index 0000000..b175aa8 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-v4compatibility.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.1/webfonts/fa-v4compatibility.woff2 b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 0000000..e09b5a5 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.1/webfonts/fa-v4compatibility.woff2 differ diff --git a/src/main/webapp/font-awesome-6.5.2/css/all.min.css b/src/main/webapp/font-awesome-6.5.2/css/all.min.css new file mode 100644 index 0000000..3e2ce1c --- /dev/null +++ b/src/main/webapp/font-awesome-6.5.2/css/all.min.css @@ -0,0 +1,7023 @@ +/*! + * Font Awesome Free 6.5.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) + * Copyright 2024 Fonticons, Inc. + */ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Free"); + font-weight: var(--fa-style, 900); +} +.fa, +.fa-brands, +.fa-classic, +.fa-regular, +.fa-sharp, +.fa-solid, +.fab, +.far, +.fas { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; +} +.fa-classic, +.fa-regular, +.fa-solid, +.far, +.fas { + font-family: "Font Awesome 6 Free"; +} +.fa-brands, +.fab { + font-family: "Font Awesome 6 Brands"; +} +.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-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; +} +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; +} +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; +} +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; +} +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; +} +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; +} +.fa-fw { + text-align: center; + width: 1.25em; +} +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; +} +.fa-ul > li { + position: relative; +} +.fa-li { + left: calc(var(--fa-li-width, 2em) * -1); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; +} +.fa-border { + border-radius: var(--fa-border-radius, 0.1em); + border: var(--fa-border-width, 0.08em) var(--fa-border-style, solid) + var(--fa-border-color, #eee); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); +} +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); +} +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); +} +.fa-beat { + -webkit-animation-name: fa-beat; + animation-name: fa-beat; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); +} +.fa-bounce { + -webkit-animation-name: fa-bounce; + animation-name: fa-bounce; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.28, 0.84, 0.42, 1) + ); + animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.28, 0.84, 0.42, 1) + ); +} +.fa-fade { + -webkit-animation-name: fa-fade; + animation-name: fa-fade; + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); + animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); +} +.fa-beat-fade, +.fa-fade { + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); +} +.fa-beat-fade { + -webkit-animation-name: fa-beat-fade; + animation-name: fa-beat-fade; + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); + animation-timing-function: var( + --fa-animation-timing, + cubic-bezier(0.4, 0, 0.6, 1) + ); +} +.fa-flip { + -webkit-animation-name: fa-flip; + animation-name: fa-flip; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); +} +.fa-shake { + -webkit-animation-name: fa-shake; + animation-name: fa-shake; + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); +} +.fa-shake, +.fa-spin { + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); +} +.fa-spin { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-duration: var(--fa-animation-duration, 2s); + animation-duration: var(--fa-animation-duration, 2s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); +} +.fa-spin-reverse { + --fa-animation-direction: reverse; +} +.fa-pulse, +.fa-spin-pulse { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var( + --fa-animation-iteration-count, + infinite + ); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); + animation-timing-function: var(--fa-animation-timing, steps(8)); +} +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-beat-fade, + .fa-bounce, + .fa-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + -webkit-animation-delay: -1ms; + animation-delay: -1ms; + -webkit-animation-duration: 1ms; + animation-duration: 1ms; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-transition-delay: 0s; + transition-delay: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; + } +} +@-webkit-keyframes fa-beat { + 0%, + 90% { + -webkit-transform: scale(1); + transform: scale(1); + } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); + } +} +@keyframes fa-beat { + 0%, + 90% { + -webkit-transform: scale(1); + transform: scale(1); + } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); + } +} +@-webkit-keyframes fa-bounce { + 0% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + 10% { + -webkit-transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + } + 30% { + -webkit-transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + } + 50% { + -webkit-transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + } + 57% { + -webkit-transform: scale(1) + translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1) translateY(var(--fa-bounce-rebound, -0.125em)); + } + 64% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + to { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } +} +@keyframes fa-bounce { + 0% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + 10% { + -webkit-transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + transform: scale( + var(--fa-bounce-start-scale-x, 1.1), + var(--fa-bounce-start-scale-y, 0.9) + ) + translateY(0); + } + 30% { + -webkit-transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + transform: scale( + var(--fa-bounce-jump-scale-x, 0.9), + var(--fa-bounce-jump-scale-y, 1.1) + ) + translateY(var(--fa-bounce-height, -0.5em)); + } + 50% { + -webkit-transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + transform: scale( + var(--fa-bounce-land-scale-x, 1.05), + var(--fa-bounce-land-scale-y, 0.95) + ) + translateY(0); + } + 57% { + -webkit-transform: scale(1) + translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1) translateY(var(--fa-bounce-rebound, -0.125em)); + } + 64% { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } + to { + -webkit-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); + } +} +@-webkit-keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); + } +} +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); + } +} +@-webkit-keyframes fa-beat-fade { + 0%, + to { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); + } +} +@keyframes fa-beat-fade { + 0%, + to { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); + } +} +@-webkit-keyframes fa-flip { + 50% { + -webkit-transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + } +} +@keyframes fa-flip { + 50% { + -webkit-transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + transform: rotate3d( + var(--fa-flip-x, 0), + var(--fa-flip-y, 1), + var(--fa-flip-z, 0), + var(--fa-flip-angle, -180deg) + ); + } +} +@-webkit-keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); + } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + 8%, + 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); + } + 12%, + 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); + } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); + } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); + } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); + } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); + } + 40%, + to { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); + } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + 8%, + 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); + } + 12%, + 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); + } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); + } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); + } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); + } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); + } + 40%, + to { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +.fa-rotate-90 { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); +} +.fa-flip-vertical { + -webkit-transform: scaleY(-1); + transform: scaleY(-1); +} +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + -webkit-transform: scale(-1); + transform: scale(-1); +} +.fa-rotate-by { + -webkit-transform: rotate(var(--fa-rotate-angle, 0)); + transform: rotate(var(--fa-rotate-angle, 0)); +} +.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%; + z-index: var(--fa-stack-z-index, auto); +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: var(--fa-inverse, #fff); +} + +.fa-0:before { + content: "\30"; +} +.fa-1:before { + content: "\31"; +} +.fa-2:before { + content: "\32"; +} +.fa-3:before { + content: "\33"; +} +.fa-4:before { + content: "\34"; +} +.fa-5:before { + content: "\35"; +} +.fa-6:before { + content: "\36"; +} +.fa-7:before { + content: "\37"; +} +.fa-8:before { + content: "\38"; +} +.fa-9:before { + content: "\39"; +} +.fa-fill-drip:before { + content: "\f576"; +} +.fa-arrows-to-circle:before { + content: "\e4bd"; +} +.fa-chevron-circle-right:before, +.fa-circle-chevron-right:before { + content: "\f138"; +} +.fa-at:before { + content: "\40"; +} +.fa-trash-alt:before, +.fa-trash-can:before { + content: "\f2ed"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-user-times:before, +.fa-user-xmark:before { + content: "\f235"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-comment-alt:before, +.fa-message:before { + content: "\f27a"; +} +.fa-info:before { + content: "\f129"; +} +.fa-compress-alt:before, +.fa-down-left-and-up-right-to-center:before { + content: "\f422"; +} +.fa-explosion:before { + content: "\e4e9"; +} +.fa-file-alt:before, +.fa-file-lines:before, +.fa-file-text:before { + content: "\f15c"; +} +.fa-wave-square:before { + content: "\f83e"; +} +.fa-ring:before { + content: "\f70b"; +} +.fa-building-un:before { + content: "\e4d9"; +} +.fa-dice-three:before { + content: "\f527"; +} +.fa-calendar-alt:before, +.fa-calendar-days:before { + content: "\f073"; +} +.fa-anchor-circle-check:before { + content: "\e4aa"; +} +.fa-building-circle-arrow-right:before { + content: "\e4d1"; +} +.fa-volleyball-ball:before, +.fa-volleyball:before { + content: "\f45f"; +} +.fa-arrows-up-to-line:before { + content: "\e4c2"; +} +.fa-sort-desc:before, +.fa-sort-down:before { + content: "\f0dd"; +} +.fa-circle-minus:before, +.fa-minus-circle:before { + content: "\f056"; +} +.fa-door-open:before { + content: "\f52b"; +} +.fa-right-from-bracket:before, +.fa-sign-out-alt:before { + content: "\f2f5"; +} +.fa-atom:before { + content: "\f5d2"; +} +.fa-soap:before { + content: "\e06e"; +} +.fa-heart-music-camera-bolt:before, +.fa-icons:before { + content: "\f86d"; +} +.fa-microphone-alt-slash:before, +.fa-microphone-lines-slash:before { + content: "\f539"; +} +.fa-bridge-circle-check:before { + content: "\e4c9"; +} +.fa-pump-medical:before { + content: "\e06a"; +} +.fa-fingerprint:before { + content: "\f577"; +} +.fa-hand-point-right:before { + content: "\f0a4"; +} +.fa-magnifying-glass-location:before, +.fa-search-location:before { + content: "\f689"; +} +.fa-forward-step:before, +.fa-step-forward:before { + content: "\f051"; +} +.fa-face-smile-beam:before, +.fa-smile-beam:before { + content: "\f5b8"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-football-ball:before, +.fa-football:before { + content: "\f44e"; +} +.fa-school-circle-exclamation:before { + content: "\e56c"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-angle-double-down:before, +.fa-angles-down:before { + content: "\f103"; +} +.fa-users-rectangle:before { + content: "\e594"; +} +.fa-people-roof:before { + content: "\e537"; +} +.fa-people-line:before { + content: "\e534"; +} +.fa-beer-mug-empty:before, +.fa-beer:before { + content: "\f0fc"; +} +.fa-diagram-predecessor:before { + content: "\e477"; +} +.fa-arrow-up-long:before, +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-burn:before, +.fa-fire-flame-simple:before { + content: "\f46a"; +} +.fa-male:before, +.fa-person:before { + content: "\f183"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-file-csv:before { + content: "\f6dd"; +} +.fa-menorah:before { + content: "\f676"; +} +.fa-truck-plane:before { + content: "\e58f"; +} +.fa-record-vinyl:before { + content: "\f8d9"; +} +.fa-face-grin-stars:before, +.fa-grin-stars:before { + content: "\f587"; +} +.fa-bong:before { + content: "\f55c"; +} +.fa-pastafarianism:before, +.fa-spaghetti-monster-flying:before { + content: "\f67b"; +} +.fa-arrow-down-up-across-line:before { + content: "\e4af"; +} +.fa-spoon:before, +.fa-utensil-spoon:before { + content: "\f2e5"; +} +.fa-jar-wheat:before { + content: "\e517"; +} +.fa-envelopes-bulk:before, +.fa-mail-bulk:before { + content: "\f674"; +} +.fa-file-circle-exclamation:before { + content: "\e4eb"; +} +.fa-circle-h:before, +.fa-hospital-symbol:before { + content: "\f47e"; +} +.fa-pager:before { + content: "\f815"; +} +.fa-address-book:before, +.fa-contact-book:before { + content: "\f2b9"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-k:before { + content: "\4b"; +} +.fa-landmark-flag:before { + content: "\e51c"; +} +.fa-pencil-alt:before, +.fa-pencil:before { + content: "\f303"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-file-clipboard:before, +.fa-paste:before { + content: "\f0ea"; +} +.fa-code-pull-request:before { + content: "\e13c"; +} +.fa-clipboard-list:before { + content: "\f46d"; +} +.fa-truck-loading:before, +.fa-truck-ramp-box:before { + content: "\f4de"; +} +.fa-user-check:before { + content: "\f4fc"; +} +.fa-vial-virus:before { + content: "\e597"; +} +.fa-sheet-plastic:before { + content: "\e571"; +} +.fa-blog:before { + content: "\f781"; +} +.fa-user-ninja:before { + content: "\f504"; +} +.fa-person-arrow-up-from-line:before { + content: "\e539"; +} +.fa-scroll-torah:before, +.fa-torah:before { + content: "\f6a0"; +} +.fa-broom-ball:before, +.fa-quidditch-broom-ball:before, +.fa-quidditch:before { + content: "\f458"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-archive:before, +.fa-box-archive:before { + content: "\f187"; +} +.fa-person-drowning:before { + content: "\e545"; +} +.fa-arrow-down-9-1:before, +.fa-sort-numeric-desc:before, +.fa-sort-numeric-down-alt:before { + content: "\f886"; +} +.fa-face-grin-tongue-squint:before, +.fa-grin-tongue-squint:before { + content: "\f58a"; +} +.fa-spray-can:before { + content: "\f5bd"; +} +.fa-truck-monster:before { + content: "\f63b"; +} +.fa-w:before { + content: "\57"; +} +.fa-earth-africa:before, +.fa-globe-africa:before { + content: "\f57c"; +} +.fa-rainbow:before { + content: "\f75b"; +} +.fa-circle-notch:before { + content: "\f1ce"; +} +.fa-tablet-alt:before, +.fa-tablet-screen-button:before { + content: "\f3fa"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-trowel-bricks:before { + content: "\e58a"; +} +.fa-face-flushed:before, +.fa-flushed:before { + content: "\f579"; +} +.fa-hospital-user:before { + content: "\f80d"; +} +.fa-tent-arrow-left-right:before { + content: "\e57f"; +} +.fa-gavel:before, +.fa-legal:before { + content: "\f0e3"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-box-tissue:before { + content: "\e05b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-bell-concierge:before, +.fa-concierge-bell:before { + content: "\f562"; +} +.fa-pen-ruler:before, +.fa-pencil-ruler:before { + content: "\f5ae"; +} +.fa-people-arrows-left-right:before, +.fa-people-arrows:before { + content: "\e068"; +} +.fa-mars-and-venus-burst:before { + content: "\e523"; +} +.fa-caret-square-right:before, +.fa-square-caret-right:before { + content: "\f152"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-sun-plant-wilt:before { + content: "\e57a"; +} +.fa-toilets-portable:before { + content: "\e584"; +} +.fa-hockey-puck:before { + content: "\f453"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magnifying-glass-arrow-right:before { + content: "\e521"; +} +.fa-digital-tachograph:before, +.fa-tachograph-digital:before { + content: "\f566"; +} +.fa-users-slash:before { + content: "\e073"; +} +.fa-clover:before { + content: "\e139"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f3e5"; +} +.fa-star-and-crescent:before { + content: "\f699"; +} +.fa-house-fire:before { + content: "\e50c"; +} +.fa-minus-square:before, +.fa-square-minus:before { + content: "\f146"; +} +.fa-helicopter:before { + content: "\f533"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-caret-square-down:before, +.fa-square-caret-down:before { + content: "\f150"; +} +.fa-file-circle-question:before { + content: "\e4ef"; +} +.fa-laptop-code:before { + content: "\f5fc"; +} +.fa-swatchbook:before { + content: "\f5c3"; +} +.fa-prescription-bottle:before { + content: "\f485"; +} +.fa-bars:before, +.fa-navicon:before { + content: "\f0c9"; +} +.fa-people-group:before { + content: "\e533"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-heart-broken:before, +.fa-heart-crack:before { + content: "\f7a9"; +} +.fa-external-link-square-alt:before, +.fa-square-up-right:before { + content: "\f360"; +} +.fa-face-kiss-beam:before, +.fa-kiss-beam:before { + content: "\f597"; +} +.fa-film:before { + content: "\f008"; +} +.fa-ruler-horizontal:before { + content: "\f547"; +} +.fa-people-robbery:before { + content: "\e536"; +} +.fa-lightbulb:before { + content: "\f0eb"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-circle-exclamation:before, +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-school-circle-xmark:before { + content: "\e56d"; +} +.fa-arrow-right-from-bracket:before, +.fa-sign-out:before { + content: "\f08b"; +} +.fa-chevron-circle-down:before, +.fa-circle-chevron-down:before { + content: "\f13a"; +} +.fa-unlock-alt:before, +.fa-unlock-keyhole:before { + content: "\f13e"; +} +.fa-cloud-showers-heavy:before { + content: "\f740"; +} +.fa-headphones-alt:before, +.fa-headphones-simple:before { + content: "\f58f"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-circle-dollar-to-slot:before, +.fa-donate:before { + content: "\f4b9"; +} +.fa-memory:before { + content: "\f538"; +} +.fa-road-spikes:before { + content: "\e568"; +} +.fa-fire-burner:before { + content: "\e4f1"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-hanukiah:before { + content: "\f6e6"; +} +.fa-feather:before { + content: "\f52d"; +} +.fa-volume-down:before, +.fa-volume-low:before { + content: "\f027"; +} +.fa-comment-slash:before { + content: "\f4b3"; +} +.fa-cloud-sun-rain:before { + content: "\f743"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-wheat-alt:before, +.fa-wheat-awn:before { + content: "\e2cd"; +} +.fa-ankh:before { + content: "\f644"; +} +.fa-hands-holding-child:before { + content: "\e4fa"; +} +.fa-asterisk:before { + content: "\2a"; +} +.fa-check-square:before, +.fa-square-check:before { + content: "\f14a"; +} +.fa-peseta-sign:before { + content: "\e221"; +} +.fa-header:before, +.fa-heading:before { + content: "\f1dc"; +} +.fa-ghost:before { + content: "\f6e2"; +} +.fa-list-squares:before, +.fa-list:before { + content: "\f03a"; +} +.fa-phone-square-alt:before, +.fa-square-phone-flip:before { + content: "\f87b"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-circle-dot:before, +.fa-dot-circle:before { + content: "\f192"; +} +.fa-dizzy:before, +.fa-face-dizzy:before { + content: "\f567"; +} +.fa-egg:before { + content: "\f7fb"; +} +.fa-house-medical-circle-xmark:before { + content: "\e513"; +} +.fa-campground:before { + content: "\f6bb"; +} +.fa-folder-plus:before { + content: "\f65e"; +} +.fa-futbol-ball:before, +.fa-futbol:before, +.fa-soccer-ball:before { + content: "\f1e3"; +} +.fa-paint-brush:before, +.fa-paintbrush:before { + content: "\f1fc"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-gas-pump:before { + content: "\f52f"; +} +.fa-hot-tub-person:before, +.fa-hot-tub:before { + content: "\f593"; +} +.fa-map-location:before, +.fa-map-marked:before { + content: "\f59f"; +} +.fa-house-flood-water:before { + content: "\e50e"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-bridge-lock:before { + content: "\e4cc"; +} +.fa-sack-dollar:before { + content: "\f81d"; +} +.fa-edit:before, +.fa-pen-to-square:before { + content: "\f044"; +} +.fa-car-side:before { + content: "\f5e4"; +} +.fa-share-alt:before, +.fa-share-nodes:before { + content: "\f1e0"; +} +.fa-heart-circle-minus:before { + content: "\e4ff"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-microscope:before { + content: "\f610"; +} +.fa-sink:before { + content: "\e06d"; +} +.fa-bag-shopping:before, +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-arrow-down-z-a:before, +.fa-sort-alpha-desc:before, +.fa-sort-alpha-down-alt:before { + content: "\f881"; +} +.fa-mitten:before { + content: "\f7b5"; +} +.fa-person-rays:before { + content: "\e54d"; +} +.fa-users:before { + content: "\f0c0"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-flask-vial:before { + content: "\e4f3"; +} +.fa-hand-paper:before, +.fa-hand:before { + content: "\f256"; +} +.fa-om:before { + content: "\f679"; +} +.fa-worm:before { + content: "\e599"; +} +.fa-house-circle-xmark:before { + content: "\e50b"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-hand-spock:before { + content: "\f259"; +} +.fa-stopwatch:before { + content: "\f2f2"; +} +.fa-face-kiss:before, +.fa-kiss:before { + content: "\f596"; +} +.fa-bridge-circle-xmark:before { + content: "\e4cb"; +} +.fa-face-grin-tongue:before, +.fa-grin-tongue:before { + content: "\f589"; +} +.fa-chess-bishop:before { + content: "\f43a"; +} +.fa-face-grin-wink:before, +.fa-grin-wink:before { + content: "\f58c"; +} +.fa-deaf:before, +.fa-deafness:before, +.fa-ear-deaf:before, +.fa-hard-of-hearing:before { + content: "\f2a4"; +} +.fa-road-circle-check:before { + content: "\e564"; +} +.fa-dice-five:before { + content: "\f523"; +} +.fa-rss-square:before, +.fa-square-rss:before { + content: "\f143"; +} +.fa-land-mine-on:before { + content: "\e51b"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-stamp:before { + content: "\f5bf"; +} +.fa-stairs:before { + content: "\e289"; +} +.fa-i:before { + content: "\49"; +} +.fa-hryvnia-sign:before, +.fa-hryvnia:before { + content: "\f6f2"; +} +.fa-pills:before { + content: "\f484"; +} +.fa-face-grin-wide:before, +.fa-grin-alt:before { + content: "\f581"; +} +.fa-tooth:before { + content: "\f5c9"; +} +.fa-v:before { + content: "\56"; +} +.fa-bangladeshi-taka-sign:before { + content: "\e2e6"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-rod-asclepius:before, +.fa-rod-snake:before, +.fa-staff-aesculapius:before, +.fa-staff-snake:before { + content: "\e579"; +} +.fa-head-side-cough-slash:before { + content: "\e062"; +} +.fa-ambulance:before, +.fa-truck-medical:before { + content: "\f0f9"; +} +.fa-wheat-awn-circle-exclamation:before { + content: "\e598"; +} +.fa-snowman:before { + content: "\f7d0"; +} +.fa-mortar-pestle:before { + content: "\f5a7"; +} +.fa-road-barrier:before { + content: "\e562"; +} +.fa-school:before { + content: "\f549"; +} +.fa-igloo:before { + content: "\f7ae"; +} +.fa-joint:before { + content: "\f595"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-horse:before { + content: "\f6f0"; +} +.fa-q:before { + content: "\51"; +} +.fa-g:before { + content: "\47"; +} +.fa-notes-medical:before { + content: "\f481"; +} +.fa-temperature-2:before, +.fa-temperature-half:before, +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-dong-sign:before { + content: "\e169"; +} +.fa-capsules:before { + content: "\f46b"; +} +.fa-poo-bolt:before, +.fa-poo-storm:before { + content: "\f75a"; +} +.fa-face-frown-open:before, +.fa-frown-open:before { + content: "\f57a"; +} +.fa-hand-point-up:before { + content: "\f0a6"; +} +.fa-money-bill:before { + content: "\f0d6"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-umbrella-beach:before { + content: "\f5ca"; +} +.fa-helmet-un:before { + content: "\e503"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-bacon:before { + content: "\f7e5"; +} +.fa-hand-point-down:before { + content: "\f0a7"; +} +.fa-arrow-up-from-bracket:before { + content: "\e09a"; +} +.fa-folder-blank:before, +.fa-folder:before { + content: "\f07b"; +} +.fa-file-medical-alt:before, +.fa-file-waveform:before { + content: "\f478"; +} +.fa-radiation:before { + content: "\f7b9"; +} +.fa-chart-simple:before { + content: "\e473"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-vial:before { + content: "\f492"; +} +.fa-dashboard:before, +.fa-gauge-med:before, +.fa-gauge:before, +.fa-tachometer-alt-average:before { + content: "\f624"; +} +.fa-magic-wand-sparkles:before, +.fa-wand-magic-sparkles:before { + content: "\e2ca"; +} +.fa-e:before { + content: "\45"; +} +.fa-pen-alt:before, +.fa-pen-clip:before { + content: "\f305"; +} +.fa-bridge-circle-exclamation:before { + content: "\e4ca"; +} +.fa-user:before { + content: "\f007"; +} +.fa-school-circle-check:before { + content: "\e56b"; +} +.fa-dumpster:before { + content: "\f793"; +} +.fa-shuttle-van:before, +.fa-van-shuttle:before { + content: "\f5b6"; +} +.fa-building-user:before { + content: "\e4da"; +} +.fa-caret-square-left:before, +.fa-square-caret-left:before { + content: "\f191"; +} +.fa-highlighter:before { + content: "\f591"; +} +.fa-key:before { + content: "\f084"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-synagogue:before { + content: "\f69b"; +} +.fa-person-half-dress:before { + content: "\e548"; +} +.fa-road-bridge:before { + content: "\e563"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-c:before { + content: "\43"; +} +.fa-tablet-button:before { + content: "\f10a"; +} +.fa-building-lock:before { + content: "\e4d6"; +} +.fa-pizza-slice:before { + content: "\f818"; +} +.fa-money-bill-wave:before { + content: "\f53a"; +} +.fa-area-chart:before, +.fa-chart-area:before { + content: "\f1fe"; +} +.fa-house-flag:before { + content: "\e50d"; +} +.fa-person-circle-minus:before { + content: "\e540"; +} +.fa-ban:before, +.fa-cancel:before { + content: "\f05e"; +} +.fa-camera-rotate:before { + content: "\e0d8"; +} +.fa-air-freshener:before, +.fa-spray-can-sparkles:before { + content: "\f5d0"; +} +.fa-star:before { + content: "\f005"; +} +.fa-repeat:before { + content: "\f363"; +} +.fa-cross:before { + content: "\f654"; +} +.fa-box:before { + content: "\f466"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-arrow-pointer:before, +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-expand-arrows-alt:before, +.fa-maximize:before { + content: "\f31e"; +} +.fa-charging-station:before { + content: "\f5e7"; +} +.fa-shapes:before, +.fa-triangle-circle-square:before { + content: "\f61f"; +} +.fa-random:before, +.fa-shuffle:before { + content: "\f074"; +} +.fa-person-running:before, +.fa-running:before { + content: "\f70c"; +} +.fa-mobile-retro:before { + content: "\e527"; +} +.fa-grip-lines-vertical:before { + content: "\f7a5"; +} +.fa-spider:before { + content: "\f717"; +} +.fa-hands-bound:before { + content: "\e4f9"; +} +.fa-file-invoice-dollar:before { + content: "\f571"; +} +.fa-plane-circle-exclamation:before { + content: "\e556"; +} +.fa-x-ray:before { + content: "\f497"; +} +.fa-spell-check:before { + content: "\f891"; +} +.fa-slash:before { + content: "\f715"; +} +.fa-computer-mouse:before, +.fa-mouse:before { + content: "\f8cc"; +} +.fa-arrow-right-to-bracket:before, +.fa-sign-in:before { + content: "\f090"; +} +.fa-shop-slash:before, +.fa-store-alt-slash:before { + content: "\e070"; +} +.fa-server:before { + content: "\f233"; +} +.fa-virus-covid-slash:before { + content: "\e4a9"; +} +.fa-shop-lock:before { + content: "\e4a5"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-blender-phone:before { + content: "\f6b6"; +} +.fa-building-wheat:before { + content: "\e4db"; +} +.fa-person-breastfeeding:before { + content: "\e53a"; +} +.fa-right-to-bracket:before, +.fa-sign-in-alt:before { + content: "\f2f6"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-passport:before { + content: "\f5ab"; +} +.fa-heart-pulse:before, +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-people-carry-box:before, +.fa-people-carry:before { + content: "\f4ce"; +} +.fa-temperature-high:before { + content: "\f769"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-crown:before { + content: "\f521"; +} +.fa-weight-hanging:before { + content: "\f5cd"; +} +.fa-xmarks-lines:before { + content: "\e59a"; +} +.fa-file-prescription:before { + content: "\f572"; +} +.fa-weight-scale:before, +.fa-weight:before { + content: "\f496"; +} +.fa-user-friends:before, +.fa-user-group:before { + content: "\f500"; +} +.fa-arrow-up-a-z:before, +.fa-sort-alpha-up:before { + content: "\f15e"; +} +.fa-chess-knight:before { + content: "\f441"; +} +.fa-face-laugh-squint:before, +.fa-laugh-squint:before { + content: "\f59b"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-arrow-circle-up:before, +.fa-circle-arrow-up:before { + content: "\f0aa"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-person-walking:before, +.fa-walking:before { + content: "\f554"; +} +.fa-l:before { + content: "\4c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-bed-pulse:before, +.fa-procedures:before { + content: "\f487"; +} +.fa-shuttle-space:before, +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-face-laugh:before, +.fa-laugh:before { + content: "\f599"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-heart-circle-plus:before { + content: "\e500"; +} +.fa-code-fork:before { + content: "\e13b"; +} +.fa-city:before { + content: "\f64f"; +} +.fa-microphone-alt:before, +.fa-microphone-lines:before { + content: "\f3c9"; +} +.fa-pepper-hot:before { + content: "\f816"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-colon-sign:before { + content: "\e140"; +} +.fa-headset:before { + content: "\f590"; +} +.fa-store-slash:before { + content: "\e071"; +} +.fa-road-circle-xmark:before { + content: "\e566"; +} +.fa-user-minus:before { + content: "\f503"; +} +.fa-mars-stroke-up:before, +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-champagne-glasses:before, +.fa-glass-cheers:before { + content: "\f79f"; +} +.fa-clipboard:before { + content: "\f328"; +} +.fa-house-circle-exclamation:before { + content: "\e50a"; +} +.fa-file-arrow-up:before, +.fa-file-upload:before { + content: "\f574"; +} +.fa-wifi-3:before, +.fa-wifi-strong:before, +.fa-wifi:before { + content: "\f1eb"; +} +.fa-bath:before, +.fa-bathtub:before { + content: "\f2cd"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-user-edit:before, +.fa-user-pen:before { + content: "\f4ff"; +} +.fa-signature:before { + content: "\f5b7"; +} +.fa-stroopwafel:before { + content: "\f551"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-anchor-lock:before { + content: "\e4ad"; +} +.fa-building-ngo:before { + content: "\e4d7"; +} +.fa-manat-sign:before { + content: "\e1d5"; +} +.fa-not-equal:before { + content: "\f53e"; +} +.fa-border-style:before, +.fa-border-top-left:before { + content: "\f853"; +} +.fa-map-location-dot:before, +.fa-map-marked-alt:before { + content: "\f5a0"; +} +.fa-jedi:before { + content: "\f669"; +} +.fa-poll:before, +.fa-square-poll-vertical:before { + content: "\f681"; +} +.fa-mug-hot:before { + content: "\f7b6"; +} +.fa-battery-car:before, +.fa-car-battery:before { + content: "\f5df"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-dice-two:before { + content: "\f528"; +} +.fa-chess-queen:before { + content: "\f445"; +} +.fa-glasses:before { + content: "\f530"; +} +.fa-chess-board:before { + content: "\f43c"; +} +.fa-building-circle-check:before { + content: "\e4d2"; +} +.fa-person-chalkboard:before { + content: "\e53d"; +} +.fa-mars-stroke-h:before, +.fa-mars-stroke-right:before { + content: "\f22b"; +} +.fa-hand-back-fist:before, +.fa-hand-rock:before { + content: "\f255"; +} +.fa-caret-square-up:before, +.fa-square-caret-up:before { + content: "\f151"; +} +.fa-cloud-showers-water:before { + content: "\e4e4"; +} +.fa-bar-chart:before, +.fa-chart-bar:before { + content: "\f080"; +} +.fa-hands-bubbles:before, +.fa-hands-wash:before { + content: "\e05e"; +} +.fa-less-than-equal:before { + content: "\f537"; +} +.fa-train:before { + content: "\f238"; +} +.fa-eye-low-vision:before, +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-crow:before { + content: "\f520"; +} +.fa-sailboat:before { + content: "\e445"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-plus-square:before, +.fa-square-plus:before { + content: "\f0fe"; +} +.fa-torii-gate:before { + content: "\f6a1"; +} +.fa-frog:before { + content: "\f52e"; +} +.fa-bucket:before { + content: "\e4cf"; +} +.fa-image:before { + content: "\f03e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-cow:before { + content: "\f6c8"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-screwdriver:before { + content: "\f54a"; +} +.fa-folder-closed:before { + content: "\e185"; +} +.fa-house-tsunami:before { + content: "\e515"; +} +.fa-square-nfi:before { + content: "\e576"; +} +.fa-arrow-up-from-ground-water:before { + content: "\e4b5"; +} +.fa-glass-martini-alt:before, +.fa-martini-glass:before { + content: "\f57b"; +} +.fa-rotate-back:before, +.fa-rotate-backward:before, +.fa-rotate-left:before, +.fa-undo-alt:before { + content: "\f2ea"; +} +.fa-columns:before, +.fa-table-columns:before { + content: "\f0db"; +} +.fa-lemon:before { + content: "\f094"; +} +.fa-head-side-mask:before { + content: "\e063"; +} +.fa-handshake:before { + content: "\f2b5"; +} +.fa-gem:before { + content: "\f3a5"; +} +.fa-dolly-box:before, +.fa-dolly:before { + content: "\f472"; +} +.fa-smoking:before { + content: "\f48d"; +} +.fa-compress-arrows-alt:before, +.fa-minimize:before { + content: "\f78c"; +} +.fa-monument:before { + content: "\f5a6"; +} +.fa-snowplow:before { + content: "\f7d2"; +} +.fa-angle-double-right:before, +.fa-angles-right:before { + content: "\f101"; +} +.fa-cannabis:before { + content: "\f55f"; +} +.fa-circle-play:before, +.fa-play-circle:before { + content: "\f144"; +} +.fa-tablets:before { + content: "\f490"; +} +.fa-ethernet:before { + content: "\f796"; +} +.fa-eur:before, +.fa-euro-sign:before, +.fa-euro:before { + content: "\f153"; +} +.fa-chair:before { + content: "\f6c0"; +} +.fa-check-circle:before, +.fa-circle-check:before { + content: "\f058"; +} +.fa-circle-stop:before, +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-compass-drafting:before, +.fa-drafting-compass:before { + content: "\f568"; +} +.fa-plate-wheat:before { + content: "\e55a"; +} +.fa-icicles:before { + content: "\f7ad"; +} +.fa-person-shelter:before { + content: "\e54f"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-marker:before { + content: "\f5a1"; +} +.fa-face-laugh-beam:before, +.fa-laugh-beam:before { + content: "\f59a"; +} +.fa-helicopter-symbol:before { + content: "\e502"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-chevron-circle-up:before, +.fa-circle-chevron-up:before { + content: "\f139"; +} +.fa-lari-sign:before { + content: "\e1c8"; +} +.fa-volcano:before { + content: "\f770"; +} +.fa-person-walking-dashed-line-arrow-right:before { + content: "\e553"; +} +.fa-gbp:before, +.fa-pound-sign:before, +.fa-sterling-sign:before { + content: "\f154"; +} +.fa-viruses:before { + content: "\e076"; +} +.fa-square-person-confined:before { + content: "\e577"; +} +.fa-user-tie:before { + content: "\f508"; +} +.fa-arrow-down-long:before, +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-tent-arrow-down-to-line:before { + content: "\e57e"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-person-skating:before, +.fa-skating:before { + content: "\f7c5"; +} +.fa-filter-circle-dollar:before, +.fa-funnel-dollar:before { + content: "\f662"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-arrow-circle-down:before, +.fa-circle-arrow-down:before { + content: "\f0ab"; +} +.fa-arrow-right-to-file:before, +.fa-file-import:before { + content: "\f56f"; +} +.fa-external-link-square:before, +.fa-square-arrow-up-right:before { + content: "\f14c"; +} +.fa-box-open:before { + content: "\f49e"; +} +.fa-scroll:before { + content: "\f70e"; +} +.fa-spa:before { + content: "\f5bb"; +} +.fa-location-pin-lock:before { + content: "\e51f"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-hill-avalanche:before { + content: "\e507"; +} +.fa-temperature-0:before, +.fa-temperature-empty:before, +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-address-card:before, +.fa-contact-card:before, +.fa-vcard:before { + content: "\f2bb"; +} +.fa-balance-scale-right:before, +.fa-scale-unbalanced-flip:before { + content: "\f516"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-diamond-turn-right:before, +.fa-directions:before { + content: "\f5eb"; +} +.fa-burst:before { + content: "\e4dc"; +} +.fa-house-laptop:before, +.fa-laptop-house:before { + content: "\e066"; +} +.fa-face-tired:before, +.fa-tired:before { + content: "\f5c8"; +} +.fa-money-bills:before { + content: "\e1f3"; +} +.fa-smog:before { + content: "\f75f"; +} +.fa-crutch:before { + content: "\f7f7"; +} +.fa-cloud-arrow-up:before, +.fa-cloud-upload-alt:before, +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-palette:before { + content: "\f53f"; +} +.fa-arrows-turn-right:before { + content: "\e4c0"; +} +.fa-vest:before { + content: "\e085"; +} +.fa-ferry:before { + content: "\e4ea"; +} +.fa-arrows-down-to-people:before { + content: "\e4b9"; +} +.fa-seedling:before, +.fa-sprout:before { + content: "\f4d8"; +} +.fa-arrows-alt-h:before, +.fa-left-right:before { + content: "\f337"; +} +.fa-boxes-packing:before { + content: "\e4c7"; +} +.fa-arrow-circle-left:before, +.fa-circle-arrow-left:before { + content: "\f0a8"; +} +.fa-group-arrows-rotate:before { + content: "\e4f6"; +} +.fa-bowl-food:before { + content: "\e4c6"; +} +.fa-candy-cane:before { + content: "\f786"; +} +.fa-arrow-down-wide-short:before, +.fa-sort-amount-asc:before, +.fa-sort-amount-down:before { + content: "\f160"; +} +.fa-cloud-bolt:before, +.fa-thunderstorm:before { + content: "\f76c"; +} +.fa-remove-format:before, +.fa-text-slash:before { + content: "\f87d"; +} +.fa-face-smile-wink:before, +.fa-smile-wink:before { + content: "\f4da"; +} +.fa-file-word:before { + content: "\f1c2"; +} +.fa-file-powerpoint:before { + content: "\f1c4"; +} +.fa-arrows-h:before, +.fa-arrows-left-right:before { + content: "\f07e"; +} +.fa-house-lock:before { + content: "\e510"; +} +.fa-cloud-arrow-down:before, +.fa-cloud-download-alt:before, +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-children:before { + content: "\e4e1"; +} +.fa-blackboard:before, +.fa-chalkboard:before { + content: "\f51b"; +} +.fa-user-alt-slash:before, +.fa-user-large-slash:before { + content: "\f4fa"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-handshake-alt-slash:before, +.fa-handshake-simple-slash:before { + content: "\e05f"; +} +.fa-mattress-pillow:before { + content: "\e525"; +} +.fa-guarani-sign:before { + content: "\e19a"; +} +.fa-arrows-rotate:before, +.fa-refresh:before, +.fa-sync:before { + content: "\f021"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-cruzeiro-sign:before { + content: "\e152"; +} +.fa-greater-than-equal:before { + content: "\f532"; +} +.fa-shield-alt:before, +.fa-shield-halved:before { + content: "\f3ed"; +} +.fa-atlas:before, +.fa-book-atlas:before { + content: "\f558"; +} +.fa-virus:before { + content: "\e074"; +} +.fa-envelope-circle-check:before { + content: "\e4e8"; +} +.fa-layer-group:before { + content: "\f5fd"; +} +.fa-arrows-to-dot:before { + content: "\e4be"; +} +.fa-archway:before { + content: "\f557"; +} +.fa-heart-circle-check:before { + content: "\e4fd"; +} +.fa-house-chimney-crack:before, +.fa-house-damage:before { + content: "\f6f1"; +} +.fa-file-archive:before, +.fa-file-zipper:before { + content: "\f1c6"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-glass-martini:before, +.fa-martini-glass-empty:before { + content: "\f000"; +} +.fa-couch:before { + content: "\f4b8"; +} +.fa-cedi-sign:before { + content: "\e0df"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-table-cells-column-lock:before { + content: "\e678"; +} +.fa-church:before { + content: "\f51d"; +} +.fa-comments-dollar:before { + content: "\f653"; +} +.fa-democrat:before { + content: "\f747"; +} +.fa-z:before { + content: "\5a"; +} +.fa-person-skiing:before, +.fa-skiing:before { + content: "\f7c9"; +} +.fa-road-lock:before { + content: "\e567"; +} +.fa-a:before { + content: "\41"; +} +.fa-temperature-arrow-down:before, +.fa-temperature-down:before { + content: "\e03f"; +} +.fa-feather-alt:before, +.fa-feather-pointed:before { + content: "\f56b"; +} +.fa-p:before { + content: "\50"; +} +.fa-snowflake:before { + content: "\f2dc"; +} +.fa-newspaper:before { + content: "\f1ea"; +} +.fa-ad:before, +.fa-rectangle-ad:before { + content: "\f641"; +} +.fa-arrow-circle-right:before, +.fa-circle-arrow-right:before { + content: "\f0a9"; +} +.fa-filter-circle-xmark:before { + content: "\e17b"; +} +.fa-locust:before { + content: "\e520"; +} +.fa-sort:before, +.fa-unsorted:before { + content: "\f0dc"; +} +.fa-list-1-2:before, +.fa-list-numeric:before, +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-person-dress-burst:before { + content: "\e544"; +} +.fa-money-check-alt:before, +.fa-money-check-dollar:before { + content: "\f53d"; +} +.fa-vector-square:before { + content: "\f5cb"; +} +.fa-bread-slice:before { + content: "\f7ec"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-face-kiss-wink-heart:before, +.fa-kiss-wink-heart:before { + content: "\f598"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-question:before { + content: "\3f"; +} +.fa-file-signature:before { + content: "\f573"; +} +.fa-arrows-alt:before, +.fa-up-down-left-right:before { + content: "\f0b2"; +} +.fa-house-chimney-user:before { + content: "\e065"; +} +.fa-hand-holding-heart:before { + content: "\f4be"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-money-check:before { + content: "\f53c"; +} +.fa-star-half-alt:before, +.fa-star-half-stroke:before { + content: "\f5c0"; +} +.fa-code:before { + content: "\f121"; +} +.fa-glass-whiskey:before, +.fa-whiskey-glass:before { + content: "\f7a0"; +} +.fa-building-circle-exclamation:before { + content: "\e4d3"; +} +.fa-magnifying-glass-chart:before { + content: "\e522"; +} +.fa-arrow-up-right-from-square:before, +.fa-external-link:before { + content: "\f08e"; +} +.fa-cubes-stacked:before { + content: "\e4e6"; +} +.fa-krw:before, +.fa-won-sign:before, +.fa-won:before { + content: "\f159"; +} +.fa-virus-covid:before { + content: "\e4a8"; +} +.fa-austral-sign:before { + content: "\e0a9"; +} +.fa-f:before { + content: "\46"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-road:before { + content: "\f018"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-person-circle-plus:before { + content: "\e541"; +} +.fa-chart-pie:before, +.fa-pie-chart:before { + content: "\f200"; +} +.fa-bolt-lightning:before { + content: "\e0b7"; +} +.fa-sack-xmark:before { + content: "\e56a"; +} +.fa-file-excel:before { + content: "\f1c3"; +} +.fa-file-contract:before { + content: "\f56c"; +} +.fa-fish-fins:before { + content: "\e4f2"; +} +.fa-building-flag:before { + content: "\e4d5"; +} +.fa-face-grin-beam:before, +.fa-grin-beam:before { + content: "\f582"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-poop:before { + content: "\f619"; +} +.fa-location-pin:before, +.fa-map-marker:before { + content: "\f041"; +} +.fa-kaaba:before { + content: "\f66b"; +} +.fa-toilet-paper:before { + content: "\f71e"; +} +.fa-hard-hat:before, +.fa-hat-hard:before, +.fa-helmet-safety:before { + content: "\f807"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-arrow-alt-circle-right:before, +.fa-circle-right:before { + content: "\f35a"; +} +.fa-plane-circle-check:before { + content: "\e555"; +} +.fa-face-rolling-eyes:before, +.fa-meh-rolling-eyes:before { + content: "\f5a5"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-chart-line:before, +.fa-line-chart:before { + content: "\f201"; +} +.fa-mask-ventilator:before { + content: "\e524"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-map-signs:before, +.fa-signs-post:before { + content: "\f277"; +} +.fa-cash-register:before { + content: "\f788"; +} +.fa-person-circle-question:before { + content: "\e542"; +} +.fa-h:before { + content: "\48"; +} +.fa-tarp:before { + content: "\e57b"; +} +.fa-screwdriver-wrench:before, +.fa-tools:before { + content: "\f7d9"; +} +.fa-arrows-to-eye:before { + content: "\e4bf"; +} +.fa-plug-circle-bolt:before { + content: "\e55b"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-mars-and-venus:before { + content: "\f224"; +} +.fa-home-user:before, +.fa-house-user:before { + content: "\e1b0"; +} +.fa-dumpster-fire:before { + content: "\f794"; +} +.fa-house-crack:before { + content: "\e3b1"; +} +.fa-cocktail:before, +.fa-martini-glass-citrus:before { + content: "\f561"; +} +.fa-face-surprise:before, +.fa-surprise:before { + content: "\f5c2"; +} +.fa-bottle-water:before { + content: "\e4c5"; +} +.fa-circle-pause:before, +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-toilet-paper-slash:before { + content: "\e072"; +} +.fa-apple-alt:before, +.fa-apple-whole:before { + content: "\f5d1"; +} +.fa-kitchen-set:before { + content: "\e51a"; +} +.fa-r:before { + content: "\52"; +} +.fa-temperature-1:before, +.fa-temperature-quarter:before, +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-bitcoin-sign:before { + content: "\e0b4"; +} +.fa-shield-dog:before { + content: "\e573"; +} +.fa-solar-panel:before { + content: "\f5ba"; +} +.fa-lock-open:before { + content: "\f3c1"; +} +.fa-elevator:before { + content: "\e16d"; +} +.fa-money-bill-transfer:before { + content: "\e528"; +} +.fa-money-bill-trend-up:before { + content: "\e529"; +} +.fa-house-flood-water-circle-arrow-right:before { + content: "\e50f"; +} +.fa-poll-h:before, +.fa-square-poll-horizontal:before { + content: "\f682"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-backward-fast:before, +.fa-fast-backward:before { + content: "\f049"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-user-astronaut:before { + content: "\f4fb"; +} +.fa-plane-slash:before { + content: "\e069"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-basketball-ball:before, +.fa-basketball:before { + content: "\f434"; +} +.fa-satellite-dish:before { + content: "\f7c0"; +} +.fa-arrow-alt-circle-up:before, +.fa-circle-up:before { + content: "\f35b"; +} +.fa-mobile-alt:before, +.fa-mobile-screen-button:before { + content: "\f3cd"; +} +.fa-volume-high:before, +.fa-volume-up:before { + content: "\f028"; +} +.fa-users-rays:before { + content: "\e593"; +} +.fa-wallet:before { + content: "\f555"; +} +.fa-clipboard-check:before { + content: "\f46c"; +} +.fa-file-audio:before { + content: "\f1c7"; +} +.fa-burger:before, +.fa-hamburger:before { + content: "\f805"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-bugs:before { + content: "\e4d0"; +} +.fa-rupee-sign:before, +.fa-rupee:before { + content: "\f156"; +} +.fa-file-image:before { + content: "\f1c5"; +} +.fa-circle-question:before, +.fa-question-circle:before { + content: "\f059"; +} +.fa-plane-departure:before { + content: "\f5b0"; +} +.fa-handshake-slash:before { + content: "\e060"; +} +.fa-book-bookmark:before { + content: "\e0bb"; +} +.fa-code-branch:before { + content: "\f126"; +} +.fa-hat-cowboy:before { + content: "\f8c0"; +} +.fa-bridge:before { + content: "\e4c8"; +} +.fa-phone-alt:before, +.fa-phone-flip:before { + content: "\f879"; +} +.fa-truck-front:before { + content: "\e2b7"; +} +.fa-cat:before { + content: "\f6be"; +} +.fa-anchor-circle-exclamation:before { + content: "\e4ab"; +} +.fa-truck-field:before { + content: "\e58d"; +} +.fa-route:before { + content: "\f4d7"; +} +.fa-clipboard-question:before { + content: "\e4e3"; +} +.fa-panorama:before { + content: "\e209"; +} +.fa-comment-medical:before { + content: "\f7f5"; +} +.fa-teeth-open:before { + content: "\f62f"; +} +.fa-file-circle-minus:before { + content: "\e4ed"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-wine-glass:before { + content: "\f4e3"; +} +.fa-fast-forward:before, +.fa-forward-fast:before { + content: "\f050"; +} +.fa-face-meh-blank:before, +.fa-meh-blank:before { + content: "\f5a4"; +} +.fa-parking:before, +.fa-square-parking:before { + content: "\f540"; +} +.fa-house-signal:before { + content: "\e012"; +} +.fa-bars-progress:before, +.fa-tasks-alt:before { + content: "\f828"; +} +.fa-faucet-drip:before { + content: "\e006"; +} +.fa-cart-flatbed:before, +.fa-dolly-flatbed:before { + content: "\f474"; +} +.fa-ban-smoking:before, +.fa-smoking-ban:before { + content: "\f54d"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-mobile-button:before { + content: "\f10b"; +} +.fa-house-medical-flag:before { + content: "\e514"; +} +.fa-basket-shopping:before, +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-tape:before { + content: "\f4db"; +} +.fa-bus-alt:before, +.fa-bus-simple:before { + content: "\f55e"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-face-sad-cry:before, +.fa-sad-cry:before { + content: "\f5b3"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-person-military-to-person:before { + content: "\e54c"; +} +.fa-file-shield:before { + content: "\e4f0"; +} +.fa-user-slash:before { + content: "\f506"; +} +.fa-pen:before { + content: "\f304"; +} +.fa-tower-observation:before { + content: "\e586"; +} +.fa-file-code:before { + content: "\f1c9"; +} +.fa-signal-5:before, +.fa-signal-perfect:before, +.fa-signal:before { + content: "\f012"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-heart-circle-xmark:before { + content: "\e501"; +} +.fa-home-lg:before, +.fa-house-chimney:before { + content: "\e3af"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-face-frown:before, +.fa-frown:before { + content: "\f119"; +} +.fa-prescription:before { + content: "\f5b1"; +} +.fa-shop:before, +.fa-store-alt:before { + content: "\f54f"; +} +.fa-floppy-disk:before, +.fa-save:before { + content: "\f0c7"; +} +.fa-vihara:before { + content: "\f6a7"; +} +.fa-balance-scale-left:before, +.fa-scale-unbalanced:before { + content: "\f515"; +} +.fa-sort-asc:before, +.fa-sort-up:before { + content: "\f0de"; +} +.fa-comment-dots:before, +.fa-commenting:before { + content: "\f4ad"; +} +.fa-plant-wilt:before { + content: "\e5aa"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-face-grin-squint:before, +.fa-grin-squint:before { + content: "\f585"; +} +.fa-hand-holding-dollar:before, +.fa-hand-holding-usd:before { + content: "\f4c0"; +} +.fa-bacterium:before { + content: "\e05a"; +} +.fa-hand-pointer:before { + content: "\f25a"; +} +.fa-drum-steelpan:before { + content: "\f56a"; +} +.fa-hand-scissors:before { + content: "\f257"; +} +.fa-hands-praying:before, +.fa-praying-hands:before { + content: "\f684"; +} +.fa-arrow-right-rotate:before, +.fa-arrow-rotate-forward:before, +.fa-arrow-rotate-right:before, +.fa-redo:before { + content: "\f01e"; +} +.fa-biohazard:before { + content: "\f780"; +} +.fa-location-crosshairs:before, +.fa-location:before { + content: "\f601"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-child-dress:before { + content: "\e59c"; +} +.fa-users-between-lines:before { + content: "\e591"; +} +.fa-lungs-virus:before { + content: "\e067"; +} +.fa-face-grin-tears:before, +.fa-grin-tears:before { + content: "\f588"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-calendar-times:before, +.fa-calendar-xmark:before { + content: "\f273"; +} +.fa-child-reaching:before { + content: "\e59d"; +} +.fa-head-side-virus:before { + content: "\e064"; +} +.fa-user-cog:before, +.fa-user-gear:before { + content: "\f4fe"; +} +.fa-arrow-up-1-9:before, +.fa-sort-numeric-up:before { + content: "\f163"; +} +.fa-door-closed:before { + content: "\f52a"; +} +.fa-shield-virus:before { + content: "\e06c"; +} +.fa-dice-six:before { + content: "\f526"; +} +.fa-mosquito-net:before { + content: "\e52c"; +} +.fa-bridge-water:before { + content: "\e4ce"; +} +.fa-person-booth:before { + content: "\f756"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-hat-wizard:before { + content: "\f6e8"; +} +.fa-pen-fancy:before { + content: "\f5ac"; +} +.fa-digging:before, +.fa-person-digging:before { + content: "\f85e"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-gauge-simple-med:before, +.fa-gauge-simple:before, +.fa-tachometer-average:before { + content: "\f629"; +} +.fa-book-medical:before { + content: "\f7e6"; +} +.fa-poo:before { + content: "\f2fe"; +} +.fa-quote-right-alt:before, +.fa-quote-right:before { + content: "\f10e"; +} +.fa-shirt:before, +.fa-t-shirt:before, +.fa-tshirt:before { + content: "\f553"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-divide:before { + content: "\f529"; +} +.fa-tenge-sign:before, +.fa-tenge:before { + content: "\f7d7"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-hands-holding:before { + content: "\f4c2"; +} +.fa-hands-clapping:before { + content: "\e1a8"; +} +.fa-republican:before { + content: "\f75e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-person-circle-xmark:before { + content: "\e543"; +} +.fa-ruler:before { + content: "\f545"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-dice-d6:before { + content: "\f6d1"; +} +.fa-restroom:before { + content: "\f7bd"; +} +.fa-j:before { + content: "\4a"; +} +.fa-users-viewfinder:before { + content: "\e595"; +} +.fa-file-video:before { + content: "\f1c8"; +} +.fa-external-link-alt:before, +.fa-up-right-from-square:before { + content: "\f35d"; +} +.fa-table-cells:before, +.fa-th:before { + content: "\f00a"; +} +.fa-file-pdf:before { + content: "\f1c1"; +} +.fa-bible:before, +.fa-book-bible:before { + content: "\f647"; +} +.fa-o:before { + content: "\4f"; +} +.fa-medkit:before, +.fa-suitcase-medical:before { + content: "\f0fa"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-otter:before { + content: "\f700"; +} +.fa-female:before, +.fa-person-dress:before { + content: "\f182"; +} +.fa-comment-dollar:before { + content: "\f651"; +} +.fa-briefcase-clock:before, +.fa-business-time:before { + content: "\f64a"; +} +.fa-table-cells-large:before, +.fa-th-large:before { + content: "\f009"; +} +.fa-book-tanakh:before, +.fa-tanakh:before { + content: "\f827"; +} +.fa-phone-volume:before, +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-hat-cowboy-side:before { + content: "\f8c1"; +} +.fa-clipboard-user:before { + content: "\f7f3"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-lira-sign:before { + content: "\f195"; +} +.fa-satellite:before { + content: "\f7bf"; +} +.fa-plane-lock:before { + content: "\e558"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-birthday-cake:before, +.fa-cake-candles:before, +.fa-cake:before { + content: "\f1fd"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-angle-double-up:before, +.fa-angles-up:before { + content: "\f102"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-arrow-right-to-city:before { + content: "\e4b3"; +} +.fa-ribbon:before { + content: "\f4d6"; +} +.fa-lungs:before { + content: "\f604"; +} +.fa-arrow-up-9-1:before, +.fa-sort-numeric-up-alt:before { + content: "\f887"; +} +.fa-litecoin-sign:before { + content: "\e1d3"; +} +.fa-border-none:before { + content: "\f850"; +} +.fa-circle-nodes:before { + content: "\e4e2"; +} +.fa-parachute-box:before { + content: "\f4cd"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-truck-field-un:before { + content: "\e58e"; +} +.fa-hourglass-empty:before, +.fa-hourglass:before { + content: "\f254"; +} +.fa-mountain:before { + content: "\f6fc"; +} +.fa-user-doctor:before, +.fa-user-md:before { + content: "\f0f0"; +} +.fa-circle-info:before, +.fa-info-circle:before { + content: "\f05a"; +} +.fa-cloud-meatball:before { + content: "\f73b"; +} +.fa-camera-alt:before, +.fa-camera:before { + content: "\f030"; +} +.fa-square-virus:before { + content: "\e578"; +} +.fa-meteor:before { + content: "\f753"; +} +.fa-car-on:before { + content: "\e4dd"; +} +.fa-sleigh:before { + content: "\f7cc"; +} +.fa-arrow-down-1-9:before, +.fa-sort-numeric-asc:before, +.fa-sort-numeric-down:before { + content: "\f162"; +} +.fa-hand-holding-droplet:before, +.fa-hand-holding-water:before { + content: "\f4c1"; +} +.fa-water:before { + content: "\f773"; +} +.fa-calendar-check:before { + content: "\f274"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-prescription-bottle-alt:before, +.fa-prescription-bottle-medical:before { + content: "\f486"; +} +.fa-landmark:before { + content: "\f66f"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-person-cane:before { + content: "\e53c"; +} +.fa-tent:before { + content: "\e57d"; +} +.fa-vest-patches:before { + content: "\e086"; +} +.fa-check-double:before { + content: "\f560"; +} +.fa-arrow-down-a-z:before, +.fa-sort-alpha-asc:before, +.fa-sort-alpha-down:before { + content: "\f15d"; +} +.fa-money-bill-wheat:before { + content: "\e52a"; +} +.fa-cookie:before { + content: "\f563"; +} +.fa-arrow-left-rotate:before, +.fa-arrow-rotate-back:before, +.fa-arrow-rotate-backward:before, +.fa-arrow-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-hard-drive:before, +.fa-hdd:before { + content: "\f0a0"; +} +.fa-face-grin-squint-tears:before, +.fa-grin-squint-tears:before { + content: "\f586"; +} +.fa-dumbbell:before { + content: "\f44b"; +} +.fa-list-alt:before, +.fa-rectangle-list:before { + content: "\f022"; +} +.fa-tarp-droplet:before { + content: "\e57c"; +} +.fa-house-medical-circle-check:before { + content: "\e511"; +} +.fa-person-skiing-nordic:before, +.fa-skiing-nordic:before { + content: "\f7ca"; +} +.fa-calendar-plus:before { + content: "\f271"; +} +.fa-plane-arrival:before { + content: "\f5af"; +} +.fa-arrow-alt-circle-left:before, +.fa-circle-left:before { + content: "\f359"; +} +.fa-subway:before, +.fa-train-subway:before { + content: "\f239"; +} +.fa-chart-gantt:before { + content: "\e0e4"; +} +.fa-indian-rupee-sign:before, +.fa-indian-rupee:before, +.fa-inr:before { + content: "\e1bc"; +} +.fa-crop-alt:before, +.fa-crop-simple:before { + content: "\f565"; +} +.fa-money-bill-1:before, +.fa-money-bill-alt:before { + content: "\f3d1"; +} +.fa-left-long:before, +.fa-long-arrow-alt-left:before { + content: "\f30a"; +} +.fa-dna:before { + content: "\f471"; +} +.fa-virus-slash:before { + content: "\e075"; +} +.fa-minus:before, +.fa-subtract:before { + content: "\f068"; +} +.fa-chess:before { + content: "\f439"; +} +.fa-arrow-left-long:before, +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-plug-circle-check:before { + content: "\e55c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-franc-sign:before { + content: "\e18f"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-american-sign-language-interpreting:before, +.fa-asl-interpreting:before, +.fa-hands-american-sign-language-interpreting:before, +.fa-hands-asl-interpreting:before { + content: "\f2a3"; +} +.fa-cog:before, +.fa-gear:before { + content: "\f013"; +} +.fa-droplet-slash:before, +.fa-tint-slash:before { + content: "\f5c7"; +} +.fa-mosque:before { + content: "\f678"; +} +.fa-mosquito:before { + content: "\e52b"; +} +.fa-star-of-david:before { + content: "\f69a"; +} +.fa-person-military-rifle:before { + content: "\e54b"; +} +.fa-cart-shopping:before, +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-vials:before { + content: "\f493"; +} +.fa-plug-circle-plus:before { + content: "\e55f"; +} +.fa-place-of-worship:before { + content: "\f67f"; +} +.fa-grip-vertical:before { + content: "\f58e"; +} +.fa-arrow-turn-up:before, +.fa-level-up:before { + content: "\f148"; +} +.fa-u:before { + content: "\55"; +} +.fa-square-root-alt:before, +.fa-square-root-variable:before { + content: "\f698"; +} +.fa-clock-four:before, +.fa-clock:before { + content: "\f017"; +} +.fa-backward-step:before, +.fa-step-backward:before { + content: "\f048"; +} +.fa-pallet:before { + content: "\f482"; +} +.fa-faucet:before { + content: "\e005"; +} +.fa-baseball-bat-ball:before { + content: "\f432"; +} +.fa-s:before { + content: "\53"; +} +.fa-timeline:before { + content: "\e29c"; +} +.fa-keyboard:before { + content: "\f11c"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-clinic-medical:before, +.fa-house-chimney-medical:before { + content: "\f7f2"; +} +.fa-temperature-3:before, +.fa-temperature-three-quarters:before, +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-mobile-android-alt:before, +.fa-mobile-screen:before { + content: "\f3cf"; +} +.fa-plane-up:before { + content: "\e22d"; +} +.fa-piggy-bank:before { + content: "\f4d3"; +} +.fa-battery-3:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-mountain-city:before { + content: "\e52e"; +} +.fa-coins:before { + content: "\f51e"; +} +.fa-khanda:before { + content: "\f66d"; +} +.fa-sliders-h:before, +.fa-sliders:before { + content: "\f1de"; +} +.fa-folder-tree:before { + content: "\f802"; +} +.fa-network-wired:before { + content: "\f6ff"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-hamsa:before { + content: "\f665"; +} +.fa-cent-sign:before { + content: "\e3f5"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-person-pregnant:before { + content: "\e31e"; +} +.fa-wand-sparkles:before { + content: "\f72b"; +} +.fa-ellipsis-v:before, +.fa-ellipsis-vertical:before { + content: "\f142"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-long-arrow-alt-right:before, +.fa-right-long:before { + content: "\f30b"; +} +.fa-flag-usa:before { + content: "\f74d"; +} +.fa-laptop-file:before { + content: "\e51d"; +} +.fa-teletype:before, +.fa-tty:before { + content: "\f1e4"; +} +.fa-diagram-next:before { + content: "\e476"; +} +.fa-person-rifle:before { + content: "\e54e"; +} +.fa-house-medical-circle-exclamation:before { + content: "\e512"; +} +.fa-closed-captioning:before { + content: "\f20a"; +} +.fa-hiking:before, +.fa-person-hiking:before { + content: "\f6ec"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-images:before { + content: "\f302"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-people-pulling:before { + content: "\e535"; +} +.fa-n:before { + content: "\4e"; +} +.fa-cable-car:before, +.fa-tram:before { + content: "\f7da"; +} +.fa-cloud-rain:before { + content: "\f73d"; +} +.fa-building-circle-xmark:before { + content: "\e4d4"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-arrows-down-to-line:before { + content: "\e4b8"; +} +.fa-download:before { + content: "\f019"; +} +.fa-face-grin:before, +.fa-grin:before { + content: "\f580"; +} +.fa-backspace:before, +.fa-delete-left:before { + content: "\f55a"; +} +.fa-eye-dropper-empty:before, +.fa-eye-dropper:before, +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-file-circle-check:before { + content: "\e5a0"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-mobile-android:before, +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f3ce"; +} +.fa-face-meh:before, +.fa-meh:before { + content: "\f11a"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-book-dead:before, +.fa-book-skull:before { + content: "\f6b7"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-heart-circle-exclamation:before { + content: "\e4fe"; +} +.fa-home-alt:before, +.fa-home-lg-alt:before, +.fa-home:before, +.fa-house:before { + content: "\f015"; +} +.fa-calendar-week:before { + content: "\f784"; +} +.fa-laptop-medical:before { + content: "\f812"; +} +.fa-b:before { + content: "\42"; +} +.fa-file-medical:before { + content: "\f477"; +} +.fa-dice-one:before { + content: "\f525"; +} +.fa-kiwi-bird:before { + content: "\f535"; +} +.fa-arrow-right-arrow-left:before, +.fa-exchange:before { + content: "\f0ec"; +} +.fa-redo-alt:before, +.fa-rotate-forward:before, +.fa-rotate-right:before { + content: "\f2f9"; +} +.fa-cutlery:before, +.fa-utensils:before { + content: "\f2e7"; +} +.fa-arrow-up-wide-short:before, +.fa-sort-amount-up:before { + content: "\f161"; +} +.fa-mill-sign:before { + content: "\e1ed"; +} +.fa-bowl-rice:before { + content: "\e2eb"; +} +.fa-skull:before { + content: "\f54c"; +} +.fa-broadcast-tower:before, +.fa-tower-broadcast:before { + content: "\f519"; +} +.fa-truck-pickup:before { + content: "\f63c"; +} +.fa-long-arrow-alt-up:before, +.fa-up-long:before { + content: "\f30c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-code-merge:before { + content: "\f387"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-hurricane:before { + content: "\f751"; +} +.fa-mound:before { + content: "\e52d"; +} +.fa-toilet-portable:before { + content: "\e583"; +} +.fa-compact-disc:before { + content: "\f51f"; +} +.fa-file-arrow-down:before, +.fa-file-download:before { + content: "\f56d"; +} +.fa-caravan:before { + content: "\f8ff"; +} +.fa-shield-cat:before { + content: "\e572"; +} +.fa-bolt:before, +.fa-zap:before { + content: "\f0e7"; +} +.fa-glass-water:before { + content: "\e4f4"; +} +.fa-oil-well:before { + content: "\e532"; +} +.fa-vault:before { + content: "\e2c5"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-toilet:before { + content: "\f7d8"; +} +.fa-plane-circle-xmark:before { + content: "\e557"; +} +.fa-cny:before, +.fa-jpy:before, +.fa-rmb:before, +.fa-yen-sign:before, +.fa-yen:before { + content: "\f157"; +} +.fa-rouble:before, +.fa-rub:before, +.fa-ruble-sign:before, +.fa-ruble:before { + content: "\f158"; +} +.fa-sun:before { + content: "\f185"; +} +.fa-guitar:before { + content: "\f7a6"; +} +.fa-face-laugh-wink:before, +.fa-laugh-wink:before { + content: "\f59c"; +} +.fa-horse-head:before { + content: "\f7ab"; +} +.fa-bore-hole:before { + content: "\e4c3"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-arrow-alt-circle-down:before, +.fa-circle-down:before { + content: "\f358"; +} +.fa-arrows-turn-to-dots:before { + content: "\e4c1"; +} +.fa-florin-sign:before { + content: "\e184"; +} +.fa-arrow-down-short-wide:before, +.fa-sort-amount-desc:before, +.fa-sort-amount-down-alt:before { + content: "\f884"; +} +.fa-less-than:before { + content: "\3c"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-car-tunnel:before { + content: "\e4de"; +} +.fa-head-side-cough:before { + content: "\e061"; +} +.fa-grip-lines:before { + content: "\f7a4"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-user-lock:before { + content: "\f502"; +} +.fa-arrow-right-long:before, +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-anchor-circle-xmark:before { + content: "\e4ac"; +} +.fa-ellipsis-h:before, +.fa-ellipsis:before { + content: "\f141"; +} +.fa-chess-pawn:before { + content: "\f443"; +} +.fa-first-aid:before, +.fa-kit-medical:before { + content: "\f479"; +} +.fa-person-through-window:before { + content: "\e5a9"; +} +.fa-toolbox:before { + content: "\f552"; +} +.fa-hands-holding-circle:before { + content: "\e4fb"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-credit-card-alt:before, +.fa-credit-card:before { + content: "\f09d"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-hand-holding-hand:before { + content: "\e4f7"; +} +.fa-book-open-reader:before, +.fa-book-reader:before { + content: "\f5da"; +} +.fa-mountain-sun:before { + content: "\e52f"; +} +.fa-arrows-left-right-to-line:before { + content: "\e4ba"; +} +.fa-dice-d20:before { + content: "\f6cf"; +} +.fa-truck-droplet:before { + content: "\e58c"; +} +.fa-file-circle-xmark:before { + content: "\e5a1"; +} +.fa-temperature-arrow-up:before, +.fa-temperature-up:before { + content: "\e040"; +} +.fa-medal:before { + content: "\f5a2"; +} +.fa-bed:before { + content: "\f236"; +} +.fa-h-square:before, +.fa-square-h:before { + content: "\f0fd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-temperature-4:before, +.fa-temperature-full:before, +.fa-thermometer-4:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-plug-circle-xmark:before { + content: "\e560"; +} +.fa-star-of-life:before { + content: "\f621"; +} +.fa-phone-slash:before { + content: "\f3dd"; +} +.fa-paint-roller:before { + content: "\f5aa"; +} +.fa-hands-helping:before, +.fa-handshake-angle:before { + content: "\f4c4"; +} +.fa-location-dot:before, +.fa-map-marker-alt:before { + content: "\f3c5"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-greater-than:before { + content: "\3e"; +} +.fa-person-swimming:before, +.fa-swimmer:before { + content: "\f5c4"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-droplet:before, +.fa-tint:before { + content: "\f043"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-earth-america:before, +.fa-earth-americas:before, +.fa-earth:before, +.fa-globe-americas:before { + content: "\f57d"; +} +.fa-person-burst:before { + content: "\e53b"; +} +.fa-dove:before { + content: "\f4ba"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-socks:before { + content: "\f696"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-section:before { + content: "\e447"; +} +.fa-gauge-high:before, +.fa-tachometer-alt-fast:before, +.fa-tachometer-alt:before { + content: "\f625"; +} +.fa-envelope-open-text:before { + content: "\f658"; +} +.fa-hospital-alt:before, +.fa-hospital-wide:before, +.fa-hospital:before { + content: "\f0f8"; +} +.fa-wine-bottle:before { + content: "\f72f"; +} +.fa-chess-rook:before { + content: "\f447"; +} +.fa-bars-staggered:before, +.fa-reorder:before, +.fa-stream:before { + content: "\f550"; +} +.fa-dharmachakra:before { + content: "\f655"; +} +.fa-hotdog:before { + content: "\f80f"; +} +.fa-blind:before, +.fa-person-walking-with-cane:before { + content: "\f29d"; +} +.fa-drum:before { + content: "\f569"; +} +.fa-ice-cream:before { + content: "\f810"; +} +.fa-heart-circle-bolt:before { + content: "\e4fc"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-check-to-slot:before, +.fa-vote-yea:before { + content: "\f772"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-boxes-alt:before, +.fa-boxes-stacked:before, +.fa-boxes:before { + content: "\f468"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-assistive-listening-systems:before, +.fa-ear-listen:before { + content: "\f2a2"; +} +.fa-tree-city:before { + content: "\e587"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-font:before { + content: "\f031"; +} +.fa-table-cells-row-lock:before { + content: "\e67a"; +} +.fa-rupiah-sign:before { + content: "\e23d"; +} +.fa-magnifying-glass:before, +.fa-search:before { + content: "\f002"; +} +.fa-ping-pong-paddle-ball:before, +.fa-table-tennis-paddle-ball:before, +.fa-table-tennis:before { + content: "\f45d"; +} +.fa-diagnoses:before, +.fa-person-dots-from-line:before { + content: "\f470"; +} +.fa-trash-can-arrow-up:before, +.fa-trash-restore-alt:before { + content: "\f82a"; +} +.fa-naira-sign:before { + content: "\e1f6"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-walkie-talkie:before { + content: "\f8ef"; +} +.fa-file-edit:before, +.fa-file-pen:before { + content: "\f31c"; +} +.fa-receipt:before { + content: "\f543"; +} +.fa-pen-square:before, +.fa-pencil-square:before, +.fa-square-pen:before { + content: "\f14b"; +} +.fa-suitcase-rolling:before { + content: "\f5c1"; +} +.fa-person-circle-exclamation:before { + content: "\e53f"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-battery-5:before, +.fa-battery-full:before, +.fa-battery:before { + content: "\f240"; +} +.fa-skull-crossbones:before { + content: "\f714"; +} +.fa-code-compare:before { + content: "\e13a"; +} +.fa-list-dots:before, +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-school-lock:before { + content: "\e56f"; +} +.fa-tower-cell:before { + content: "\e585"; +} +.fa-down-long:before, +.fa-long-arrow-alt-down:before { + content: "\f309"; +} +.fa-ranking-star:before { + content: "\e561"; +} +.fa-chess-king:before { + content: "\f43f"; +} +.fa-person-harassing:before { + content: "\e549"; +} +.fa-brazilian-real-sign:before { + content: "\e46c"; +} +.fa-landmark-alt:before, +.fa-landmark-dome:before { + content: "\f752"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-television:before, +.fa-tv-alt:before, +.fa-tv:before { + content: "\f26c"; +} +.fa-shrimp:before { + content: "\e448"; +} +.fa-list-check:before, +.fa-tasks:before { + content: "\f0ae"; +} +.fa-jug-detergent:before { + content: "\e519"; +} +.fa-circle-user:before, +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-shield:before { + content: "\f505"; +} +.fa-wind:before { + content: "\f72e"; +} +.fa-car-burst:before, +.fa-car-crash:before { + content: "\f5e1"; +} +.fa-y:before { + content: "\59"; +} +.fa-person-snowboarding:before, +.fa-snowboarding:before { + content: "\f7ce"; +} +.fa-shipping-fast:before, +.fa-truck-fast:before { + content: "\f48b"; +} +.fa-fish:before { + content: "\f578"; +} +.fa-user-graduate:before { + content: "\f501"; +} +.fa-adjust:before, +.fa-circle-half-stroke:before { + content: "\f042"; +} +.fa-clapperboard:before { + content: "\e131"; +} +.fa-circle-radiation:before, +.fa-radiation-alt:before { + content: "\f7ba"; +} +.fa-baseball-ball:before, +.fa-baseball:before { + content: "\f433"; +} +.fa-jet-fighter-up:before { + content: "\e518"; +} +.fa-diagram-project:before, +.fa-project-diagram:before { + content: "\f542"; +} +.fa-copy:before { + content: "\f0c5"; +} +.fa-volume-mute:before, +.fa-volume-times:before, +.fa-volume-xmark:before { + content: "\f6a9"; +} +.fa-hand-sparkles:before { + content: "\e05d"; +} +.fa-grip-horizontal:before, +.fa-grip:before { + content: "\f58d"; +} +.fa-share-from-square:before, +.fa-share-square:before { + content: "\f14d"; +} +.fa-child-combatant:before, +.fa-child-rifle:before { + content: "\e4e0"; +} +.fa-gun:before { + content: "\e19b"; +} +.fa-phone-square:before, +.fa-square-phone:before { + content: "\f098"; +} +.fa-add:before, +.fa-plus:before { + content: "\2b"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-computer:before { + content: "\e4e5"; +} +.fa-close:before, +.fa-multiply:before, +.fa-remove:before, +.fa-times:before, +.fa-xmark:before { + content: "\f00d"; +} +.fa-arrows-up-down-left-right:before, +.fa-arrows:before { + content: "\f047"; +} +.fa-chalkboard-teacher:before, +.fa-chalkboard-user:before { + content: "\f51c"; +} +.fa-peso-sign:before { + content: "\e222"; +} +.fa-building-shield:before { + content: "\e4d8"; +} +.fa-baby:before { + content: "\f77c"; +} +.fa-users-line:before { + content: "\e592"; +} +.fa-quote-left-alt:before, +.fa-quote-left:before { + content: "\f10d"; +} +.fa-tractor:before { + content: "\f722"; +} +.fa-trash-arrow-up:before, +.fa-trash-restore:before { + content: "\f829"; +} +.fa-arrow-down-up-lock:before { + content: "\e4b0"; +} +.fa-lines-leaning:before { + content: "\e51e"; +} +.fa-ruler-combined:before { + content: "\f546"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-equals:before { + content: "\3d"; +} +.fa-blender:before { + content: "\f517"; +} +.fa-teeth:before { + content: "\f62e"; +} +.fa-ils:before, +.fa-shekel-sign:before, +.fa-shekel:before, +.fa-sheqel-sign:before, +.fa-sheqel:before { + content: "\f20b"; +} +.fa-map:before { + content: "\f279"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-photo-film:before, +.fa-photo-video:before { + content: "\f87c"; +} +.fa-folder-minus:before { + content: "\f65d"; +} +.fa-store:before { + content: "\f54e"; +} +.fa-arrow-trend-up:before { + content: "\e098"; +} +.fa-plug-circle-minus:before { + content: "\e55e"; +} +.fa-sign-hanging:before, +.fa-sign:before { + content: "\f4d9"; +} +.fa-bezier-curve:before { + content: "\f55b"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-tablet-android:before, +.fa-tablet:before { + content: "\f3fb"; +} +.fa-school-flag:before { + content: "\e56e"; +} +.fa-fill:before { + content: "\f575"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-drumstick-bite:before { + content: "\f6d7"; +} +.fa-holly-berry:before { + content: "\f7aa"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-bacteria:before { + content: "\e059"; +} +.fa-hand-lizard:before { + content: "\f258"; +} +.fa-notdef:before { + content: "\e1fe"; +} +.fa-disease:before { + content: "\f7fa"; +} +.fa-briefcase-medical:before { + content: "\f469"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-car-alt:before, +.fa-car-rear:before { + content: "\f5de"; +} +.fa-pump-soap:before { + content: "\e06b"; +} +.fa-video-slash:before { + content: "\f4e2"; +} +.fa-battery-2:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-radio:before { + content: "\f8d7"; +} +.fa-baby-carriage:before, +.fa-carriage-baby:before { + content: "\f77d"; +} +.fa-traffic-light:before { + content: "\f637"; +} +.fa-thermometer:before { + content: "\f491"; +} +.fa-vr-cardboard:before { + content: "\f729"; +} +.fa-hand-middle-finger:before { + content: "\f806"; +} +.fa-percent:before, +.fa-percentage:before { + content: "\25"; +} +.fa-truck-moving:before { + content: "\f4df"; +} +.fa-glass-water-droplet:before { + content: "\e4f5"; +} +.fa-display:before { + content: "\e163"; +} +.fa-face-smile:before, +.fa-smile:before { + content: "\f118"; +} +.fa-thumb-tack:before, +.fa-thumbtack:before { + content: "\f08d"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-person-praying:before, +.fa-pray:before { + content: "\f683"; +} +.fa-hammer:before { + content: "\f6e3"; +} +.fa-hand-peace:before { + content: "\f25b"; +} +.fa-rotate:before, +.fa-sync-alt:before { + content: "\f2f1"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-robot:before { + content: "\f544"; +} +.fa-peace:before { + content: "\f67c"; +} +.fa-cogs:before, +.fa-gears:before { + content: "\f085"; +} +.fa-warehouse:before { + content: "\f494"; +} +.fa-arrow-up-right-dots:before { + content: "\e4b7"; +} +.fa-splotch:before { + content: "\f5bc"; +} +.fa-face-grin-hearts:before, +.fa-grin-hearts:before { + content: "\f584"; +} +.fa-dice-four:before { + content: "\f524"; +} +.fa-sim-card:before { + content: "\f7c4"; +} +.fa-transgender-alt:before, +.fa-transgender:before { + content: "\f225"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-arrow-turn-down:before, +.fa-level-down:before { + content: "\f149"; +} +.fa-person-falling-burst:before { + content: "\e547"; +} +.fa-award:before { + content: "\f559"; +} +.fa-ticket-alt:before, +.fa-ticket-simple:before { + content: "\f3ff"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-angle-double-left:before, +.fa-angles-left:before { + content: "\f100"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-clock-rotate-left:before, +.fa-history:before { + content: "\f1da"; +} +.fa-face-grin-beam-sweat:before, +.fa-grin-beam-sweat:before { + content: "\f583"; +} +.fa-arrow-right-from-file:before, +.fa-file-export:before { + content: "\f56e"; +} +.fa-shield-blank:before, +.fa-shield:before { + content: "\f132"; +} +.fa-arrow-up-short-wide:before, +.fa-sort-amount-up-alt:before { + content: "\f885"; +} +.fa-house-medical:before { + content: "\e3b2"; +} +.fa-golf-ball-tee:before, +.fa-golf-ball:before { + content: "\f450"; +} +.fa-chevron-circle-left:before, +.fa-circle-chevron-left:before { + content: "\f137"; +} +.fa-house-chimney-window:before { + content: "\e00d"; +} +.fa-pen-nib:before { + content: "\f5ad"; +} +.fa-tent-arrow-turn-left:before { + content: "\e580"; +} +.fa-tents:before { + content: "\e582"; +} +.fa-magic:before, +.fa-wand-magic:before { + content: "\f0d0"; +} +.fa-dog:before { + content: "\f6d3"; +} +.fa-carrot:before { + content: "\f787"; +} +.fa-moon:before { + content: "\f186"; +} +.fa-wine-glass-alt:before, +.fa-wine-glass-empty:before { + content: "\f5ce"; +} +.fa-cheese:before { + content: "\f7ef"; +} +.fa-yin-yang:before { + content: "\f6ad"; +} +.fa-music:before { + content: "\f001"; +} +.fa-code-commit:before { + content: "\f386"; +} +.fa-temperature-low:before { + content: "\f76b"; +} +.fa-biking:before, +.fa-person-biking:before { + content: "\f84a"; +} +.fa-broom:before { + content: "\f51a"; +} +.fa-shield-heart:before { + content: "\e574"; +} +.fa-gopuram:before { + content: "\f664"; +} +.fa-earth-oceania:before, +.fa-globe-oceania:before { + content: "\e47b"; +} +.fa-square-xmark:before, +.fa-times-square:before, +.fa-xmark-square:before { + content: "\f2d3"; +} +.fa-hashtag:before { + content: "\23"; +} +.fa-expand-alt:before, +.fa-up-right-and-down-left-from-center:before { + content: "\f424"; +} +.fa-oil-can:before { + content: "\f613"; +} +.fa-t:before { + content: "\54"; +} +.fa-hippo:before { + content: "\f6ed"; +} +.fa-chart-column:before { + content: "\e0e3"; +} +.fa-infinity:before { + content: "\f534"; +} +.fa-vial-circle-check:before { + content: "\e596"; +} +.fa-person-arrow-down-to-line:before { + content: "\e538"; +} +.fa-voicemail:before { + content: "\f897"; +} +.fa-fan:before { + content: "\f863"; +} +.fa-person-walking-luggage:before { + content: "\e554"; +} +.fa-arrows-alt-v:before, +.fa-up-down:before { + content: "\f338"; +} +.fa-cloud-moon-rain:before { + content: "\f73c"; +} +.fa-calendar:before { + content: "\f133"; +} +.fa-trailer:before { + content: "\e041"; +} +.fa-bahai:before, +.fa-haykal:before { + content: "\f666"; +} +.fa-sd-card:before { + content: "\f7c2"; +} +.fa-dragon:before { + content: "\f6d5"; +} +.fa-shoe-prints:before { + content: "\f54b"; +} +.fa-circle-plus:before, +.fa-plus-circle:before { + content: "\f055"; +} +.fa-face-grin-tongue-wink:before, +.fa-grin-tongue-wink:before { + content: "\f58b"; +} +.fa-hand-holding:before { + content: "\f4bd"; +} +.fa-plug-circle-exclamation:before { + content: "\e55d"; +} +.fa-chain-broken:before, +.fa-chain-slash:before, +.fa-link-slash:before, +.fa-unlink:before { + content: "\f127"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-person-walking-arrow-loop-left:before { + content: "\e551"; +} +.fa-arrow-up-z-a:before, +.fa-sort-alpha-up-alt:before { + content: "\f882"; +} +.fa-fire-alt:before, +.fa-fire-flame-curved:before { + content: "\f7e4"; +} +.fa-tornado:before { + content: "\f76f"; +} +.fa-file-circle-plus:before { + content: "\e494"; +} +.fa-book-quran:before, +.fa-quran:before { + content: "\f687"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-border-all:before { + content: "\f84c"; +} +.fa-angry:before, +.fa-face-angry:before { + content: "\f556"; +} +.fa-cookie-bite:before { + content: "\f564"; +} +.fa-arrow-trend-down:before { + content: "\e097"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-draw-polygon:before { + content: "\f5ee"; +} +.fa-balance-scale:before, +.fa-scale-balanced:before { + content: "\f24e"; +} +.fa-gauge-simple-high:before, +.fa-tachometer-fast:before, +.fa-tachometer:before { + content: "\f62a"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-desktop-alt:before, +.fa-desktop:before { + content: "\f390"; +} +.fa-m:before { + content: "\4d"; +} +.fa-table-list:before, +.fa-th-list:before { + content: "\f00b"; +} +.fa-comment-sms:before, +.fa-sms:before { + content: "\f7cd"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-battery-4:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-house-circle-check:before { + content: "\e509"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-diagram-successor:before { + content: "\e47a"; +} +.fa-truck-arrow-right:before { + content: "\e58b"; +} +.fa-arrows-split-up-and-left:before { + content: "\e4bc"; +} +.fa-fist-raised:before, +.fa-hand-fist:before { + content: "\f6de"; +} +.fa-cloud-moon:before { + content: "\f6c3"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-person-falling:before { + content: "\e546"; +} +.fa-image-portrait:before, +.fa-portrait:before { + content: "\f3e0"; +} +.fa-user-tag:before { + content: "\f507"; +} +.fa-rug:before { + content: "\e569"; +} +.fa-earth-europe:before, +.fa-globe-europe:before { + content: "\f7a2"; +} +.fa-cart-flatbed-suitcase:before, +.fa-luggage-cart:before { + content: "\f59d"; +} +.fa-rectangle-times:before, +.fa-rectangle-xmark:before, +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f410"; +} +.fa-baht-sign:before { + content: "\e0ac"; +} +.fa-book-open:before { + content: "\f518"; +} +.fa-book-journal-whills:before, +.fa-journal-whills:before { + content: "\f66a"; +} +.fa-handcuffs:before { + content: "\e4f8"; +} +.fa-exclamation-triangle:before, +.fa-triangle-exclamation:before, +.fa-warning:before { + content: "\f071"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-bottle-droplet:before { + content: "\e4c4"; +} +.fa-mask-face:before { + content: "\e1d7"; +} +.fa-hill-rockslide:before { + content: "\e508"; +} +.fa-exchange-alt:before, +.fa-right-left:before { + content: "\f362"; +} +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-road-circle-exclamation:before { + content: "\e565"; +} +.fa-dungeon:before { + content: "\f6d9"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-money-bill-1-wave:before, +.fa-money-bill-wave-alt:before { + content: "\f53b"; +} +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-hands:before, +.fa-sign-language:before, +.fa-signing:before { + content: "\f2a7"; +} +.fa-calendar-day:before { + content: "\f783"; +} +.fa-ladder-water:before, +.fa-swimming-pool:before, +.fa-water-ladder:before { + content: "\f5c5"; +} +.fa-arrows-up-down:before, +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-face-grimace:before, +.fa-grimace:before { + content: "\f57f"; +} +.fa-wheelchair-alt:before, +.fa-wheelchair-move:before { + content: "\e2ce"; +} +.fa-level-down-alt:before, +.fa-turn-down:before { + content: "\f3be"; +} +.fa-person-walking-arrow-right:before { + content: "\e552"; +} +.fa-envelope-square:before, +.fa-square-envelope:before { + content: "\f199"; +} +.fa-dice:before { + content: "\f522"; +} +.fa-bowling-ball:before { + content: "\f436"; +} +.fa-brain:before { + content: "\f5dc"; +} +.fa-band-aid:before, +.fa-bandage:before { + content: "\f462"; +} +.fa-calendar-minus:before { + content: "\f272"; +} +.fa-circle-xmark:before, +.fa-times-circle:before, +.fa-xmark-circle:before { + content: "\f057"; +} +.fa-gifts:before { + content: "\f79c"; +} +.fa-hotel:before { + content: "\f594"; +} +.fa-earth-asia:before, +.fa-globe-asia:before { + content: "\f57e"; +} +.fa-id-card-alt:before, +.fa-id-card-clip:before { + content: "\f47f"; +} +.fa-magnifying-glass-plus:before, +.fa-search-plus:before { + content: "\f00e"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-user-clock:before { + content: "\f4fd"; +} +.fa-allergies:before, +.fa-hand-dots:before { + content: "\f461"; +} +.fa-file-invoice:before { + content: "\f570"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-coffee:before, +.fa-mug-saucer:before { + content: "\f0f4"; +} +.fa-brush:before { + content: "\f55d"; +} +.fa-mask:before { + content: "\f6fa"; +} +.fa-magnifying-glass-minus:before, +.fa-search-minus:before { + content: "\f010"; +} +.fa-ruler-vertical:before { + content: "\f548"; +} +.fa-user-alt:before, +.fa-user-large:before { + content: "\f406"; +} +.fa-train-tram:before { + content: "\e5b4"; +} +.fa-user-nurse:before { + content: "\f82f"; +} +.fa-syringe:before { + content: "\f48e"; +} +.fa-cloud-sun:before { + content: "\f6c4"; +} +.fa-stopwatch-20:before { + content: "\e06f"; +} +.fa-square-full:before { + content: "\f45c"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-jar:before { + content: "\e516"; +} +.fa-note-sticky:before, +.fa-sticky-note:before { + content: "\f249"; +} +.fa-bug-slash:before { + content: "\e490"; +} +.fa-arrow-up-from-water-pump:before { + content: "\e4b6"; +} +.fa-bone:before { + content: "\f5d7"; +} +.fa-user-injured:before { + content: "\f728"; +} +.fa-face-sad-tear:before, +.fa-sad-tear:before { + content: "\f5b4"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-tent-arrows-down:before { + content: "\e581"; +} +.fa-exclamation:before { + content: "\21"; +} +.fa-arrows-spin:before { + content: "\e4bb"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-try:before, +.fa-turkish-lira-sign:before, +.fa-turkish-lira:before { + content: "\e2bb"; +} +.fa-dollar-sign:before, +.fa-dollar:before, +.fa-usd:before { + content: "\24"; +} +.fa-x:before { + content: "\58"; +} +.fa-magnifying-glass-dollar:before, +.fa-search-dollar:before { + content: "\f688"; +} +.fa-users-cog:before, +.fa-users-gear:before { + content: "\f509"; +} +.fa-person-military-pointing:before { + content: "\e54a"; +} +.fa-bank:before, +.fa-building-columns:before, +.fa-institution:before, +.fa-museum:before, +.fa-university:before { + content: "\f19c"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-trowel:before { + content: "\e589"; +} +.fa-d:before { + content: "\44"; +} +.fa-stapler:before { + content: "\e5af"; +} +.fa-masks-theater:before, +.fa-theater-masks:before { + content: "\f630"; +} +.fa-kip-sign:before { + content: "\e1c4"; +} +.fa-hand-point-left:before { + content: "\f0a5"; +} +.fa-handshake-alt:before, +.fa-handshake-simple:before { + content: "\f4c6"; +} +.fa-fighter-jet:before, +.fa-jet-fighter:before { + content: "\f0fb"; +} +.fa-share-alt-square:before, +.fa-square-share-nodes:before { + content: "\f1e1"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-plus-minus:before { + content: "\e43c"; +} +.fa-video-camera:before, +.fa-video:before { + content: "\f03d"; +} +.fa-graduation-cap:before, +.fa-mortar-board:before { + content: "\f19d"; +} +.fa-hand-holding-medical:before { + content: "\e05c"; +} +.fa-person-circle-check:before { + content: "\e53e"; +} +.fa-level-up-alt:before, +.fa-turn-up:before { + content: "\f3bf"; +} +.fa-sr-only, +.fa-sr-only-focusable:not(:focus), +.sr-only, +.sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} +:host, +:root { + --fa-style-family-brands: "Font Awesome 6 Brands"; + --fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands"; +} +@font-face { + font-family: "Font Awesome 6 Brands"; + font-style: normal; + font-weight: 400; + font-display: block; + src: url(../webfonts/fa-brands-400.woff2) format("woff2"), + url(../webfonts/fa-brands-400.ttf) format("truetype"); +} +.fa-brands, +.fab { + font-weight: 400; +} +.fa-monero:before { + content: "\f3d0"; +} +.fa-hooli:before { + content: "\f427"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-shopware:before { + content: "\f5b5"; +} +.fa-creative-commons-nc:before { + content: "\f4e8"; +} +.fa-aws:before { + content: "\f375"; +} +.fa-redhat:before { + content: "\f7bc"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-cloudflare:before { + content: "\e07d"; +} +.fa-ups:before { + content: "\f7e0"; +} +.fa-pixiv:before { + content: "\e640"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-dyalog:before { + content: "\f399"; +} +.fa-bity:before { + content: "\f37a"; +} +.fa-stackpath:before { + content: "\f842"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-guilded:before { + content: "\e07e"; +} +.fa-vnv:before { + content: "\f40b"; +} +.fa-js-square:before, +.fa-square-js:before { + content: "\f3b9"; +} +.fa-microsoft:before { + content: "\f3ca"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-orcid:before { + content: "\f8d2"; +} +.fa-java:before { + content: "\f4e4"; +} +.fa-invision:before { + content: "\f7b0"; +} +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; +} +.fa-centercode:before { + content: "\f380"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-jxl:before { + content: "\e67b"; +} +.fa-hire-a-helper:before { + content: "\f3b0"; +} +.fa-creative-commons-by:before { + content: "\f4e7"; +} +.fa-unity:before { + content: "\e049"; +} +.fa-whmcs:before { + content: "\f40d"; +} +.fa-rocketchat:before { + content: "\f3e8"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-untappd:before { + content: "\f405"; +} +.fa-mailchimp:before { + content: "\f59e"; +} +.fa-css3-alt:before { + content: "\f38b"; +} +.fa-reddit-square:before, +.fa-square-reddit:before { + content: "\f1a2"; +} +.fa-vimeo-v:before { + content: "\f27d"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-square-font-awesome:before { + content: "\e5ad"; +} +.fa-deskpro:before { + content: "\f38f"; +} +.fa-brave:before { + content: "\e63c"; +} +.fa-sistrix:before { + content: "\f3ee"; +} +.fa-instagram-square:before, +.fa-square-instagram:before { + content: "\e055"; +} +.fa-battle-net:before { + content: "\f835"; +} +.fa-the-red-yeti:before { + content: "\f69d"; +} +.fa-hacker-news-square:before, +.fa-square-hacker-news:before { + content: "\f3af"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-threads:before { + content: "\e618"; +} +.fa-napster:before { + content: "\f3d2"; +} +.fa-snapchat-square:before, +.fa-square-snapchat:before { + content: "\f2ad"; +} +.fa-google-plus-g:before { + content: "\f0d5"; +} +.fa-artstation:before { + content: "\f77a"; +} +.fa-markdown:before { + content: "\f60f"; +} +.fa-sourcetree:before { + content: "\f7d3"; +} +.fa-google-plus:before { + content: "\f2b3"; +} +.fa-diaspora:before { + content: "\f791"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-phoenix-squadron:before { + content: "\f511"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-algolia:before { + content: "\f36c"; +} +.fa-red-river:before { + content: "\f3e3"; +} +.fa-creative-commons-sa:before { + content: "\f4ef"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-font-awesome-alt:before, +.fa-square-font-awesome-stroke:before { + content: "\f35c"; +} +.fa-atlassian:before { + content: "\f77b"; +} +.fa-linkedin-in:before { + content: "\f0e1"; +} +.fa-digital-ocean:before { + content: "\f391"; +} +.fa-nimblr:before { + content: "\f5a8"; +} +.fa-chromecast:before { + content: "\f838"; +} +.fa-evernote:before { + content: "\f839"; +} +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-creative-commons-sampling:before { + content: "\f4f0"; +} +.fa-adversal:before { + content: "\f36a"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-watchman-monitoring:before { + content: "\e087"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-weixin:before { + content: "\f1d7"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-git-alt:before { + content: "\f841"; +} +.fa-lyft:before { + content: "\f3c3"; +} +.fa-rev:before { + content: "\f5b2"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-wizards-of-the-coast:before { + content: "\f730"; +} +.fa-square-viadeo:before, +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.fa-centos:before { + content: "\f789"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-cloudsmith:before { + content: "\f384"; +} +.fa-opensuse:before { + content: "\e62b"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-dribbble-square:before, +.fa-square-dribbble:before { + content: "\f397"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-node:before { + content: "\f419"; +} +.fa-mix:before { + content: "\f3cb"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-cc-apple-pay:before { + content: "\f416"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-debian:before { + content: "\e60b"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-instalod:before { + content: "\e081"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-sellcast:before { + content: "\f2da"; +} +.fa-square-twitter:before, +.fa-twitter-square:before { + content: "\f081"; +} +.fa-r-project:before { + content: "\f4f7"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-freebsd:before { + content: "\f3a4"; +} +.fa-vuejs:before { + content: "\f41f"; +} +.fa-accusoft:before { + content: "\f369"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-fonticons-fi:before { + content: "\f3a2"; +} +.fa-app-store:before { + content: "\f36f"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-itunes-note:before { + content: "\f3b5"; +} +.fa-golang:before { + content: "\e40f"; +} +.fa-kickstarter:before, +.fa-square-kickstarter:before { + content: "\f3bb"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-uncharted:before { + content: "\e084"; +} +.fa-firstdraft:before { + content: "\f3a1"; +} +.fa-square-youtube:before, +.fa-youtube-square:before { + content: "\f431"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-rendact:before, +.fa-wpressr:before { + content: "\f3e4"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-galactic-republic:before { + content: "\f50c"; +} +.fa-nfc-directional:before { + content: "\e530"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-joget:before { + content: "\f3b7"; +} +.fa-fedora:before { + content: "\f798"; +} +.fa-stripe-s:before { + content: "\f42a"; +} +.fa-meta:before { + content: "\e49b"; +} +.fa-laravel:before { + content: "\f3bd"; +} +.fa-hotjar:before { + content: "\f3b1"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-square-letterboxd:before { + content: "\e62e"; +} +.fa-sticker-mule:before { + content: "\f3f7"; +} +.fa-creative-commons-zero:before { + content: "\f4f3"; +} +.fa-hips:before { + content: "\f452"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-discord:before { + content: "\f392"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-app-store-ios:before { + content: "\f370"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-confluence:before { + content: "\f78d"; +} +.fa-shoelace:before { + content: "\e60c"; +} +.fa-mdb:before { + content: "\f8ca"; +} +.fa-dochub:before { + content: "\f394"; +} +.fa-accessible-icon:before { + content: "\f368"; +} +.fa-ebay:before { + content: "\f4f4"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-unsplash:before { + content: "\e07c"; +} +.fa-yarn:before { + content: "\f7e3"; +} +.fa-square-steam:before, +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-square-vimeo:before, +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-asymmetrik:before { + content: "\f372"; +} +.fa-font-awesome-flag:before, +.fa-font-awesome-logo-full:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-gratipay:before { + content: "\f184"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-hive:before { + content: "\e07f"; +} +.fa-gitkraken:before { + content: "\f3a6"; +} +.fa-keybase:before { + content: "\f4f5"; +} +.fa-apple-pay:before { + content: "\f415"; +} +.fa-padlet:before { + content: "\e4a0"; +} +.fa-amazon-pay:before { + content: "\f42c"; +} +.fa-github-square:before, +.fa-square-github:before { + content: "\f092"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-fedex:before { + content: "\f797"; +} +.fa-phoenix-framework:before { + content: "\f3dc"; +} +.fa-shopify:before { + content: "\e057"; +} +.fa-neos:before { + content: "\f612"; +} +.fa-square-threads:before { + content: "\e619"; +} +.fa-hackerrank:before { + content: "\f5f7"; +} +.fa-researchgate:before { + content: "\f4f8"; +} +.fa-swift:before { + content: "\f8e1"; +} +.fa-angular:before { + content: "\f420"; +} +.fa-speakap:before { + content: "\f3f3"; +} +.fa-angrycreative:before { + content: "\f36e"; +} +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-empire:before { + content: "\f1d1"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-google-scholar:before { + content: "\e63b"; +} +.fa-gitlab-square:before, +.fa-square-gitlab:before { + content: "\e5ae"; +} +.fa-studiovinari:before { + content: "\f3f8"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-goodreads:before { + content: "\f3a8"; +} +.fa-odnoklassniki-square:before, +.fa-square-odnoklassniki:before { + content: "\f264"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-sith:before { + content: "\f512"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-page4:before { + content: "\f3d7"; +} +.fa-hashnode:before { + content: "\e499"; +} +.fa-react:before { + content: "\f41b"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-squarespace:before { + content: "\f5be"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-creative-commons-share:before { + content: "\f4f2"; +} +.fa-bitcoin:before { + content: "\f379"; +} +.fa-keycdn:before { + content: "\f3ba"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-itch-io:before { + content: "\f83a"; +} +.fa-umbraco:before { + content: "\f8e8"; +} +.fa-galactic-senate:before { + content: "\f50d"; +} +.fa-ubuntu:before { + content: "\f7df"; +} +.fa-draft2digital:before { + content: "\f396"; +} +.fa-stripe:before { + content: "\f429"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-dhl:before { + content: "\f790"; +} +.fa-pinterest-square:before, +.fa-square-pinterest:before { + content: "\f0d3"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-blackberry:before { + content: "\f37b"; +} +.fa-creative-commons-pd:before { + content: "\f4ec"; +} +.fa-playstation:before { + content: "\f3df"; +} +.fa-quinscape:before { + content: "\f459"; +} +.fa-less:before { + content: "\f41d"; +} +.fa-blogger-b:before { + content: "\f37d"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-signal-messenger:before { + content: "\e663"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-typo3:before { + content: "\f42b"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-dailymotion:before { + content: "\e052"; +} +.fa-affiliatetheme:before { + content: "\f36b"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-bootstrap:before { + content: "\f836"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-nfc-symbol:before { + content: "\e531"; +} +.fa-mintbit:before { + content: "\e62f"; +} +.fa-ethereum:before { + content: "\f42e"; +} +.fa-speaker-deck:before { + content: "\f83c"; +} +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; +} +.fa-patreon:before { + content: "\f3d9"; +} +.fa-avianex:before { + content: "\f374"; +} +.fa-ello:before { + content: "\f5f1"; +} +.fa-gofore:before { + content: "\f3a7"; +} +.fa-bimobject:before { + content: "\f378"; +} +.fa-brave-reverse:before { + content: "\e63d"; +} +.fa-facebook-f:before { + content: "\f39e"; +} +.fa-google-plus-square:before, +.fa-square-google-plus:before { + content: "\f0d4"; +} +.fa-web-awesome:before { + content: "\e682"; +} +.fa-mandalorian:before { + content: "\f50f"; +} +.fa-first-order-alt:before { + content: "\f50a"; +} +.fa-osi:before { + content: "\f41a"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-d-and-d-beyond:before { + content: "\f6ca"; +} +.fa-periscope:before { + content: "\f3da"; +} +.fa-fulcrum:before { + content: "\f50b"; +} +.fa-cloudscale:before { + content: "\f383"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-mizuni:before { + content: "\f3cc"; +} +.fa-schlix:before { + content: "\f3ea"; +} +.fa-square-xing:before, +.fa-xing-square:before { + content: "\f169"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-cloudversify:before { + content: "\f385"; +} +.fa-usps:before { + content: "\f7e1"; +} +.fa-megaport:before { + content: "\f5a3"; +} +.fa-magento:before { + content: "\f3c4"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-fly:before { + content: "\f417"; +} +.fa-aviato:before { + content: "\f421"; +} +.fa-itunes:before { + content: "\f3b4"; +} +.fa-cuttlefish:before { + content: "\f38c"; +} +.fa-blogger:before { + content: "\f37c"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-viber:before { + content: "\f409"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-letterboxd:before { + content: "\e62d"; +} +.fa-symfony:before { + content: "\f83d"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-facebook-messenger:before { + content: "\f39f"; +} +.fa-audible:before { + content: "\f373"; +} +.fa-think-peaks:before { + content: "\f731"; +} +.fa-bilibili:before { + content: "\e3d9"; +} +.fa-erlang:before { + content: "\f39d"; +} +.fa-x-twitter:before { + content: "\e61b"; +} +.fa-cotton-bureau:before { + content: "\f89e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-42-group:before, +.fa-innosoft:before { + content: "\e080"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-elementor:before { + content: "\f430"; +} +.fa-pied-piper-square:before, +.fa-square-pied-piper:before { + content: "\e01e"; +} +.fa-creative-commons-nd:before { + content: "\f4eb"; +} +.fa-palfed:before { + content: "\f3d8"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-resolving:before { + content: "\f3e7"; +} +.fa-xbox:before { + content: "\f412"; +} +.fa-square-web-awesome-stroke:before { + content: "\e684"; +} +.fa-searchengin:before { + content: "\f3eb"; +} +.fa-tiktok:before { + content: "\e07b"; +} +.fa-facebook-square:before, +.fa-square-facebook:before { + content: "\f082"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-linkedin:before { + content: "\f08c"; +} +.fa-hubspot:before { + content: "\f3b2"; +} +.fa-deploydog:before { + content: "\f38e"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-mixer:before { + content: "\e056"; +} +.fa-lastfm-square:before, +.fa-square-lastfm:before { + content: "\f203"; +} +.fa-vimeo:before { + content: "\f40a"; +} +.fa-mendeley:before { + content: "\f7b3"; +} +.fa-uniregistry:before { + content: "\f404"; +} +.fa-figma:before { + content: "\f799"; +} +.fa-creative-commons-remix:before { + content: "\f4ee"; +} +.fa-cc-amazon-pay:before { + content: "\f42d"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-cmplid:before { + content: "\e360"; +} +.fa-upwork:before { + content: "\e641"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-gripfire:before { + content: "\f3ac"; +} +.fa-jedi-order:before { + content: "\f50e"; +} +.fa-uikit:before { + content: "\f403"; +} +.fa-fort-awesome-alt:before { + content: "\f3a3"; +} +.fa-phabricator:before { + content: "\f3db"; +} +.fa-ussunnah:before { + content: "\f407"; +} +.fa-earlybirds:before { + content: "\f39a"; +} +.fa-trade-federation:before { + content: "\f513"; +} +.fa-autoprefixer:before { + content: "\f41c"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-square-upwork:before { + content: "\e67c"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-google-play:before { + content: "\f3ab"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-line:before { + content: "\f3c0"; +} +.fa-google-drive:before { + content: "\f3aa"; +} +.fa-servicestack:before { + content: "\f3ec"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-deezer:before { + content: "\e077"; +} +.fa-raspberry-pi:before { + content: "\f7bb"; +} +.fa-jira:before { + content: "\f7b1"; +} +.fa-docker:before { + content: "\f395"; +} +.fa-screenpal:before { + content: "\e570"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-gitter:before { + content: "\f426"; +} +.fa-d-and-d:before { + content: "\f38d"; +} +.fa-microblog:before { + content: "\e01a"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-pied-piper-hat:before { + content: "\f4e5"; +} +.fa-kickstarter-k:before { + content: "\f3bc"; +} +.fa-yandex:before { + content: "\f413"; +} +.fa-readme:before { + content: "\f4d5"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-square-web-awesome:before { + content: "\e683"; +} +.fa-sass:before { + content: "\f41e"; +} +.fa-wirsindhandwerk:before, +.fa-wsh:before { + content: "\e2d0"; +} +.fa-buromobelexperte:before { + content: "\f37f"; +} +.fa-salesforce:before { + content: "\f83b"; +} +.fa-octopus-deploy:before { + content: "\e082"; +} +.fa-medapps:before { + content: "\f3c6"; +} +.fa-ns8:before { + content: "\f3d5"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-apper:before { + content: "\f371"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-waze:before { + content: "\f83f"; +} +.fa-bluesky:before { + content: "\e671"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-snapchat-ghost:before, +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-fantasy-flight-games:before { + content: "\f6dc"; +} +.fa-rust:before { + content: "\e07a"; +} +.fa-wix:before { + content: "\f5cf"; +} +.fa-behance-square:before, +.fa-square-behance:before { + content: "\f1b5"; +} +.fa-supple:before { + content: "\f3f9"; +} +.fa-webflow:before { + content: "\e65c"; +} +.fa-rebel:before { + content: "\f1d0"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-staylinked:before { + content: "\f3f5"; +} +.fa-kaggle:before { + content: "\f5fa"; +} +.fa-space-awesome:before { + content: "\e5ac"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-cpanel:before { + content: "\f388"; +} +.fa-goodreads-g:before { + content: "\f3a9"; +} +.fa-git-square:before, +.fa-square-git:before { + content: "\f1d2"; +} +.fa-square-tumblr:before, +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-perbyte:before { + content: "\e083"; +} +.fa-grunt:before { + content: "\f3ad"; +} +.fa-weebly:before { + content: "\f5cc"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-themeco:before { + content: "\f5c6"; +} +.fa-python:before { + content: "\f3e2"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-bots:before { + content: "\e340"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-hornbill:before { + content: "\f592"; +} +.fa-js:before { + content: "\f3b8"; +} +.fa-ideal:before { + content: "\e013"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-dev:before { + content: "\f6cc"; +} +.fa-sketch:before { + content: "\f7c6"; +} +.fa-yandex-international:before { + content: "\f414"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-uber:before { + content: "\f402"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-php:before { + content: "\f457"; +} +.fa-alipay:before { + content: "\f642"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-firefox-browser:before { + content: "\e007"; +} +.fa-replyd:before { + content: "\f3e6"; +} +.fa-suse:before { + content: "\f7d6"; +} +.fa-jenkins:before { + content: "\f3b6"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-rockrms:before { + content: "\f3e9"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-buffer:before { + content: "\f837"; +} +.fa-npm:before { + content: "\f3d4"; +} +.fa-yammer:before { + content: "\f840"; +} +.fa-btc:before { + content: "\f15a"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-stubber:before { + content: "\e5c7"; +} +.fa-telegram-plane:before, +.fa-telegram:before { + content: "\f2c6"; +} +.fa-old-republic:before { + content: "\f510"; +} +.fa-odysee:before { + content: "\e5c6"; +} +.fa-square-whatsapp:before, +.fa-whatsapp-square:before { + content: "\f40c"; +} +.fa-node-js:before { + content: "\f3d3"; +} +.fa-edge-legacy:before { + content: "\e078"; +} +.fa-slack-hash:before, +.fa-slack:before { + content: "\f198"; +} +.fa-medrt:before { + content: "\f3c8"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-vaadin:before { + content: "\f408"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-square-x-twitter:before { + content: "\e61a"; +} +.fa-reacteurope:before { + content: "\f75d"; +} +.fa-medium-m:before, +.fa-medium:before { + content: "\f23a"; +} +.fa-amilia:before { + content: "\f36d"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-flipboard:before { + content: "\f44d"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-critical-role:before { + content: "\f6c9"; +} +.fa-sitrox:before { + content: "\e44a"; +} +.fa-discourse:before { + content: "\f393"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-mastodon:before { + content: "\f4f6"; +} +.fa-airbnb:before { + content: "\f834"; +} +.fa-wolf-pack-battalion:before { + content: "\f514"; +} +.fa-buy-n-large:before { + content: "\f8a6"; +} +.fa-gulp:before { + content: "\f3ae"; +} +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; +} +.fa-strava:before { + content: "\f428"; +} +.fa-ember:before { + content: "\f423"; +} +.fa-canadian-maple-leaf:before { + content: "\f785"; +} +.fa-teamspeak:before { + content: "\f4f9"; +} +.fa-pushed:before { + content: "\f3e1"; +} +.fa-wordpress-simple:before { + content: "\f411"; +} +.fa-nutritionix:before { + content: "\f3d6"; +} +.fa-wodu:before { + content: "\e088"; +} +.fa-google-pay:before { + content: "\e079"; +} +.fa-intercom:before { + content: "\f7af"; +} +.fa-zhihu:before { + content: "\f63f"; +} +.fa-korvue:before { + content: "\f42f"; +} +.fa-pix:before { + content: "\e43a"; +} +.fa-steam-symbol:before { + content: "\f3f6"; +} +:host, +:root { + --fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free"; +} +@font-face { + font-family: "Font Awesome 6 Free"; + font-style: normal; + font-weight: 400; + font-display: block; + src: url(../webfonts/fa-regular-400.woff2) format("woff2"), + url(../webfonts/fa-regular-400.ttf) format("truetype"); +} +.fa-regular, +.far { + font-weight: 400; +} +:host, +:root { + --fa-style-family-classic: "Font Awesome 6 Free"; + --fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free"; +} +@font-face { + font-family: "Font Awesome 6 Free"; + font-style: normal; + font-weight: 900; + font-display: block; + src: url(../webfonts/fa-solid-900.woff2) format("woff2"), + url(../webfonts/fa-solid-900.ttf) format("truetype"); +} +.fa-solid, +.fas { + font-weight: 900; +} +@font-face { + font-family: "Font Awesome 5 Brands"; + font-display: block; + font-weight: 400; + src: url(../webfonts/fa-brands-400.woff2) format("woff2"), + url(../webfonts/fa-brands-400.ttf) format("truetype"); +} +@font-face { + font-family: "Font Awesome 5 Free"; + font-display: block; + font-weight: 900; + src: url(../webfonts/fa-solid-900.woff2) format("woff2"), + url(../webfonts/fa-solid-900.ttf) format("truetype"); +} +@font-face { + font-family: "Font Awesome 5 Free"; + font-display: block; + font-weight: 400; + src: url(../webfonts/fa-regular-400.woff2) format("woff2"), + url(../webfonts/fa-regular-400.ttf) format("truetype"); +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-solid-900.woff2) format("woff2"), + url(../webfonts/fa-solid-900.ttf) format("truetype"); +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-brands-400.woff2) format("woff2"), + url(../webfonts/fa-brands-400.ttf) format("truetype"); +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-regular-400.woff2) format("woff2"), + url(../webfonts/fa-regular-400.ttf) format("truetype"); + unicode-range: u+f003, u+f006, u+f014, u+f016-f017, u+f01a-f01b, u+f01d, + u+f022, u+f03e, u+f044, u+f046, u+f05c-f05d, u+f06e, u+f070, u+f087-f088, + u+f08a, u+f094, u+f096-f097, u+f09d, u+f0a0, u+f0a2, u+f0a4-f0a7, u+f0c5, + u+f0c7, u+f0e5-f0e6, u+f0eb, u+f0f6-f0f8, u+f10c, u+f114-f115, + u+f118-f11a, u+f11c-f11d, u+f133, u+f147, u+f14e, u+f150-f152, + u+f185-f186, u+f18e, u+f190-f192, u+f196, u+f1c1-f1c9, u+f1d9, u+f1db, + u+f1e3, u+f1ea, u+f1f7, u+f1f9, u+f20a, u+f247-f248, u+f24a, u+f24d, + u+f255-f25b, u+f25d, u+f271-f274, u+f278, u+f27b, u+f28c, u+f28e, u+f29c, + u+f2b5, u+f2b7, u+f2ba, u+f2bc, u+f2be, u+f2c0-f2c1, u+f2c3, u+f2d0, + u+f2d2, u+f2d4, u+f2dc; +} +@font-face { + font-family: "FontAwesome"; + font-display: block; + src: url(../webfonts/fa-v4compatibility.woff2) format("woff2"), + url(../webfonts/fa-v4compatibility.ttf) format("truetype"); + unicode-range: u+f041, u+f047, u+f065-f066, u+f07d-f07e, u+f080, u+f08b, + u+f08e, u+f090, u+f09a, u+f0ac, u+f0ae, u+f0b2, u+f0d0, u+f0d6, u+f0e4, + u+f0ec, u+f10a-f10b, u+f123, u+f13e, u+f148-f149, u+f14c, u+f156, u+f15e, + u+f160-f161, u+f163, u+f175-f178, u+f195, u+f1f8, u+f219, u+f27a; +} diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-brands-400.ttf b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..1fbb1f7 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-brands-400.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..5d28021 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 differ diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-regular-400.ttf b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..549d68d Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-regular-400.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..18400d7 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 differ diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-solid-900.ttf b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..bb2a869 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-solid-900.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..758dd4f Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 differ diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf new file mode 100644 index 0000000..8c5864c Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf differ diff --git a/src/main/webapp/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 0000000..f94bec2 Binary files /dev/null and b/src/main/webapp/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 differ diff --git a/src/main/webapp/get_ext_invoice_billing_period_det.jsp b/src/main/webapp/get_ext_invoice_billing_period_det.jsp new file mode 100644 index 0000000..e054726 --- /dev/null +++ b/src/main/webapp/get_ext_invoice_billing_period_det.jsp @@ -0,0 +1,78 @@ +<%@ page language="java" contentType="application/json; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" + import="com.cont_mgmt.dbconnection.DbCon,java.sql.*"%> +<%@ page language="java" import="java.text.*,java.util.regex.*"%> +<% +//Get the parameters passed from JavaScript (AJAX) +String contNum = request.getParameter("contNum"); +String invoiceBillPeriod = request.getParameter("invoiceBillPeriod"); +System.out.println("get_ext_invoice_billing_period.jsp triggered"); + +DbCon conn = new DbCon(); +SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); +Connection con = null; +PreparedStatement ps = null; +ResultSet rs = null; +String existingInvoiceBillPeriod = ""; +int dbPeriodNum = -1; +boolean sendAlert = false; +try { + con = conn.oracleCon(); + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + // SQL query to get the details + String sQry = "select ext_invoice_billing_period from (select * from tbl_ext_invoice_det where ext_cont_num = ? " + + "order by ext_invoice_id desc) where rownum = 1"; + ps = con.prepareStatement(sQry); + ps.setString(1, contNum); + rs = ps.executeQuery(); + if (rs.next()) { + existingInvoiceBillPeriod = rs.getString("ext_invoice_billing_period"); + + // Extract ending invoiceBillPeriod number from existingInvoiceBillPeriod (e.g., Q3 from Q1-Q3 or Q3) + Matcher dbMatcher = Pattern.compile("[A-Z](\\d+)(?:-[A-Z](\\d+))?", Pattern.CASE_INSENSITIVE) + .matcher(existingInvoiceBillPeriod); + if (dbMatcher.find()) { + dbPeriodNum = dbMatcher.group(2) != null ? Integer.parseInt(dbMatcher.group(2)) + : Integer.parseInt(dbMatcher.group(1)); + } + System.out.println("dbPeriodNum : " + dbPeriodNum); + + // Extract starting invoiceBillPeriod number from invoiceBillPeriod (e.g., Q2 from Q2-Q4 or Q2) + int inputPeriodNum = -1; + Matcher inputMatcher = Pattern.compile("[A-Z](\\d+)", Pattern.CASE_INSENSITIVE).matcher(invoiceBillPeriod); + if (inputMatcher.find()) { + inputPeriodNum = Integer.parseInt(inputMatcher.group(1)); + } + System.out.println("inputPeriodNum : " + inputPeriodNum); + + // Compare both the extracted inputs + if (inputPeriodNum != -1 && dbPeriodNum != -1 && inputPeriodNum <= dbPeriodNum) { + sendAlert = true; + } + } + con.commit(); +} catch (Exception e) { + e.printStackTrace(); +} finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } +} + +//Create a JSON object and return it to JavaScript +String jsonResponse = String.format("{\"sendAlert\": %b, \"nextNum\": \"%s\"}", sendAlert, dbPeriodNum); +response.getWriter().write(jsonResponse); +%> \ No newline at end of file diff --git a/src/main/webapp/get_first_invoice_billing_period_det.jsp b/src/main/webapp/get_first_invoice_billing_period_det.jsp new file mode 100644 index 0000000..98bebad --- /dev/null +++ b/src/main/webapp/get_first_invoice_billing_period_det.jsp @@ -0,0 +1,57 @@ +<%@ page language="java" contentType="application/json; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" + import="com.cont_mgmt.dbconnection.DbCon,java.sql.*"%> +<% +//Get the parameters passed from JavaScript (AJAX) +String contNum = request.getParameter("contNum"); +String firstInvoiceBillPeriod = request.getParameter("firstInvoiceBillPeriod"); + +//If the billing period is a range like "Q1-Q3", extract only the first part "Q1" +if (firstInvoiceBillPeriod != null && firstInvoiceBillPeriod.contains("-")) { + firstInvoiceBillPeriod = firstInvoiceBillPeriod.split("-")[0]; +} + +DbCon conn = new DbCon(); +Connection con = null; +PreparedStatement ps = null; +ResultSet rs = null; +boolean hasFirstInvoiceBillPeriod = false; +try { + con = conn.oracleCon(); + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + String sQry = "SELECT 1 FROM tbl_invoice_det WHERE cont_num = ? AND " + + "(invoice_billing_period = ? OR invoice_billing_period LIKE ?)"; + ps = con.prepareStatement(sQry); + ps.setString(1, contNum); + ps.setString(2, firstInvoiceBillPeriod); // e.g., Q1 + ps.setString(3, firstInvoiceBillPeriod + "-%"); // e.g., Q1-% + rs = ps.executeQuery(); + if (rs.next()) { + hasFirstInvoiceBillPeriod = true; // The first period exists + } + con.commit(); +} catch (Exception e) { + e.printStackTrace(); +} finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } +} + +//Create a JSON object and return it to JavaScript +String jsonResponse = String.format("{\"hasFirstInvoiceBillPeriod\": %s}", hasFirstInvoiceBillPeriod); +response.getWriter().write(jsonResponse); +%> \ No newline at end of file diff --git a/src/main/webapp/get_invoice_billing_period_det.jsp b/src/main/webapp/get_invoice_billing_period_det.jsp new file mode 100644 index 0000000..e14737b --- /dev/null +++ b/src/main/webapp/get_invoice_billing_period_det.jsp @@ -0,0 +1,78 @@ +<%@ page language="java" contentType="application/json; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page language="java" + import="com.cont_mgmt.dbconnection.DbCon,java.sql.*"%> +<%@ page language="java" import="java.text.*,java.util.regex.*"%> +<% +//Get the parameters passed from JavaScript (AJAX) +String contNum = request.getParameter("contNum"); +String invoiceBillPeriod = request.getParameter("invoiceBillPeriod"); +System.out.println("get_invoice_billing_period.jsp triggered"); + +DbCon conn = new DbCon(); +SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); +Connection con = null; +PreparedStatement ps = null; +ResultSet rs = null; +String existingInvoiceBillPeriod = ""; +boolean sendAlert = false; +int dbPeriodNum = -1; +try { + con = conn.oracleCon(); + con.setAutoCommit(false); // keep your transactional logic + con.rollback(); // clear any leftover uncommitted changes + // SQL query to get the details + String sQry = "select invoice_billing_period from (select * from tbl_invoice_det where cont_num = ? " + + "order by invoice_id desc) where rownum = 1"; + ps = con.prepareStatement(sQry); + ps.setString(1, contNum); + rs = ps.executeQuery(); + if (rs.next()) { + existingInvoiceBillPeriod = rs.getString("invoice_billing_period"); + + // Extract ending invoiceBillPeriod number from existingInvoiceBillPeriod (e.g., Q3 from Q1-Q3 or Q3) + Matcher dbMatcher = Pattern.compile("[A-Z](\\d+)(?:-[A-Z](\\d+))?", Pattern.CASE_INSENSITIVE) + .matcher(existingInvoiceBillPeriod); + if (dbMatcher.find()) { + dbPeriodNum = dbMatcher.group(2) != null ? Integer.parseInt(dbMatcher.group(2)) + : Integer.parseInt(dbMatcher.group(1)); + } + System.out.println("dbPeriodNum : " + dbPeriodNum); + + // Extract starting invoiceBillPeriod number from invoiceBillPeriod (e.g., Q2 from Q2-Q4 or Q2) + int inputPeriodNum = -1; + Matcher inputMatcher = Pattern.compile("[A-Z](\\d+)", Pattern.CASE_INSENSITIVE).matcher(invoiceBillPeriod); + if (inputMatcher.find()) { + inputPeriodNum = Integer.parseInt(inputMatcher.group(1)); + } + System.out.println("inputPeriodNum : " + inputPeriodNum); + + // Compare both the extracted inputs + if (inputPeriodNum != -1 && dbPeriodNum != -1 && inputPeriodNum <= dbPeriodNum) { + sendAlert = true; + } + } + con.commit(); +} catch (Exception e) { + e.printStackTrace(); +} finally { + try { + if (rs != null) { + rs.close(); + } + if (ps != null) { + ps.close(); + } + if (con != null) { + con.setAutoCommit(true); + con.close(); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } +} +System.out.println("sendAlert : " + sendAlert); +//Create a JSON object and return it to JavaScript +String jsonResponse = String.format("{\"sendAlert\": %b, \"nextNum\": \"%s\"}", sendAlert, dbPeriodNum); +response.getWriter().write(jsonResponse); +%> \ No newline at end of file diff --git a/src/main/webapp/google-libphonenumber-3.2.41/js/libphonenumber.js b/src/main/webapp/google-libphonenumber-3.2.41/js/libphonenumber.js new file mode 100644 index 0000000..1c1826d --- /dev/null +++ b/src/main/webapp/google-libphonenumber-3.2.41/js/libphonenumber.js @@ -0,0 +1,13032 @@ +(function(f) { + if (typeof exports === "object" && typeof module !== "undefined") { + module.exports = f() + } else if (typeof define === "function" && define.amd) { + define([], f) + } else { + var g; + if (typeof window !== "undefined") { + g = window + } else if (typeof global !== "undefined") { + g = global + } else if (typeof self !== "undefined") { + g = self + } else { + g = this + } + g.libphonenumber = f() + } +})(function() { + var define, module, exports; + return (function() { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = "function" == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw a.code = "MODULE_NOT_FOUND", a + } + var p = n[i] = { + exports: {} + }; + e[i][0].call(p.exports, function(r) { + var n = e[i][1][r]; + return o(n || r) + }, p, p.exports, r, e, n, t) + } + return n[i].exports + } + for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]); + return o + } + return r + })()({ + 1: [function(require, module, exports) { + (function(global) { + (function() { + /* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 + */ + var $jscomp = $jscomp || {}; + $jscomp.scope = {}; + $jscomp.createTemplateTagFirstArg = function(a) { + return a.raw = a + }; + $jscomp.createTemplateTagFirstArgWithRaw = function(a, b) { + a.raw = b; + return a + }; + $jscomp.arrayIteratorImpl = function(a) { + var b = 0; + return function() { + return b < a.length ? { + done: !1, + value: a[b++] + } : { + done: !0 + } + } + }; + $jscomp.arrayIterator = function(a) { + return { + next: $jscomp.arrayIteratorImpl(a) + } + }; + $jscomp.makeIterator = function(a) { + var b = "undefined" != typeof Symbol && Symbol.iterator && a[Symbol.iterator]; + return b ? b.call(a) : $jscomp.arrayIterator(a) + }; + $jscomp.arrayFromIterator = function(a) { + for (var b, c = []; !(b = a.next()).done;) c.push(b.value); + return c + }; + $jscomp.arrayFromIterable = function(a) { + return a instanceof Array ? a : $jscomp.arrayFromIterator($jscomp.makeIterator(a)) + }; + $jscomp.checkStringArgs = function(a, b, c) { + if (null == a) throw new TypeError("The 'this' value for String.prototype." + c + " must not be null or undefined"); + if (b instanceof RegExp) throw new TypeError("First argument to String.prototype." + c + " must not be a regular expression"); + return a + "" + }; + $jscomp.ASSUME_ES5 = !1; + $jscomp.ASSUME_NO_NATIVE_MAP = !1; + $jscomp.ASSUME_NO_NATIVE_SET = !1; + $jscomp.SIMPLE_FROUND_POLYFILL = !1; + $jscomp.ISOLATE_POLYFILLS = !1; + $jscomp.FORCE_POLYFILL_PROMISE = !1; + $jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION = !1; + $jscomp.defineProperty = $jscomp.ASSUME_ES5 || "function" == typeof Object.defineProperties ? Object.defineProperty : function(a, b, c) { + if (a == Array.prototype || a == Object.prototype) return a; + a[b] = c.value; + return a + }; + $jscomp.getGlobal = function(a) { + a = ["object" == typeof globalThis && globalThis, a, "object" == typeof window && window, "object" == typeof self && self, "object" == typeof global && global]; + for (var b = 0; b < a.length; ++b) { + var c = a[b]; + if (c && c.Math == Math) return c + } + throw Error("Cannot find global object"); + }; + $jscomp.global = $jscomp.getGlobal(this); + $jscomp.IS_SYMBOL_NATIVE = "function" === typeof Symbol && "symbol" === typeof Symbol("x"); + $jscomp.TRUST_ES6_POLYFILLS = !$jscomp.ISOLATE_POLYFILLS || $jscomp.IS_SYMBOL_NATIVE; + $jscomp.polyfills = {}; + $jscomp.propertyToPolyfillSymbol = {}; + $jscomp.POLYFILL_PREFIX = "$jscp$"; + var $jscomp$lookupPolyfilledValue = function(a, b) { + var c = $jscomp.propertyToPolyfillSymbol[b]; + if (null == c) return a[b]; + c = a[c]; + return void 0 !== c ? c : a[b] + }; + $jscomp.polyfill = function(a, b, c, d) { + b && ($jscomp.ISOLATE_POLYFILLS ? $jscomp.polyfillIsolated(a, b, c, d) : $jscomp.polyfillUnisolated(a, b, c, d)) + }; + $jscomp.polyfillUnisolated = function(a, b, c, d) { + c = $jscomp.global; + a = a.split("."); + for (d = 0; d < a.length - 1; d++) { + var e = a[d]; + if (!(e in c)) return; + c = c[e] + } + a = a[a.length - 1]; + d = c[a]; + b = b(d); + b != d && null != b && $jscomp.defineProperty(c, a, { + configurable: !0, + writable: !0, + value: b + }) + }; + $jscomp.polyfillIsolated = function(a, b, c, d) { + var e = a.split("."); + a = 1 === e.length; + d = e[0]; + d = !a && d in $jscomp.polyfills ? $jscomp.polyfills : $jscomp.global; + for (var f = 0; f < e.length - 1; f++) { + var g = e[f]; + if (!(g in d)) return; + d = d[g] + } + e = e[e.length - 1]; + c = $jscomp.IS_SYMBOL_NATIVE && "es6" === c ? d[e] : null; + b = b(c); + null != b && (a ? $jscomp.defineProperty($jscomp.polyfills, e, { + configurable: !0, + writable: !0, + value: b + }) : b !== c && ($jscomp.propertyToPolyfillSymbol[e] = $jscomp.IS_SYMBOL_NATIVE ? $jscomp.global.Symbol(e) : $jscomp.POLYFILL_PREFIX + e, e = + $jscomp.propertyToPolyfillSymbol[e], $jscomp.defineProperty(d, e, { + configurable: !0, + writable: !0, + value: b + }))) + }; + $jscomp.polyfill("String.prototype.endsWith", function(a) { + return a ? a : function(b, c) { + var d = $jscomp.checkStringArgs(this, b, "endsWith"); + b += ""; + void 0 === c && (c = d.length); + c = Math.max(0, Math.min(c | 0, d.length)); + for (var e = b.length; 0 < e && 0 < c;) + if (d[--c] != b[--e]) return !1; + return 0 >= e + } + }, "es6", "es3"); + $jscomp.findInternal = function(a, b, c) { + a instanceof String && (a = String(a)); + for (var d = a.length, e = 0; e < d; e++) { + var f = a[e]; + if (b.call(c, f, e, a)) return { + i: e, + v: f + } + } + return { + i: -1, + v: void 0 + } + }; + $jscomp.polyfill("Array.prototype.find", function(a) { + return a ? a : function(b, c) { + return $jscomp.findInternal(this, b, c).v + } + }, "es6", "es3"); + $jscomp.polyfill("String.prototype.startsWith", function(a) { + return a ? a : function(b, c) { + var d = $jscomp.checkStringArgs(this, b, "startsWith"); + b += ""; + var e = d.length, + f = b.length; + c = Math.max(0, Math.min(c | 0, d.length)); + for (var g = 0; g < f && c < e;) + if (d[c++] != b[g++]) return !1; + return g >= f + } + }, "es6", "es3"); + $jscomp.polyfill("String.prototype.repeat", function(a) { + return a ? a : function(b) { + var c = $jscomp.checkStringArgs(this, null, "repeat"); + if (0 > b || 1342177279 < b) throw new RangeError("Invalid count value"); + b |= 0; + for (var d = ""; b;) + if (b & 1 && (d += c), b >>>= 1) c += c; + return d + } + }, "es6", "es3"); + $jscomp.initSymbol = function() {}; + $jscomp.polyfill("Symbol", function(a) { + if (a) return a; + var b = function(e, f) { + this.$jscomp$symbol$id_ = e; + $jscomp.defineProperty(this, "description", { + configurable: !0, + writable: !0, + value: f + }) + }; + b.prototype.toString = function() { + return this.$jscomp$symbol$id_ + }; + var c = 0, + d = function(e) { + if (this instanceof d) throw new TypeError("Symbol is not a constructor"); + return new b("jscomp_symbol_" + (e || "") + "_" + c++, e) + }; + return d + }, "es6", "es3"); + $jscomp.polyfill("Symbol.iterator", function(a) { + if (a) return a; + a = Symbol("Symbol.iterator"); + for (var b = "Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "), c = 0; c < b.length; c++) { + var d = $jscomp.global[b[c]]; + "function" === typeof d && "function" != typeof d.prototype[a] && $jscomp.defineProperty(d.prototype, a, { + configurable: !0, + writable: !0, + value: function() { + return $jscomp.iteratorPrototype($jscomp.arrayIteratorImpl(this)) + } + }) + } + return a + }, "es6", + "es3"); + $jscomp.iteratorPrototype = function(a) { + a = { + next: a + }; + a[Symbol.iterator] = function() { + return this + }; + return a + }; + $jscomp.iteratorFromArray = function(a, b) { + a instanceof String && (a += ""); + var c = 0, + d = !1, + e = { + next: function() { + if (!d && c < a.length) { + var f = c++; + return { + value: b(f, a[f]), + done: !1 + } + } + d = !0; + return { + done: !0, + value: void 0 + } + } + }; + e[Symbol.iterator] = function() { + return e + }; + return e + }; + $jscomp.polyfill("Array.prototype.keys", function(a) { + return a ? a : function() { + return $jscomp.iteratorFromArray(this, function(b) { + return b + }) + } + }, "es6", "es3"); + $jscomp.polyfill("Object.is", function(a) { + return a ? a : function(b, c) { + return b === c ? 0 !== b || 1 / b === 1 / c : b !== b && c !== c + } + }, "es6", "es3"); + $jscomp.polyfill("Array.prototype.includes", function(a) { + return a ? a : function(b, c) { + var d = this; + d instanceof String && (d = String(d)); + var e = d.length; + c = c || 0; + for (0 > c && (c = Math.max(c + e, 0)); c < e; c++) { + var f = d[c]; + if (f === b || Object.is(f, b)) return !0 + } + return !1 + } + }, "es7", "es3"); + $jscomp.polyfill("String.prototype.includes", function(a) { + return a ? a : function(b, c) { + return -1 !== $jscomp.checkStringArgs(this, b, "includes").indexOf(b, c || 0) + } + }, "es6", "es3"); + var COMPILED = !0, + goog = goog || {}; + goog.global = this || self; + goog.exportPath_ = function(a, b, c, d) { + a = a.split("."); + d = d || goog.global; + a[0] in d || "undefined" == typeof d.execScript || d.execScript("var " + a[0]); + for (var e; a.length && (e = a.shift());) + if (a.length || void 0 === b) d = d[e] && d[e] !== Object.prototype[e] ? d[e] : d[e] = {}; + else if (!c && goog.isObject(b) && goog.isObject(d[e])) + for (var f in b) b.hasOwnProperty(f) && (d[e][f] = b[f]); + else d[e] = b + }; + goog.define = function(a, b) { + if (!COMPILED) { + var c = goog.global.CLOSURE_UNCOMPILED_DEFINES, + d = goog.global.CLOSURE_DEFINES; + c && void 0 === c.nodeType && Object.prototype.hasOwnProperty.call(c, a) ? b = c[a] : d && void 0 === d.nodeType && Object.prototype.hasOwnProperty.call(d, a) && (b = d[a]) + } + return b + }; + goog.FEATURESET_YEAR = 2012; + goog.DEBUG = !0; + goog.LOCALE = "en"; + goog.TRUSTED_SITE = !0; + goog.DISALLOW_TEST_ONLY_CODE = COMPILED && !goog.DEBUG; + goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING = !1; + goog.provide = function(a) { + if (goog.isInModuleLoader_()) throw Error("goog.provide cannot be used within a module."); + if (!COMPILED && goog.isProvided_(a)) throw Error('Namespace "' + a + '" already declared.'); + goog.constructNamespace_(a) + }; + goog.constructNamespace_ = function(a, b, c) { + if (!COMPILED) { + delete goog.implicitNamespaces_[a]; + for (var d = a; + (d = d.substring(0, d.lastIndexOf("."))) && !goog.getObjectByName(d);) goog.implicitNamespaces_[d] = !0 + } + goog.exportPath_(a, b, c) + }; + goog.getScriptNonce = function(a) { + if (a && a != goog.global) return goog.getScriptNonce_(a.document); + null === goog.cspNonce_ && (goog.cspNonce_ = goog.getScriptNonce_(goog.global.document)); + return goog.cspNonce_ + }; + goog.NONCE_PATTERN_ = /^[\w+/_-]+[=]{0,2}$/; + goog.cspNonce_ = null; + goog.getScriptNonce_ = function(a) { + return (a = a.querySelector && a.querySelector("script[nonce]")) && (a = a.nonce || a.getAttribute("nonce")) && goog.NONCE_PATTERN_.test(a) ? a : "" + }; + goog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/; + goog.module = function(a) { + if ("string" !== typeof a || !a || -1 == a.search(goog.VALID_MODULE_RE_)) throw Error("Invalid module identifier"); + if (!goog.isInGoogModuleLoader_()) throw Error("Module " + a + " has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide."); + if (goog.moduleLoaderState_.moduleName) throw Error("goog.module may only be called once per module."); + goog.moduleLoaderState_.moduleName = a; + if (!COMPILED) { + if (goog.isProvided_(a)) throw Error('Namespace "' + a + '" already declared.'); + delete goog.implicitNamespaces_[a] + } + }; + goog.module.get = function(a) { + return goog.module.getInternal_(a) + }; + goog.module.getInternal_ = function(a) { + if (!COMPILED) { + if (a in goog.loadedModules_) return goog.loadedModules_[a].exports; + if (!goog.implicitNamespaces_[a]) return a = goog.getObjectByName(a), null != a ? a : null + } + return null + }; + goog.ModuleType = { + ES6: "es6", + GOOG: "goog" + }; + goog.moduleLoaderState_ = null; + goog.isInModuleLoader_ = function() { + return goog.isInGoogModuleLoader_() || goog.isInEs6ModuleLoader_() + }; + goog.isInGoogModuleLoader_ = function() { + return !!goog.moduleLoaderState_ && goog.moduleLoaderState_.type == goog.ModuleType.GOOG + }; + goog.isInEs6ModuleLoader_ = function() { + if (goog.moduleLoaderState_ && goog.moduleLoaderState_.type == goog.ModuleType.ES6) return !0; + var a = goog.global.$jscomp; + return a ? "function" != typeof a.getCurrentModulePath ? !1 : !!a.getCurrentModulePath() : !1 + }; + goog.module.declareLegacyNamespace = function() { + if (!COMPILED && !goog.isInGoogModuleLoader_()) throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module"); + if (!COMPILED && !goog.moduleLoaderState_.moduleName) throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace."); + goog.moduleLoaderState_.declareLegacyNamespace = !0 + }; + goog.declareModuleId = function(a) { + if (!COMPILED) { + if (!goog.isInEs6ModuleLoader_()) throw Error("goog.declareModuleId may only be called from within an ES6 module"); + if (goog.moduleLoaderState_ && goog.moduleLoaderState_.moduleName) throw Error("goog.declareModuleId may only be called once per module."); + if (a in goog.loadedModules_) throw Error('Module with namespace "' + a + '" already exists.'); + } + if (goog.moduleLoaderState_) goog.moduleLoaderState_.moduleName = a; + else { + var b = goog.global.$jscomp; + if (!b || "function" != typeof b.getCurrentModulePath) throw Error('Module with namespace "' + + a + '" has been loaded incorrectly.'); + b = b.require(b.getCurrentModulePath()); + goog.loadedModules_[a] = { + exports: b, + type: goog.ModuleType.ES6, + moduleId: a + } + } + }; + goog.setTestOnly = function(a) { + if (goog.DISALLOW_TEST_ONLY_CODE) throw a = a || "", Error("Importing test-only code into non-debug environment" + (a ? ": " + a : ".")); + }; + goog.forwardDeclare = function(a) {}; + COMPILED || (goog.isProvided_ = function(a) { + return a in goog.loadedModules_ || !goog.implicitNamespaces_[a] && null != goog.getObjectByName(a) + }, goog.implicitNamespaces_ = { + "goog.module": !0 + }); + goog.getObjectByName = function(a, b) { + a = a.split("."); + b = b || goog.global; + for (var c = 0; c < a.length; c++) + if (b = b[a[c]], null == b) return null; + return b + }; + goog.addDependency = function(a, b, c, d) { + !COMPILED && goog.DEPENDENCIES_ENABLED && goog.debugLoader_.addDependency(a, b, c, d) + }; + goog.ENABLE_DEBUG_LOADER = !0; + goog.logToConsole_ = function(a) { + goog.global.console && goog.global.console.error(a) + }; + goog.require = function(a) { + if (!COMPILED) { + goog.ENABLE_DEBUG_LOADER && goog.debugLoader_.requested(a); + if (goog.isProvided_(a)) { + if (goog.isInModuleLoader_()) return goog.module.getInternal_(a) + } else if (goog.ENABLE_DEBUG_LOADER) { + var b = goog.moduleLoaderState_; + goog.moduleLoaderState_ = null; + try { + goog.debugLoader_.load_(a) + } finally { + goog.moduleLoaderState_ = b + } + } + return null + } + }; + goog.requireType = function(a) { + return {} + }; + goog.basePath = ""; + goog.nullFunction = function() {}; + goog.abstractMethod = function() { + throw Error("unimplemented abstract method"); + }; + goog.addSingletonGetter = function(a) { + a.instance_ = void 0; + a.getInstance = function() { + if (a.instance_) return a.instance_; + goog.DEBUG && (goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = a); + return a.instance_ = new a + } + }; + goog.instantiatedSingletons_ = []; + goog.LOAD_MODULE_USING_EVAL = !0; + goog.SEAL_MODULE_EXPORTS = goog.DEBUG; + goog.loadedModules_ = {}; + goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER; + goog.TRANSPILE = "detect"; + goog.ASSUME_ES_MODULES_TRANSPILED = !1; + goog.TRANSPILE_TO_LANGUAGE = ""; + goog.TRANSPILER = "transpile.js"; + goog.hasBadLetScoping = null; + goog.useSafari10Workaround = function() { + if (null == goog.hasBadLetScoping) { + try { + var a = !eval('"use strict";let x = 1; function f() { return typeof x; };f() == "number";') + } catch (b) { + a = !1 + } + goog.hasBadLetScoping = a + } + return goog.hasBadLetScoping + }; + goog.workaroundSafari10EvalBug = function(a) { + return "(function(){" + a + "\n;})();\n" + }; + goog.loadModule = function(a) { + var b = goog.moduleLoaderState_; + try { + goog.moduleLoaderState_ = { + moduleName: "", + declareLegacyNamespace: !1, + type: goog.ModuleType.GOOG + }; + var c = {}, + d = c; + if ("function" === typeof a) d = a.call(void 0, d); + else if ("string" === typeof a) goog.useSafari10Workaround() && (a = goog.workaroundSafari10EvalBug(a)), d = goog.loadModuleFromSource_.call(void 0, d, a); + else throw Error("Invalid module definition"); + var e = goog.moduleLoaderState_.moduleName; + if ("string" === typeof e && e) goog.moduleLoaderState_.declareLegacyNamespace ? + goog.constructNamespace_(e, d, c !== d) : goog.SEAL_MODULE_EXPORTS && Object.seal && "object" == typeof d && null != d && Object.seal(d), goog.loadedModules_[e] = { + exports: d, + type: goog.ModuleType.GOOG, + moduleId: goog.moduleLoaderState_.moduleName + }; + else throw Error('Invalid module name "' + e + '"'); + } finally { + goog.moduleLoaderState_ = b + } + }; + goog.loadModuleFromSource_ = function(a, b) { + eval(b); + return a + }; + goog.normalizePath_ = function(a) { + a = a.split("/"); + for (var b = 0; b < a.length;) "." == a[b] ? a.splice(b, 1) : b && ".." == a[b] && a[b - 1] && ".." != a[b - 1] ? a.splice(--b, 2) : b++; + return a.join("/") + }; + goog.loadFileSync_ = function(a) { + if (goog.global.CLOSURE_LOAD_FILE_SYNC) return goog.global.CLOSURE_LOAD_FILE_SYNC(a); + try { + var b = new goog.global.XMLHttpRequest; + b.open("get", a, !1); + b.send(); + return 0 == b.status || 200 == b.status ? b.responseText : null + } catch (c) { + return null + } + }; + goog.transpile_ = function(a, b, c) { + var d = goog.global.$jscomp; + d || (goog.global.$jscomp = d = {}); + var e = d.transpile; + if (!e) { + var f = goog.basePath + goog.TRANSPILER, + g = goog.loadFileSync_(f); + if (g) { + (function() { + (0, eval)(g + "\n//# sourceURL=" + f) + }).call(goog.global); + if (goog.global.$gwtExport && goog.global.$gwtExport.$jscomp && !goog.global.$gwtExport.$jscomp.transpile) throw Error('The transpiler did not properly export the "transpile" method. $gwtExport: ' + JSON.stringify(goog.global.$gwtExport)); + goog.global.$jscomp.transpile = + goog.global.$gwtExport.$jscomp.transpile; + d = goog.global.$jscomp; + e = d.transpile + } + } + e || (e = d.transpile = function(h, k) { + goog.logToConsole_(k + " requires transpilation but no transpiler was found."); + return h + }); + return e(a, b, c) + }; + goog.typeOf = function(a) { + var b = typeof a; + return "object" != b ? b : a ? Array.isArray(a) ? "array" : b : "null" + }; + goog.isArrayLike = function(a) { + var b = goog.typeOf(a); + return "array" == b || "object" == b && "number" == typeof a.length + }; + goog.isDateLike = function(a) { + return goog.isObject(a) && "function" == typeof a.getFullYear + }; + goog.isObject = function(a) { + var b = typeof a; + return "object" == b && null != a || "function" == b + }; + goog.getUid = function(a) { + return Object.prototype.hasOwnProperty.call(a, goog.UID_PROPERTY_) && a[goog.UID_PROPERTY_] || (a[goog.UID_PROPERTY_] = ++goog.uidCounter_) + }; + goog.hasUid = function(a) { + return !!a[goog.UID_PROPERTY_] + }; + goog.removeUid = function(a) { + null !== a && "removeAttribute" in a && a.removeAttribute(goog.UID_PROPERTY_); + try { + delete a[goog.UID_PROPERTY_] + } catch (b) {} + }; + goog.UID_PROPERTY_ = "closure_uid_" + (1E9 * Math.random() >>> 0); + goog.uidCounter_ = 0; + goog.cloneObject = function(a) { + var b = goog.typeOf(a); + if ("object" == b || "array" == b) { + if ("function" === typeof a.clone) return a.clone(); + b = "array" == b ? [] : {}; + for (var c in a) b[c] = goog.cloneObject(a[c]); + return b + } + return a + }; + goog.bindNative_ = function(a, b, c) { + return a.call.apply(a.bind, arguments) + }; + goog.bindJs_ = function(a, b, c) { + if (!a) throw Error(); + if (2 < arguments.length) { + var d = Array.prototype.slice.call(arguments, 2); + return function() { + var e = Array.prototype.slice.call(arguments); + Array.prototype.unshift.apply(e, d); + return a.apply(b, e) + } + } + return function() { + return a.apply(b, arguments) + } + }; + goog.bind = function(a, b, c) { + Function.prototype.bind && -1 != Function.prototype.bind.toString().indexOf("native code") ? goog.bind = goog.bindNative_ : goog.bind = goog.bindJs_; + return goog.bind.apply(null, arguments) + }; + goog.partial = function(a, b) { + var c = Array.prototype.slice.call(arguments, 1); + return function() { + var d = c.slice(); + d.push.apply(d, arguments); + return a.apply(this, d) + } + }; + goog.mixin = function(a, b) { + for (var c in b) a[c] = b[c] + }; + goog.now = function() { + return Date.now() + }; + goog.globalEval = function(a) { + (0, eval)(a) + }; + goog.getCssName = function(a, b) { + if ("." == String(a).charAt(0)) throw Error('className passed in goog.getCssName must not start with ".". You passed: ' + a); + var c = function(e) { + return goog.cssNameMapping_[e] || e + }, + d = function(e) { + e = e.split("-"); + for (var f = [], g = 0; g < e.length; g++) f.push(c(e[g])); + return f.join("-") + }; + d = goog.cssNameMapping_ ? "BY_WHOLE" == goog.cssNameMappingStyle_ ? c : d : function(e) { + return e + }; + a = b ? a + "-" + d(b) : d(a); + return goog.global.CLOSURE_CSS_NAME_MAP_FN ? goog.global.CLOSURE_CSS_NAME_MAP_FN(a) : a + }; + goog.setCssNameMapping = function(a, b) { + goog.cssNameMapping_ = a; + goog.cssNameMappingStyle_ = b + }; + !COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING && (goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING); + goog.getMsg = function(a, b, c) { + c && c.html && (a = a.replace(/").replace(/'/g, "'").replace(/"/g, '"').replace(/&/g, "&")); + b && (a = a.replace(/\{\$([^}]+)}/g, function(d, e) { + return null != b && e in b ? b[e] : d + })); + return a + }; + goog.getMsgWithFallback = function(a, b) { + return a + }; + goog.exportSymbol = function(a, b, c) { + goog.exportPath_(a, b, !0, c) + }; + goog.exportProperty = function(a, b, c) { + a[b] = c + }; + goog.inherits = function(a, b) { + function c() {} + c.prototype = b.prototype; + a.superClass_ = b.prototype; + a.prototype = new c; + a.prototype.constructor = a; + a.base = function(d, e, f) { + for (var g = Array(arguments.length - 2), h = 2; h < arguments.length; h++) g[h - 2] = arguments[h]; + return b.prototype[e].apply(d, g) + } + }; + goog.scope = function(a) { + if (goog.isInModuleLoader_()) throw Error("goog.scope is not supported within a module."); + a.call(goog.global) + }; + COMPILED || (goog.global.COMPILED = COMPILED); + goog.defineClass = function(a, b) { + var c = b.constructor, + d = b.statics; + c && c != Object.prototype.constructor || (c = function() { + throw Error("cannot instantiate an interface (no constructor defined)."); + }); + c = goog.defineClass.createSealingConstructor_(c, a); + a && goog.inherits(c, a); + delete b.constructor; + delete b.statics; + goog.defineClass.applyProperties_(c.prototype, b); + null != d && (d instanceof Function ? d(c) : goog.defineClass.applyProperties_(c, d)); + return c + }; + goog.defineClass.SEAL_CLASS_INSTANCES = goog.DEBUG; + goog.defineClass.createSealingConstructor_ = function(a, b) { + return goog.defineClass.SEAL_CLASS_INSTANCES ? function() { + var c = a.apply(this, arguments) || this; + c[goog.UID_PROPERTY_] = c[goog.UID_PROPERTY_]; + return c + } : a + }; + goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = "constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "); + goog.defineClass.applyProperties_ = function(a, b) { + for (var c in b) Object.prototype.hasOwnProperty.call(b, c) && (a[c] = b[c]); + for (var d = 0; d < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; d++) c = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[d], Object.prototype.hasOwnProperty.call(b, c) && (a[c] = b[c]) + }; + !COMPILED && goog.DEPENDENCIES_ENABLED && (goog.inHtmlDocument_ = function() { + var a = goog.global.document; + return null != a && "write" in a + }, goog.isDocumentLoading_ = function() { + var a = goog.global.document; + return a.attachEvent ? "complete" != a.readyState : "loading" == a.readyState + }, goog.findBasePath_ = function() { + if (void 0 != goog.global.CLOSURE_BASE_PATH && "string" === typeof goog.global.CLOSURE_BASE_PATH) goog.basePath = goog.global.CLOSURE_BASE_PATH; + else if (goog.inHtmlDocument_()) { + var a = goog.global.document, + b = a.currentScript; + a = b ? [b] : a.getElementsByTagName("SCRIPT"); + for (b = a.length - 1; 0 <= b; --b) { + var c = a[b].src, + d = c.lastIndexOf("?"); + d = -1 == d ? c.length : d; + if ("base.js" == c.substr(d - 7, 7)) { + goog.basePath = c.substr(0, d - 7); + break + } + } + } + }, goog.findBasePath_(), goog.Transpiler = function() { + this.requiresTranspilation_ = null; + this.transpilationTarget_ = goog.TRANSPILE_TO_LANGUAGE + }, goog.Transpiler.prototype.createRequiresTranspilation_ = function() { + function a(g, h) { + e ? d[g] = !0 : h() ? (c = g, d[g] = !1) : e = d[g] = !0 + } + + function b(g) { + try { + return !!eval(g) + } catch (h) { + return !1 + } + } + var c = "es3", + d = { + es3: !1 + }, + e = !1, + f = goog.global.navigator && goog.global.navigator.userAgent ? goog.global.navigator.userAgent : ""; + a("es5", function() { + return b("[1,].length==1") + }); + a("es6", function() { + return f.match(/Edge\/(\d+)(\.\d)*/i) ? !1 : b('(()=>{"use strict";class X{constructor(){if(new.target!=String)throw 1;this.x=42}}let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof String))throw 1;for(const a of[2,3]){if(a==2)continue;function f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()==3}})()') + }); + a("es7", function() { + return b("2 ** 2 == 4") + }); + a("es8", function() { + return b("async () => 1, true") + }); + a("es9", function() { + return b("({...rest} = {}), true") + }); + a("es_next", function() { + return !1 + }); + return { + target: c, + map: d + } + }, goog.Transpiler.prototype.needsTranspile = function(a, b) { + if ("always" == goog.TRANSPILE) return !0; + if ("never" == goog.TRANSPILE) return !1; + if (!this.requiresTranspilation_) { + var c = this.createRequiresTranspilation_(); + this.requiresTranspilation_ = c.map; + this.transpilationTarget_ = this.transpilationTarget_ || + c.target + } + if (a in this.requiresTranspilation_) return this.requiresTranspilation_[a] ? !0 : !goog.inHtmlDocument_() || "es6" != b || "noModule" in goog.global.document.createElement("script") ? !1 : !0; + throw Error("Unknown language mode: " + a); + }, goog.Transpiler.prototype.transpile = function(a, b) { + return goog.transpile_(a, b, this.transpilationTarget_) + }, goog.transpiler_ = new goog.Transpiler, goog.protectScriptTag_ = function(a) { + return a.replace(/<\/(SCRIPT)/ig, "\\x3c/$1") + }, goog.DebugLoader_ = function() { + this.dependencies_ = {}; + this.idToPath_ = {}; + this.written_ = {}; + this.loadingDeps_ = []; + this.depsToLoad_ = []; + this.paused_ = !1; + this.factory_ = new goog.DependencyFactory(goog.transpiler_); + this.deferredCallbacks_ = {}; + this.deferredQueue_ = [] + }, goog.DebugLoader_.prototype.bootstrap = function(a, b) { + function c() { + d && (goog.global.setTimeout(d, 0), d = null) + } + var d = b; + if (a.length) { + b = []; + for (var e = 0; e < a.length; e++) { + var f = this.getPathFromDeps_(a[e]); + if (!f) throw Error("Unregonized namespace: " + a[e]); + b.push(this.dependencies_[f]) + } + f = goog.require; + var g = 0; + for (e = + 0; e < a.length; e++) f(a[e]), b[e].onLoad(function() { + ++g == a.length && c() + }) + } else c() + }, goog.DebugLoader_.prototype.loadClosureDeps = function() { + this.depsToLoad_.push(this.factory_.createDependency(goog.normalizePath_(goog.basePath + "deps.js"), "deps.js", [], [], {}, !1)); + this.loadDeps_() + }, goog.DebugLoader_.prototype.requested = function(a, b) { + (a = this.getPathFromDeps_(a)) && (b || this.areDepsLoaded_(this.dependencies_[a].requires)) && (b = this.deferredCallbacks_[a]) && (delete this.deferredCallbacks_[a], b()) + }, goog.DebugLoader_.prototype.setDependencyFactory = + function(a) { + this.factory_ = a + }, goog.DebugLoader_.prototype.load_ = function(a) { + if (this.getPathFromDeps_(a)) { + var b = this, + c = [], + d = function(e) { + var f = b.getPathFromDeps_(e); + if (!f) throw Error("Bad dependency path or symbol: " + e); + if (!b.written_[f]) { + b.written_[f] = !0; + e = b.dependencies_[f]; + for (f = 0; f < e.requires.length; f++) goog.isProvided_(e.requires[f]) || d(e.requires[f]); + c.push(e) + } + }; + d(a); + a = !!this.depsToLoad_.length; + this.depsToLoad_ = this.depsToLoad_.concat(c); + this.paused_ || a || this.loadDeps_() + } else throw a = "goog.require could not find: " + + a, goog.logToConsole_(a), Error(a); + }, goog.DebugLoader_.prototype.loadDeps_ = function() { + for (var a = this, b = this.paused_; this.depsToLoad_.length && !b;)(function() { + var c = !1, + d = a.depsToLoad_.shift(), + e = !1; + a.loading_(d); + var f = { + pause: function() { + if (c) throw Error("Cannot call pause after the call to load."); + b = !0 + }, + resume: function() { + c ? a.resume_() : b = !1 + }, + loaded: function() { + if (e) throw Error("Double call to loaded."); + e = !0; + a.loaded_(d) + }, + pending: function() { + for (var g = [], h = 0; h < a.loadingDeps_.length; h++) g.push(a.loadingDeps_[h]); + return g + }, + setModuleState: function(g) { + goog.moduleLoaderState_ = { + type: g, + moduleName: "", + declareLegacyNamespace: !1 + } + }, + registerEs6ModuleExports: function(g, h, k) { + k && (goog.loadedModules_[k] = { + exports: h, + type: goog.ModuleType.ES6, + moduleId: k || "" + }) + }, + registerGoogModuleExports: function(g, h) { + goog.loadedModules_[g] = { + exports: h, + type: goog.ModuleType.GOOG, + moduleId: g + } + }, + clearModuleState: function() { + goog.moduleLoaderState_ = null + }, + defer: function(g) { + if (c) throw Error("Cannot register with defer after the call to load."); + a.defer_(d, + g) + }, + areDepsLoaded: function() { + return a.areDepsLoaded_(d.requires) + } + }; + try { + d.load(f) + } finally { + c = !0 + } + })(); + b && this.pause_() + }, goog.DebugLoader_.prototype.pause_ = function() { + this.paused_ = !0 + }, goog.DebugLoader_.prototype.resume_ = function() { + this.paused_ && (this.paused_ = !1, this.loadDeps_()) + }, goog.DebugLoader_.prototype.loading_ = function(a) { + this.loadingDeps_.push(a) + }, goog.DebugLoader_.prototype.loaded_ = function(a) { + for (var b = 0; b < this.loadingDeps_.length; b++) + if (this.loadingDeps_[b] == a) { + this.loadingDeps_.splice(b, 1); + break + } for (b = 0; b < this.deferredQueue_.length; b++) + if (this.deferredQueue_[b] == a.path) { + this.deferredQueue_.splice(b, 1); + break + } if (this.loadingDeps_.length == this.deferredQueue_.length && !this.depsToLoad_.length) + for (; this.deferredQueue_.length;) this.requested(this.deferredQueue_.shift(), !0); + a.loaded() + }, goog.DebugLoader_.prototype.areDepsLoaded_ = function(a) { + for (var b = 0; b < a.length; b++) { + var c = this.getPathFromDeps_(a[b]); + if (!c || !(c in this.deferredCallbacks_ || goog.isProvided_(a[b]))) return !1 + } + return !0 + }, goog.DebugLoader_.prototype.getPathFromDeps_ = + function(a) { + return a in this.idToPath_ ? this.idToPath_[a] : a in this.dependencies_ ? a : null + }, goog.DebugLoader_.prototype.defer_ = function(a, b) { + this.deferredCallbacks_[a.path] = b; + this.deferredQueue_.push(a.path) + }, goog.LoadController = function() {}, goog.LoadController.prototype.pause = function() {}, goog.LoadController.prototype.resume = function() {}, goog.LoadController.prototype.loaded = function() {}, goog.LoadController.prototype.pending = function() {}, goog.LoadController.prototype.registerEs6ModuleExports = function(a, + b, c) {}, goog.LoadController.prototype.setModuleState = function(a) {}, goog.LoadController.prototype.clearModuleState = function() {}, goog.LoadController.prototype.defer = function(a) {}, goog.LoadController.prototype.areDepsLoaded = function() {}, goog.Dependency = function(a, b, c, d, e) { + this.path = a; + this.relativePath = b; + this.provides = c; + this.requires = d; + this.loadFlags = e; + this.loaded_ = !1; + this.loadCallbacks_ = [] + }, goog.Dependency.prototype.getPathName = function() { + var a = this.path, + b = a.indexOf("://"); + 0 <= b && (a = a.substring(b + 3), b = + a.indexOf("/"), 0 <= b && (a = a.substring(b + 1))); + return a + }, goog.Dependency.prototype.onLoad = function(a) { + this.loaded_ ? a() : this.loadCallbacks_.push(a) + }, goog.Dependency.prototype.loaded = function() { + this.loaded_ = !0; + var a = this.loadCallbacks_; + this.loadCallbacks_ = []; + for (var b = 0; b < a.length; b++) a[b]() + }, goog.Dependency.defer_ = !1, goog.Dependency.callbackMap_ = {}, goog.Dependency.registerCallback_ = function(a) { + var b = Math.random().toString(32); + goog.Dependency.callbackMap_[b] = a; + return b + }, goog.Dependency.unregisterCallback_ = + function(a) { + delete goog.Dependency.callbackMap_[a] + }, goog.Dependency.callback_ = function(a, b) { + if (a in goog.Dependency.callbackMap_) { + for (var c = goog.Dependency.callbackMap_[a], d = [], e = 1; e < arguments.length; e++) d.push(arguments[e]); + c.apply(void 0, d) + } else throw Error("Callback key " + a + " does not exist (was base.js loaded more than once?)."); + }, goog.Dependency.prototype.load = function(a) { + if (goog.global.CLOSURE_IMPORT_SCRIPT) goog.global.CLOSURE_IMPORT_SCRIPT(this.path) ? a.loaded() : a.pause(); + else if (goog.inHtmlDocument_()) { + var b = + goog.global.document; + if ("complete" == b.readyState && !goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING) { + if (/\bdeps.js$/.test(this.path)) { + a.loaded(); + return + } + throw Error('Cannot write "' + this.path + '" after document load'); + } + var c = goog.getScriptNonce(); + if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING && goog.isDocumentLoading_()) { + var d = function(h) { + h.readyState && "complete" != h.readyState ? h.onload = d : (goog.Dependency.unregisterCallback_(e), a.loaded()) + }; + var e = goog.Dependency.registerCallback_(d); + c = c ? ' nonce="' + c + '"' : ""; + var f = ' + + \ No newline at end of file diff --git a/src/main/webapp/html2pdf-0.9.3/js/html2pdf.bundle.min.js b/src/main/webapp/html2pdf-0.9.3/js/html2pdf.bundle.min.js new file mode 100644 index 0000000..4f2f4b0 --- /dev/null +++ b/src/main/webapp/html2pdf-0.9.3/js/html2pdf.bundle.min.js @@ -0,0 +1,25996 @@ +/** + * html2pdf.js v0.9.3 + * Copyright (c) 2021 Erik Koopmans + * Released under the MIT License. + */ +!(function(t, e) { + 'object' == typeof exports && 'undefined' != typeof module + ? (module.exports = e()) + : 'function' == typeof define && define.amd + ? define(e) + : (t.html2pdf = e()) +})(this, function() { + 'use strict' + + function t() { + throw new Error( + 'Dynamic requires are not currently supported by rollup-plugin-commonjs' + ) + } + + function e(t) { + return t && + t.__esModule && + Object.prototype.hasOwnProperty.call(t, 'default') + ? t.default + : t + } + + function A(t, e) { + return ( + (e = { + exports: {} + }), + t(e, e.exports), + e.exports + ) + } + var r = + 'undefined' != typeof window + ? window + : 'undefined' != typeof global + ? global + : 'undefined' != typeof self + ? self + : {}, + n = A(function(e, A) { + e.exports = (function() { + function n(t) { + var e = 0 + if ( + 71 !== t[e++] || + 73 !== t[e++] || + 70 !== t[e++] || + 56 !== t[e++] || + 56 != ((t[e++] + 1) & 253) || + 97 !== t[e++] + ) + throw 'Invalid GIF 87a/89a header.' + var A = t[e++] | (t[e++] << 8), + r = t[e++] | (t[e++] << 8), + n = t[e++], + o = n >> 7, + a = 1 << (1 + (7 & n)) + t[e++], t[e++] + var s = null + o && ((s = e), (e += 3 * a)) + var c = !0, + l = [], + u = 0, + h = null, + d = 0, + f = null + for (this.width = A, this.height = r; c && e < t.length;) + switch (t[e++]) { + case 33: + switch (t[e++]) { + case 255: + if ( + 11 !== t[e] || + (78 == t[e + 1] && + 69 == t[e + 2] && + 84 == t[e + 3] && + 83 == t[e + 4] && + 67 == t[e + 5] && + 65 == t[e + 6] && + 80 == t[e + 7] && + 69 == t[e + 8] && + 50 == t[e + 9] && + 46 == t[e + 10] && + 48 == t[e + 11] && + 3 == t[e + 12] && + 1 == t[e + 13] && + 0 == t[e + 16]) + ) + (e += 14), (f = t[e++] | (t[e++] << 8)), e++ + else for (e += 12; 0 !== (b = t[e++]);) e += b + break + case 249: + if (4 !== t[e++] || 0 !== t[e + 4]) + throw 'Invalid graphics extension block.' + var p = t[e++] + ; (u = t[e++] | (t[e++] << 8)), + (h = t[e++]), + 0 == (1 & p) && (h = null), + (d = (p >> 2) & 7), + e++ + break + case 254: + for (; 0 !== (b = t[e++]);) e += b + break + default: + throw ( + 'Unknown graphic control label: 0x' + + t[e - 1].toString(16) + ) + } + break + case 44: + var g = t[e++] | (t[e++] << 8), + B = t[e++] | (t[e++] << 8), + w = t[e++] | (t[e++] << 8), + m = t[e++] | (t[e++] << 8), + y = t[e++], + v = (y >> 6) & 1, + Q = s, + C = !1 + y >> 7 && ((C = !0), (Q = e), (e += 3 * (1 << (1 + (7 & y))))) + var U = e + for (e++; ;) { + var b + if (0 === (b = t[e++])) break + e += b + } + l.push({ + x: g, + y: B, + width: w, + height: m, + has_local_palette: C, + palette_offset: Q, + data_offset: U, + data_length: e - U, + transparent_index: h, + interlaced: !!v, + delay: u, + disposal: d + }) + break + case 59: + c = !1 + break + default: + throw 'Unknown gif block: 0x' + t[e - 1].toString(16) + } + ; (this.numFrames = function() { + return l.length + }), + (this.loopCount = function() { + return f + }), + (this.frameInfo = function(t) { + if (t < 0 || t >= l.length) throw 'Frame index out of range.' + return l[t] + }), + (this.decodeAndBlitFrameBGRA = function(e, r) { + var n = this.frameInfo(e), + o = n.width * n.height, + a = new Uint8Array(o) + i(t, n.data_offset, a, o) + var s = n.palette_offset, + c = n.transparent_index + null === c && (c = 256) + var l = n.width, + u = A - l, + h = l, + d = 4 * (n.y * A + n.x), + f = 4 * ((n.y + n.height) * A + n.x), + p = d, + g = 4 * u + !0 === n.interlaced && (g += 4 * (l + u) * 7) + for (var B = 8, w = 0, m = a.length; w < m; ++w) { + var y = a[w] + if ( + (0 === h && + ((h = l), + f <= (p += g) && + ((g = u + 4 * (l + u) * (B - 1)), + (p = d + (l + u) * (B << 1)), + (B >>= 1))), + y === c) + ) + p += 4 + else { + var v = t[s + 3 * y], + Q = t[s + 3 * y + 1], + C = t[s + 3 * y + 2] + ; (r[p++] = C), (r[p++] = Q), (r[p++] = v), (r[p++] = 255) + } + --h + } + }), + (this.decodeAndBlitFrameRGBA = function(e, r) { + var n = this.frameInfo(e), + o = n.width * n.height, + a = new Uint8Array(o) + i(t, n.data_offset, a, o) + var s = n.palette_offset, + c = n.transparent_index + null === c && (c = 256) + var l = n.width, + u = A - l, + h = l, + d = 4 * (n.y * A + n.x), + f = 4 * ((n.y + n.height) * A + n.x), + p = d, + g = 4 * u + !0 === n.interlaced && (g += 4 * (l + u) * 7) + for (var B = 8, w = 0, m = a.length; w < m; ++w) { + var y = a[w] + if ( + (0 === h && + ((h = l), + f <= (p += g) && + ((g = u + 4 * (l + u) * (B - 1)), + (p = d + (l + u) * (B << 1)), + (B >>= 1))), + y === c) + ) + p += 4 + else { + var v = t[s + 3 * y], + Q = t[s + 3 * y + 1], + C = t[s + 3 * y + 2] + ; (r[p++] = v), (r[p++] = Q), (r[p++] = C), (r[p++] = 255) + } + --h + } + }) + } + + function i(t, e, A, r) { + for ( + var n = t[e++], + i = 1 << n, + o = i + 1, + a = o + 1, + s = n + 1, + c = (1 << s) - 1, + l = 0, + u = 0, + h = 0, + d = t[e++], + f = new Int32Array(4096), + p = null; + ; + + ) { + for (; l < 16 && 0 !== d;) + (u |= t[e++] << l), (l += 8), 1 === d ? (d = t[e++]) : --d + if (l < s) break + var g = u & c + if (((u >>= s), (l -= s), g !== i)) { + if (g === o) break + for (var B = g < a ? g : p, w = 0, m = B; i < m;) + (m = f[m] >> 8), ++w + var y = m + if (r < h + w + (B !== g ? 1 : 0)) + return void console.log( + 'Warning, gif stream longer than expected.' + ) + A[h++] = y + var v = (h += w) + for (B !== g && (A[h++] = y), m = B; w--;) + (m = f[m]), (A[--v] = 255 & m), (m >>= 8) + null !== p && + a < 4096 && + ((f[a++] = (p << 8) | y), + c + 1 <= a && s < 12 && (++s, (c = (c << 1) | 1))), + (p = g) + } else (a = o + 1), (c = (1 << (s = n + 1)) - 1), (p = null) + } + return ( + h !== r && + console.log('Warning, gif stream shorter than expected.'), + A + ) + } + + function o(t) { + function e(t, e) { + for (var A = 0, r = 0, n = new Array(), i = 1; i <= 16; i++) { + for (var o = 1; o <= t[i]; o++) + (n[e[r]] = []), (n[e[r]][0] = A), (n[e[r]][1] = i), r++, A++ + A *= 2 + } + return n + } + + function A(t) { + for (var e = t[0], A = t[1] - 1; 0 <= A;) + e & (1 << A) && (Q |= 1 << C), + A--, + --C < 0 && (255 == Q ? (r(255), r(0)) : r(Q), (C = 7), (Q = 0)) + } + + function r(t) { + v.push(t) + } + + function n(t) { + r((t >> 8) & 255), r(255 & t) + } + + function i(t, e, r, n, i) { + for ( + var o, + a = i[0], + s = i[240], + c = (function(t, e) { + var A, + r, + n, + i, + o, + a, + s, + c, + l, + u, + h = 0 + for (l = 0; l < 8; ++l) { + ; (A = t[h]), + (r = t[h + 1]), + (n = t[h + 2]), + (i = t[h + 3]), + (o = t[h + 4]), + (a = t[h + 5]), + (s = t[h + 6]) + var d = A + (c = t[h + 7]), + f = A - c, + p = r + s, + g = r - s, + B = n + a, + w = n - a, + y = i + o, + v = i - o, + Q = d + y, + C = d - y, + U = p + B, + b = p - B + ; (t[h] = Q + U), (t[h + 4] = Q - U) + var F = 0.707106781 * (b + C) + ; (t[h + 2] = C + F), (t[h + 6] = C - F) + var E = 0.382683433 * ((Q = v + w) - (b = g + f)), + x = 0.5411961 * Q + E, + H = 1.306562965 * b + E, + I = 0.707106781 * (U = w + g), + S = f + I, + _ = f - I + ; (t[h + 5] = _ + x), + (t[h + 3] = _ - x), + (t[h + 1] = S + H), + (t[h + 7] = S - H), + (h += 8) + } + for (l = h = 0; l < 8; ++l) { + ; (A = t[h]), + (r = t[h + 8]), + (n = t[h + 16]), + (i = t[h + 24]), + (o = t[h + 32]), + (a = t[h + 40]), + (s = t[h + 48]) + var T = A + (c = t[h + 56]), + N = A - c, + k = r + s, + O = r - s, + P = n + a, + D = n - a, + L = i + o, + R = i - o, + M = T + L, + K = T - L, + z = k + P, + q = k - P + ; (t[h] = M + z), (t[h + 32] = M - z) + var j = 0.707106781 * (q + K) + ; (t[h + 16] = K + j), (t[h + 48] = K - j) + var X = 0.382683433 * ((M = R + D) - (q = O + N)), + V = 0.5411961 * M + X, + G = 1.306562965 * q + X, + W = 0.707106781 * (z = D + O), + Y = N + W, + J = N - W + ; (t[h + 40] = J + V), + (t[h + 24] = J - V), + (t[h + 8] = Y + G), + (t[h + 56] = Y - G), + h++ + } + for (l = 0; l < 64; ++l) + (u = t[l] * e[l]), + (m[l] = 0 < u ? (u + 0.5) | 0 : (u - 0.5) | 0) + return m + })(t, e), + l = 0; + l < 64; + ++l + ) + y[H[l]] = c[l] + var u = y[0] - r + ; (r = y[0]), 0 == u ? A(n[0]) : (A(n[w[(o = 32767 + u)]]), A(B[o])) + for (var h = 63; 0 < h && 0 == y[h]; h--); + if (0 == h) return A(a), r + for (var d, f = 1; f <= h;) { + for (var p = f; 0 == y[f] && f <= h; ++f); + var g = f - p + if (16 <= g) { + d = g >> 4 + for (var v = 1; v <= d; ++v) A(s) + g &= 15 + } + ; (o = 32767 + y[f]), A(i[(g << 4) + w[o]]), A(B[o]), f++ + } + return 63 != h && A(a), r + } + + function o(t) { + t <= 0 && (t = 1), + 100 < t && (t = 100), + u != t && + ((function(t) { + for ( + var e = [ + 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, + 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, + 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, + 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, + 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 + ], + A = 0; + A < 64; + A++ + ) { + var r = h((e[A] * t + 50) / 100) + r < 1 ? (r = 1) : 255 < r && (r = 255), (d[H[A]] = r) + } + for ( + var n = [ + 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, + 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + ], + i = 0; + i < 64; + i++ + ) { + var o = h((n[i] * t + 50) / 100) + o < 1 ? (o = 1) : 255 < o && (o = 255), (f[H[i]] = o) + } + for ( + var a = [ + 1, 1.387039845, 1.306562965, 1.175875602, 1, + 0.785694958, 0.5411961, 0.275899379 + ], + s = 0, + c = 0; + c < 8; + c++ + ) + for (var l = 0; l < 8; l++) + (p[s] = 1 / (d[H[s]] * a[c] * a[l] * 8)), + (g[s] = 1 / (f[H[s]] * a[c] * a[l] * 8)), + s++ + })(t < 50 ? Math.floor(5e3 / t) : Math.floor(200 - 2 * t)), + (u = t)) + } + var a, + s, + c, + l, + u, + h = Math.floor, + d = new Array(64), + f = new Array(64), + p = new Array(64), + g = new Array(64), + B = new Array(65535), + w = new Array(65535), + m = new Array(64), + y = new Array(64), + v = [], + Q = 0, + C = 7, + U = new Array(64), + b = new Array(64), + F = new Array(64), + E = new Array(256), + x = new Array(2048), + H = [ + 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, + 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, + 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, + 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63 + ], + I = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], + S = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + _ = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], + T = [ + 1, 2, 3, 0, 4, 17, 5, 18, 33, 49, 65, 6, 19, 81, 97, 7, 34, 113, + 20, 50, 129, 145, 161, 8, 35, 66, 177, 193, 21, 82, 209, 240, 36, + 51, 98, 114, 130, 9, 10, 22, 23, 24, 25, 26, 37, 38, 39, 40, 41, + 42, 52, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, + 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, + 106, 115, 116, 117, 118, 119, 120, 121, 122, 131, 132, 133, 134, + 135, 136, 137, 138, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 210, 211, 212, 213, 214, 215, 216, 217, 218, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250 + ], + N = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], + k = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + O = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], + P = [ + 0, 1, 2, 3, 17, 4, 5, 33, 49, 6, 18, 65, 81, 7, 97, 113, 19, 34, + 50, 129, 8, 20, 66, 145, 161, 177, 193, 9, 35, 51, 82, 240, 21, + 98, 114, 209, 10, 22, 36, 52, 225, 37, 241, 23, 24, 25, 26, 38, + 39, 40, 41, 42, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, + 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, + 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 162, 163, 164, 165, 166, 167, 168, 169, 170, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 242, 243, 244, 245, + 246, 247, 248, 249, 250 + ] + ; (this.encode = function(t, e) { + var u, h + new Date().getTime(), + e && o(e), + (v = new Array()), + (Q = 0), + (C = 7), + n(65496), + n(65504), + n(16), + r(74), + r(70), + r(73), + r(70), + r(0), + r(1), + r(1), + r(0), + n(1), + n(1), + r(0), + r(0), + (function() { + n(65499), n(132), r(0) + for (var t = 0; t < 64; t++) r(d[t]) + r(1) + for (var e = 0; e < 64; e++) r(f[e]) + })(), + (u = t.width), + (h = t.height), + n(65472), + n(17), + r(8), + n(h), + n(u), + r(3), + r(1), + r(17), + r(0), + r(2), + r(17), + r(1), + r(3), + r(17), + r(1), + (function() { + n(65476), n(418), r(0) + for (var t = 0; t < 16; t++) r(I[t + 1]) + for (var e = 0; e <= 11; e++) r(S[e]) + r(16) + for (var A = 0; A < 16; A++) r(_[A + 1]) + for (var i = 0; i <= 161; i++) r(T[i]) + r(1) + for (var o = 0; o < 16; o++) r(N[o + 1]) + for (var a = 0; a <= 11; a++) r(k[a]) + r(17) + for (var s = 0; s < 16; s++) r(O[s + 1]) + for (var c = 0; c <= 161; c++) r(P[c]) + })(), + n(65498), + n(12), + r(3), + r(1), + r(0), + r(2), + r(17), + r(3), + r(17), + r(0), + r(63), + r(0) + var B = 0, + w = 0, + m = 0 + ; (Q = 0), (C = 7), (this.encode.displayName = '_encode_') + for ( + var y, + E, + H, + D, + L, + R, + M, + K, + z, + q = t.data, + j = t.width, + X = t.height, + V = 4 * j, + G = 0; + G < X; + + ) { + for (y = 0; y < V;) { + for (R = L = V * G + y, M = -1, z = K = 0; z < 64; z++) + (R = L + (K = z >> 3) * V + (M = 4 * (7 & z))), + X <= G + K && (R -= V * (G + 1 + K - X)), + V <= y + M && (R -= y + M - V + 4), + (E = q[R++]), + (H = q[R++]), + (D = q[R++]), + (U[z] = + ((x[E] + x[(H + 256) >> 0] + x[(D + 512) >> 0]) >> 16) - + 128), + (b[z] = + ((x[(E + 768) >> 0] + + x[(H + 1024) >> 0] + + x[(D + 1280) >> 0]) >> + 16) - + 128), + (F[z] = + ((x[(E + 1280) >> 0] + + x[(H + 1536) >> 0] + + x[(D + 1792) >> 0]) >> + 16) - + 128) + ; (B = i(U, p, B, a, c)), + (w = i(b, g, w, s, l)), + (m = i(F, g, m, s, l)), + (y += 32) + } + G += 8 + } + if (0 <= C) { + var W = [] + ; (W[1] = C + 1), (W[0] = (1 << (C + 1)) - 1), A(W) + } + return n(65497), new Uint8Array(v) + }), + new Date().getTime(), + t || (t = 50), + (function() { + for (var t = String.fromCharCode, e = 0; e < 256; e++) E[e] = t(e) + })(), + (a = e(I, S)), + (s = e(N, k)), + (c = e(_, T)), + (l = e(O, P)), + (function() { + for (var t = 1, e = 2, A = 1; A <= 15; A++) { + for (var r = t; r < e; r++) + (w[32767 + r] = A), + (B[32767 + r] = []), + (B[32767 + r][1] = A), + (B[32767 + r][0] = r) + for (var n = -(e - 1); n <= -t; n++) + (w[32767 + n] = A), + (B[32767 + n] = []), + (B[32767 + n][1] = A), + (B[32767 + n][0] = e - 1 + n) + ; (t <<= 1), (e <<= 1) + } + })(), + (function() { + for (var t = 0; t < 256; t++) + (x[t] = 19595 * t), + (x[(t + 256) >> 0] = 38470 * t), + (x[(t + 512) >> 0] = 7471 * t + 32768), + (x[(t + 768) >> 0] = -11059 * t), + (x[(t + 1024) >> 0] = -21709 * t), + (x[(t + 1280) >> 0] = 32768 * t + 8421375), + (x[(t + 1536) >> 0] = -27439 * t), + (x[(t + 1792) >> 0] = -5329 * t) + })(), + o(t), + new Date().getTime() + } + + function a(t, e) { + if ( + ((this.pos = 0), + (this.buffer = t), + (this.datav = new DataView(t.buffer)), + (this.is_with_alpha = !!e), + (this.bottom_up = !0), + (this.flag = + String.fromCharCode(this.buffer[0]) + + String.fromCharCode(this.buffer[1])), + (this.pos += 2), + -1 === ['BM', 'BA', 'CI', 'CP', 'IC', 'PT'].indexOf(this.flag)) + ) + throw new Error('Invalid BMP File') + this.parseHeader(), this.parseBGR() + } + var s, + c, + l, + u, + h, + d, + f, + p, + g, + B, + w, + m, + y, + v, + Q, + C, + U, + b, + F, + E, + x, + H, + I, + S, + _, + T, + N, + k, + O, + P, + D, + L, + R, + M, + K, + z, + q, + j, + X, + V, + G, + W, + Y, + J, + Z, + $, + tt, + et, + At, + rt, + nt, + it, + ot, + at = + 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator + ? function(t) { + return typeof t + } + : function(t) { + return t && + 'function' == typeof Symbol && + t.constructor === Symbol && + t !== Symbol.prototype + ? 'symbol' + : typeof t + }, + st = (function(t) { + function A(e, i, o, a) { + var s = {} + 'object' === (void 0 === e ? 'undefined' : at(e)) && + ((e = (s = e).orientation), + (i = s.unit || i), + (o = s.format || o), + (a = s.compress || s.compressPdf || a)), + (i = i || 'mm'), + (o = o || 'a4'), + (e = ('' + (e || 'P')).toLowerCase()), + ('' + o).toLowerCase() + var c, + l, + u, + h, + d, + f, + p, + g, + B, + w, + m, + y = !!a && 'function' == typeof Uint8Array, + v = s.textColor || '0 g', + Q = s.drawColor || '0 G', + C = s.fontSize || 16, + U = s.charSpace || 0, + b = s.R2L || !1, + F = s.lineHeight || 1.15, + E = s.lineWidth || 0.200025, + x = '00000000000000000000000000000000', + H = 2, + I = !1, + S = [], + _ = {}, + T = {}, + N = 0, + k = [], + O = [], + P = [], + D = [], + L = [], + R = 0, + M = 0, + K = 0, + z = { + title: '', + subject: '', + author: '', + keywords: '', + creator: '' + }, + q = {}, + j = new (function(e) { + var A = {} + ; (this.subscribe = function(t, e, r) { + if ('function' != typeof e) return !1 + A.hasOwnProperty(t) || (A[t] = {}) + var n = Math.random().toString(35) + return (A[t][n] = [e, !!r]), n + }), + (this.unsubscribe = function(t) { + for (var e in A) if (A[e][t]) return delete A[e][t], !0 + return !1 + }), + (this.publish = function(r) { + if (A.hasOwnProperty(r)) { + var n = Array.prototype.slice.call(arguments, 1), + i = [] + for (var o in A[r]) { + var a = A[r][o] + try { + a[0].apply(e, n) + } catch (r) { + t.console && + console.error('jsPDF PubSub Error', r.message, r) + } + a[1] && i.push(o) + } + i.length && i.forEach(this.unsubscribe) + } + }) + })(q), + X = s.hotfixes || [], + V = function(t) { + var e, + A = t.ch1, + r = t.ch2, + n = t.ch3, + i = t.ch4, + o = + (t.precision, + 'draw' === t.pdfColorType + ? ['G', 'RG', 'K'] + : ['g', 'rg', 'k']) + if ('string' == typeof A && '#' !== A.charAt(0)) { + var a = new RGBColor(A) + a.ok && (A = a.toHex()) + } + if ( + ('string' == typeof A && + /^#[0-9A-Fa-f]{3}$/.test(A) && + (A = '#' + A[1] + A[1] + A[2] + A[2] + A[3] + A[3]), + 'string' == typeof A && /^#[0-9A-Fa-f]{6}$/.test(A)) + ) { + var s = parseInt(A.substr(1), 16) + ; (A = (s >> 16) & 255), (r = (s >> 8) & 255), (n = 255 & s) + } + if (void 0 === r || (void 0 === i && A === r && r === n)) + if ('string' == typeof A) e = A + ' ' + o[0] + else + switch (t.precision) { + case 2: + e = J(A / 255) + ' ' + o[0] + break + case 3: + default: + e = Z(A / 255) + ' ' + o[0] + } + else if ( + void 0 === i || + 'object' === (void 0 === i ? 'undefined' : at(i)) + ) { + if ('string' == typeof A) e = [A, r, n, o[1]].join(' ') + else + switch (t.precision) { + case 2: + e = [J(A / 255), J(r / 255), J(n / 255), o[1]].join( + ' ' + ) + break + default: + case 3: + e = [Z(A / 255), Z(r / 255), Z(n / 255), o[1]].join( + ' ' + ) + } + i && + 0 === i.a && + (e = ['255', '255', '255', o[1]].join(' ')) + } else if ('string' == typeof A) + e = [A, r, n, i, o[2]].join(' ') + else + switch (t.precision) { + case 2: + e = [J(A), J(r), J(n), J(i), o[2]].join(' ') + break + case 3: + default: + e = [Z(A), Z(r), Z(n), Z(i), o[2]].join(' ') + } + return e + }, + G = function(t) { + var e = function(t) { + return ('0' + parseInt(t)).slice(-2) + }, + A = t.getTimezoneOffset(), + r = A < 0 ? '+' : '-', + n = Math.floor(Math.abs(A / 60)), + i = Math.abs(A % 60), + o = [r, e(n), "'", e(i), "'"].join('') + return [ + 'D:', + t.getFullYear(), + e(t.getMonth() + 1), + e(t.getDate()), + e(t.getHours()), + e(t.getMinutes()), + e(t.getSeconds()), + o + ].join('') + }, + W = function(t) { + var e + return ( + void 0 === (void 0 === t ? 'undefined' : at(t)) && + (t = new Date()), + (e = + 'object' === (void 0 === t ? 'undefined' : at(t)) && + '[object Date]' === Object.prototype.toString.call(t) + ? G(t) + : /^D:(20[0-2][0-9]|203[0-7]|19[7-9][0-9])(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])(0[0-9]|1[0-9]|2[0-3])(0[0-9]|[1-5][0-9])(0[0-9]|[1-5][0-9])(\+0[0-9]|\+1[0-4]|\-0[0-9]|\-1[0-1])\'(0[0-9]|[1-5][0-9])\'?$/.test( + t + ) + ? t + : G(new Date())), + (w = e) + ) + }, + Y = function(t) { + return ( + (t = + t || + '12345678901234567890123456789012' + .split('') + .map(function() { + return 'ABCDEF0123456789'.charAt( + Math.floor(16 * Math.random()) + ) + }) + .join('')), + (x = t) + ) + }, + J = function(t) { + return t.toFixed(2) + }, + Z = function(t) { + return t.toFixed(3) + }, + $ = function(t) { + ; (t = 'string' == typeof t ? t : t.toString()), + I ? k[h].push(t) : ((K += t.length + 1), D.push(t)) + }, + tt = function() { + return (S[++H] = K), $(H + ' 0 obj'), H + }, + et = function(t) { + $('stream'), $(t), $('endstream') + }, + At = function() { + !(function() { + for (var t in _) + _.hasOwnProperty(t) && + ((e = _[t]), + j.publish('putFont', { + font: e, + out: $, + newObject: tt + }), + !0 !== e.isAlreadyPutted && + ((e.objectNumber = tt()), + $('<<'), + $('/Type /Font'), + $('/BaseFont /' + e.postScriptName), + $('/Subtype /Type1'), + 'string' == typeof e.encoding && + $('/Encoding /' + e.encoding), + $('/FirstChar 32'), + $('/LastChar 255'), + $('>>'), + $('endobj'))) + var e + })(), + j.publish('putResources'), + (S[2] = K), + $('2 0 obj'), + $('<<'), + (function() { + for (var t in ($( + '/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]' + ), + $('/Font <<'), + _)) + _.hasOwnProperty(t) && + $('/' + t + ' ' + _[t].objectNumber + ' 0 R') + $('>>'), + $('/XObject <<'), + j.publish('putXobjectDict'), + $('>>') + })(), + $('>>'), + $('endobj'), + j.publish('postPutResources') + }, + rt = function(t, e, A) { + T.hasOwnProperty(e) || (T[e] = {}), (T[e][A] = t) + }, + nt = function(t, e, A, r) { + var n = 'F' + (Object.keys(_).length + 1).toString(10), + i = (_[n] = { + id: n, + postScriptName: t, + fontName: e, + fontStyle: A, + encoding: r, + metadata: {} + }) + return rt(n, e, A), j.publish('addFont', i), n + }, + it = function(t, e) { + return (function(t, e) { + var A, r, n, i, o, a, s, l, u + if ( + ((n = (e = e || {}).sourceEncoding || 'Unicode'), + (o = e.outputEncoding), + (e.autoencode || o) && + _[c].metadata && + _[c].metadata[n] && + _[c].metadata[n].encoding && + ((i = _[c].metadata[n].encoding), + !o && _[c].encoding && (o = _[c].encoding), + !o && i.codePages && (o = i.codePages[0]), + 'string' == typeof o && (o = i[o]), + o)) + ) { + for (s = !1, a = [], A = 0, r = t.length; A < r; A++) + (l = o[t.charCodeAt(A)]) + ? a.push(String.fromCharCode(l)) + : a.push(t[A]), + a[A].charCodeAt(0) >> 8 && (s = !0) + t = a.join('') + } + for (A = t.length; void 0 === s && 0 !== A;) + t.charCodeAt(A - 1) >> 8 && (s = !0), A-- + if (!s) return t + for ( + a = e.noBOM ? [] : [254, 255], A = 0, r = t.length; + A < r; + A++ + ) { + if ((u = (l = t.charCodeAt(A)) >> 8) >> 8) + throw new Error( + 'Character at position ' + + A + + " of string '" + + t + + "' exceeds 16bits. Cannot be encoded into UCS-2 BE" + ) + a.push(u), a.push(l - (u << 8)) + } + return String.fromCharCode.apply(void 0, a) + })(t, e) + .replace(/\\/g, '\\\\') + .replace(/\(/g, '\\(') + .replace(/\)/g, '\\)') + }, + ot = function() { + ; (function(t, e) { + var A = 'string' == typeof e && e.toLowerCase() + if ('string' == typeof t) { + var r = t.toLowerCase() + n.hasOwnProperty(r) && + ((t = n[r][0] / l), (e = n[r][1] / l)) + } + if ((Array.isArray(t) && ((e = t[1]), (t = t[0])), A)) { + switch (A.substr(0, 1)) { + case 'l': + t < e && (A = 's') + break + case 'p': + e < t && (A = 's') + } + 's' === A && ((u = t), (t = e), (e = u)) + } + ; (I = !0), + (k[++N] = []), + (P[N] = { + width: Number(t) || d, + height: Number(e) || f + }), + (O[N] = {}), + st(N) + }.apply(this, arguments), + $(J(E * l) + ' w'), + $(Q), + 0 !== R && $(R + ' J'), + 0 !== M && $(M + ' j'), + j.publish('addPage', { + pageNumber: N + })) + }, + st = function(t) { + 0 < t && t <= N && ((d = P[(h = t)].width), (f = P[t].height)) + }, + ct = function(t, e, A) { + var r, + n = void 0 + return ( + (A = A || {}), + (t = void 0 !== t ? t : _[c].fontName), + (e = void 0 !== e ? e : _[c].fontStyle), + (r = t.toLowerCase()), + void 0 !== T[r] && void 0 !== T[r][e] + ? (n = T[r][e]) + : void 0 !== T[t] && void 0 !== T[t][e] + ? (n = T[t][e]) + : !1 === A.disableWarning && + console.warn( + "Unable to look up font label for font '" + + t + + "', '" + + e + + "'. Refer to getFontList() for available fonts." + ), + n || + A.noFallback || + (null == (n = T.times[e]) && (n = T.times.normal)), + n + ) + }, + lt = function() { + ; (I = !1), + (H = 2), + (K = 0), + (D = []), + (S = []), + (L = []), + j.publish('buildDocument'), + $('%PDF-' + r), + $('%ºß¬à'), + (function() { + var e, + r, + n, + i, + o, + a, + s, + c, + u, + h = [] + for ( + s = t.adler32cs || A.API.adler32cs, + y && void 0 === s && (y = !1), + e = 1; + e <= N; + e++ + ) { + if ( + (h.push(tt()), + (c = (d = P[e].width) * l), + (u = (f = P[e].height) * l), + $('<>'), + $('endobj'), + (r = k[e].join('\n')), + tt(), + y) + ) { + for (n = [], i = r.length; i--;) + n[i] = r.charCodeAt(i) + ; (a = s.from(r)), + (o = new Deflater(6)).append(new Uint8Array(n)), + (r = o.flush()), + (n = new Uint8Array(r.length + 6)).set( + new Uint8Array([120, 156]) + ), + n.set(r, 2), + n.set( + new Uint8Array([ + 255 & a, + (a >> 8) & 255, + (a >> 16) & 255, + (a >> 24) & 255 + ]), + r.length + 2 + ), + (r = String.fromCharCode.apply(null, n)), + $( + '<>' + ) + } else $('<>') + et(r), $('endobj') + } + ; (S[1] = K), $('1 0 obj'), $('<>'), + $('endobj'), + j.publish('postPutPages') + })(), + (function() { + j.publish('putAdditionalObjects') + for (var t = 0; t < L.length; t++) { + var e = L[t] + ; (S[e.objId] = K), + $(e.objId + ' 0 obj'), + $(e.content), + $('endobj') + } + ; (H += L.length), j.publish('postPutAdditionalObjects') + })(), + At(), + tt(), + $('<<'), + (function() { + for (var t in ($('/Producer (jsPDF ' + A.version + ')'), + z)) + z.hasOwnProperty(t) && + z[t] && + $( + '/' + + t.substr(0, 1).toUpperCase() + + t.substr(1) + + ' (' + + it(z[t]) + + ')' + ) + $('/CreationDate (' + w + ')') + })(), + $('>>'), + $('endobj'), + tt(), + $('<<'), + (function() { + switch ( + ($('/Type /Catalog'), + $('/Pages 1 0 R'), + g || (g = 'fullwidth'), + g) + ) { + case 'fullwidth': + $('/OpenAction [3 0 R /FitH null]') + break + case 'fullheight': + $('/OpenAction [3 0 R /FitV null]') + break + case 'fullpage': + $('/OpenAction [3 0 R /Fit]') + break + case 'original': + $('/OpenAction [3 0 R /XYZ null null 1]') + break + default: + var t = '' + g + '%' === t.substr(t.length - 1) && + (g = parseInt(g) / 100), + 'number' == typeof g && + $( + '/OpenAction [3 0 R /XYZ null null ' + + J(g) + + ']' + ) + } + switch ((B || (B = 'continuous'), B)) { + case 'continuous': + $('/PageLayout /OneColumn') + break + case 'single': + $('/PageLayout /SinglePage') + break + case 'two': + case 'twoleft': + $('/PageLayout /TwoColumnLeft') + break + case 'tworight': + $('/PageLayout /TwoColumnRight') + } + p && $('/PageMode /' + p), j.publish('putCatalog') + })(), + $('>>'), + $('endobj') + var e, + n = K, + i = '0000000000' + for ( + $('xref'), $('0 ' + (H + 1)), $(i + ' 65535 f '), e = 1; + e <= H; + e++ + ) { + var o = S[e] + $( + 'function' == typeof o + ? (i + S[e]()).slice(-10) + ' 00000 n ' + : (i + S[e]).slice(-10) + ' 00000 n ' + ) + } + return ( + $('trailer'), + $('<<'), + $('/Size ' + (H + 1)), + $('/Root ' + H + ' 0 R'), + $('/Info ' + (H - 1) + ' 0 R'), + $('/ID [ <' + x + '> <' + x + '> ]'), + $('>>'), + $('startxref'), + $('' + n), + $('%%EOF'), + (I = !0), + D.join('\n') + ) + }, + ut = function(t) { + var e = 'S' + return ( + 'F' === t + ? (e = 'f') + : 'FD' === t || 'DF' === t + ? (e = 'B') + : ('f' !== t && 'f*' !== t && 'B' !== t && 'B*' !== t) || + (e = t), + e + ) + }, + ht = function() { + for ( + var t = lt(), + e = t.length, + A = new ArrayBuffer(e), + r = new Uint8Array(A); + e--; + + ) + r[e] = t.charCodeAt(e) + return A + }, + dt = function() { + return new Blob([ht()], { + type: 'application/pdf' + }) + }, + ft = + (((m = function(e, A) { + var r = + 'dataur' === ('' + e).substr(0, 6) + ? 'data:application/pdf;base64,' + btoa(lt()) + : 0 + switch (e) { + case void 0: + return lt() + case 'save': + if ( + 'object' === + ('undefined' == typeof navigator + ? 'undefined' + : at(navigator)) && + navigator.getUserMedia && + (void 0 === t.URL || void 0 === t.URL.createObjectURL) + ) + return q.output('dataurlnewwindow') + bt(dt(), A), + 'function' == typeof bt.unload && + t.setTimeout && + setTimeout(bt.unload, 911) + break + case 'arraybuffer': + return ht() + case 'blob': + return dt() + case 'bloburi': + case 'bloburl': + return (t.URL && t.URL.createObjectURL(dt())) || void 0 + case 'datauristring': + case 'dataurlstring': + return r + case 'dataurlnewwindow': + var n = t.open(r) + if (n || 'undefined' == typeof safari) return n + case 'datauri': + case 'dataurl': + return (t.document.location.href = r) + default: + throw new Error( + 'Output type "' + e + '" is not supported.' + ) + } + }).foo = function() { + try { + return m.apply(this, arguments) + } catch (r) { + var e = r.stack || '' + ~e.indexOf(' at ') && (e = e.split(' at ')[1]) + var A = + 'Error in function ' + + e.split('\n')[0].split('<')[0] + + ': ' + + r.message + if (!t.console) throw new Error(A) + t.console.error(A, r), t.alert && alert(A) + } + }), + (m.foo.bar = m).foo), + pt = function(t) { + return !0 === Array.isArray(X) && -1 < X.indexOf(t) + } + switch (i) { + case 'pt': + l = 1 + break + case 'mm': + l = 72 / 25.4 + break + case 'cm': + l = 72 / 2.54 + break + case 'in': + l = 72 + break + case 'px': + l = 1 == pt('px_scaling') ? 0.75 : 96 / 72 + break + case 'pc': + case 'em': + l = 12 + break + case 'ex': + l = 6 + break + default: + throw 'Invalid unit: ' + i + } + for (var gt in (W(), + Y(), + (q.internal = { + pdfEscape: it, + getStyle: ut, + getFont: function() { + return _[ct.apply(q, arguments)] + }, + getFontSize: function() { + return C + }, + getCharSpace: function() { + return U + }, + getTextColor: function() { + var t = v.split(' ') + if (2 === t.length && 'g' === t[1]) { + var e = parseFloat(t[0]) + t = [e, e, e, 'r'] + } + for (var A = '#', r = 0; r < 3; r++) + A += ( + '0' + Math.floor(255 * parseFloat(t[r])).toString(16) + ).slice(-2) + return A + }, + getLineHeight: function() { + return C * F + }, + write: function(t) { + $( + 1 === arguments.length + ? t + : Array.prototype.join.call(arguments, ' ') + ) + }, + getCoordinateString: function(t) { + return J(t * l) + }, + getVerticalCoordinateString: function(t) { + return J((f - t) * l) + }, + collections: {}, + newObject: tt, + newAdditionalObject: function() { + var t = 2 * k.length + 1, + e = { + objId: (t += L.length), + content: '' + } + return L.push(e), e + }, + newObjectDeferred: function() { + return ( + (S[++H] = function() { + return K + }), + H + ) + }, + newObjectDeferredBegin: function(t) { + S[t] = K + }, + putStream: et, + events: j, + scaleFactor: l, + pageSize: { + getWidth: function() { + return d + }, + getHeight: function() { + return f + } + }, + output: function(t, e) { + return ft(t, e) + }, + getNumberOfPages: function() { + return k.length - 1 + }, + pages: k, + out: $, + f2: J, + getPageInfo: function(t) { + return { + objId: 2 * (t - 1) + 3, + pageNumber: t, + pageContext: O[t] + } + }, + getCurrentPageInfo: function() { + return { + objId: 2 * (h - 1) + 3, + pageNumber: h, + pageContext: O[h] + } + }, + getPDFVersion: function() { + return r + }, + hasHotfix: pt + }), + (q.addPage = function() { + return ot.apply(this, arguments), this + }), + (q.setPage = function() { + return st.apply(this, arguments), this + }), + (q.insertPage = function(t) { + return this.addPage(), this.movePage(h, t), this + }), + (q.movePage = function(t, e) { + if (e < t) { + for (var A = k[t], r = P[t], n = O[t], i = t; e < i; i--) + (k[i] = k[i - 1]), (P[i] = P[i - 1]), (O[i] = O[i - 1]) + ; (k[e] = A), (P[e] = r), (O[e] = n), this.setPage(e) + } else if (t < e) { + for (A = k[t], r = P[t], n = O[t], i = t; i < e; i++) + (k[i] = k[i + 1]), (P[i] = P[i + 1]), (O[i] = O[i + 1]) + ; (k[e] = A), (P[e] = r), (O[e] = n), this.setPage(e) + } + return this + }), + (q.deletePage = function() { + return ( + function(t) { + 0 < t && + t <= N && + (k.splice(t, 1), + P.splice(t, 1), + --N < h && (h = N), + this.setPage(h)) + }.apply(this, arguments), + this + ) + }), + (q.setCreationDate = function(t) { + return W(t), this + }), + (q.getCreationDate = function(t) { + return (function(t) { + var e = w + return ( + 'jsDate' === t && + (e = (function(t) { + var e = parseInt(t.substr(2, 4), 10), + A = parseInt(t.substr(6, 2), 10) - 1, + r = parseInt(t.substr(8, 2), 10), + n = parseInt(t.substr(10, 2), 10), + i = parseInt(t.substr(12, 2), 10), + o = parseInt(t.substr(14, 2), 10) + return ( + parseInt(t.substr(16, 2), 10), + parseInt(t.substr(20, 2), 10), + new Date(e, A, r, n, i, o, 0) + ) + })(w)), + e + ) + })(t) + }), + (q.setFileId = function(t) { + return Y(t), this + }), + (q.getFileId = function() { + return x + }), + (q.setDisplayMode = function(t, e, A) { + if ( + ((g = t), + (B = e), + -1 == + [ + void 0, + null, + 'UseNone', + 'UseOutlines', + 'UseThumbs', + 'FullScreen' + ].indexOf((p = A))) + ) + throw new Error( + 'Page mode must be one of UseNone, UseOutlines, UseThumbs, or FullScreen. "' + + A + + '" is not recognized.' + ) + return this + }), + (q.text = function(t, e, A, r) { + function n(t) { + for (var e, A = t.concat(), r = [], n = A.length; n--;) + 'string' == typeof (e = A.shift()) + ? r.push(e) + : '[object Array]' === + Object.prototype.toString.call(t) && 1 === e.length + ? r.push(e[0]) + : r.push([e[0], e[1], e[2]]) + return r + } + + function i(t, e) { + var A + if ('string' == typeof t) A = e(t)[0] + else if ( + '[object Array]' === Object.prototype.toString.call(t) + ) { + for (var r, n, i = t.concat(), o = [], a = i.length; a--;) + 'string' == typeof (r = i.shift()) + ? o.push(e(r)[0]) + : '[object Array]' === + Object.prototype.toString.call(r) && + 'string' === r[0] && + ((n = e(r[0], r[1], r[2])), + o.push([n[0], n[1], n[2]])) + A = o + } + return A + } + var o, + a, + s = '', + l = F, + u = this + 'number' == typeof t && ((a = A), (A = e), (e = t), (t = a)) + var h = r, + d = arguments[4], + f = arguments[5] + ; ('object' === (void 0 === h ? 'undefined' : at(h)) && + null !== h) || + ('string' == typeof d && ((f = d), (d = null)), + 'string' == typeof h && ((f = h), (h = null)), + 'number' == typeof h && ((d = h), (h = null)), + (r = { + flags: h, + angle: d, + align: f + })) + var p = !1, + g = !0 + if ('string' == typeof t) p = !0 + else if ( + '[object Array]' === Object.prototype.toString.call(t) + ) { + for (var B, w = t.concat(), m = [], y = w.length; y--;) + ('string' != typeof (B = w.shift()) || + ('[object Array]' === Object.prototype.toString.call(B) && + 'string' != typeof B[0])) && + (g = !1) + p = g + } + if (!1 === p) + throw new Error( + 'Type of text must be string or Array. "' + + t + + '" is not recognized.' + ) + var Q = _[c].encoding + ; ('WinAnsiEncoding' !== Q && 'StandardEncoding' !== Q) || + (t = i(t, function(t, e, A) { + return [ + ((n = t), + (n = n.split('\t').join(Array(r.TabLen || 9).join(' '))), + it(n, h)), + e, + A + ] + var n + })), + 'string' == typeof t && + (t = t.match(/[\r?\n]/) ? t.split(/\r\n|\r|\n/g) : [t]), + 0 < (z = r.maxWidth || 0) && + ('string' == typeof t + ? (t = u.splitTextToSize(t, z)) + : '[object Array]' === + Object.prototype.toString.call(t) && + (t = u.splitTextToSize(t.join(' '), z))) + var E = { + text: t, + x: e, + y: A, + options: r, + mutex: { + pdfEscape: it, + activeFontKey: c, + fonts: _, + activeFontSize: C + } + } + j.publish('preProcessText', E), + (t = E.text), + (d = (r = E.options).angle) + var x = u.internal.scaleFactor, + H = (u.internal.pageSize.getHeight(), []) + if (d) { + d *= Math.PI / 180 + var I = Math.cos(d), + S = Math.sin(d), + T = function(t) { + return t.toFixed(2) + } + H = [T(I), T(S), T(-1 * S), T(I)] + } + void 0 !== (K = r.charSpace) && (s += K + ' Tc\n'), r.lang + var N = -1, + k = r.renderingMode || r.stroke, + O = u.internal.getCurrentPageInfo().pageContext + switch (k) { + case 0: + case !1: + case 'fill': + N = 0 + break + case 1: + case !0: + case 'stroke': + N = 1 + break + case 2: + case 'fillThenStroke': + N = 2 + break + case 3: + case 'invisible': + N = 3 + break + case 4: + case 'fillAndAddForClipping': + N = 4 + break + case 5: + case 'strokeAndAddPathForClipping': + N = 5 + break + case 6: + case 'fillThenStrokeAndAddToPathForClipping': + N = 6 + break + case 7: + case 'addToPathForClipping': + N = 7 + } + var P = O.usedRenderingMode || -1 + ; -1 !== N ? (s += N + ' Tr\n') : -1 !== P && (s += '0 Tr\n'), + -1 !== N && (O.usedRenderingMode = N), + (f = r.align || 'left') + var D = C * l, + L = u.internal.pageSize.getHeight(), + R = u.internal.pageSize.getWidth(), + M = ((x = u.internal.scaleFactor), _[c]), + K = r.charSpace || U, + z = r.maxWidth || 0, + q = ((h = {}), []) + if ('[object Array]' === Object.prototype.toString.call(t)) { + var X, V + ; (m = n(t)), + 'left' !== f && + (V = m.map(function(t) { + return ( + (u.getStringUnitWidth(t, { + font: M, + charSpace: K, + fontSize: C + }) * + C) / + x + ) + })) + Math.max.apply(Math, V) + var G, + W = 0 + if ('right' === f) { + ; (e -= V[0]), (t = []) + var Y = 0 + for (y = m.length; Y < y; Y++) + V[Y], + 0 === Y + ? ((G = e * x), (X = (L - A) * x)) + : ((G = (W - V[Y]) * x), (X = -D)), + t.push([m[Y], G, X]), + (W = V[Y]) + } else if ('center' === f) + for (e -= V[0] / 2, t = [], Y = 0, y = m.length; Y < y; Y++) + V[Y], + 0 === Y + ? ((G = e * x), (X = (L - A) * x)) + : ((G = ((W - V[Y]) / 2) * x), (X = -D)), + t.push([m[Y], G, X]), + (W = V[Y]) + else if ('left' === f) + for (t = [], Y = 0, y = m.length; Y < y; Y++) + (X = 0 === Y ? (L - A) * x : -D), + (G = 0 === Y ? e * x : 0), + t.push(m[Y]) + else { + if ('justify' !== f) + throw new Error( + 'Unrecognized alignment option, use "left", "center", "right" or "justify".' + ) + for ( + t = [], z = 0 !== z ? z : R, Y = 0, y = m.length; + Y < y; + Y++ + ) + (X = 0 === Y ? (L - A) * x : -D), + (G = 0 === Y ? e * x : 0), + Y < y - 1 && + q.push( + ( + ((z - V[Y]) / (m[Y].split(' ').length - 1)) * + x + ).toFixed(2) + ), + t.push([m[Y], G, X]) + } + } + !0 === ('boolean' == typeof r.R2L ? r.R2L : b) && + (t = i(t, function(t, e, A) { + return [t.split('').reverse().join(''), e, A] + })), + (E = { + text: t, + x: e, + y: A, + options: r, + mutex: { + pdfEscape: it, + activeFontKey: c, + fonts: _, + activeFontSize: C + } + }), + j.publish('postProcessText', E), + (t = E.text), + (o = E.mutex.isHex), + (m = n(t)), + (t = []) + var J, + Z, + tt, + et = 0, + At = ((y = m.length), '') + for (Y = 0; Y < y; Y++) + (At = ''), + '[object Array]' !== Object.prototype.toString.call(m[Y]) + ? ((J = parseFloat(e * x).toFixed(2)), + (Z = parseFloat((L - A) * x).toFixed(2)), + (tt = (o ? '<' : '(') + m[Y] + (o ? '>' : ')'))) + : '[object Array]' === + Object.prototype.toString.call(m[Y]) && + ((J = parseFloat(m[Y][1]).toFixed(2)), + (Z = parseFloat(m[Y][2]).toFixed(2)), + (tt = (o ? '<' : '(') + m[Y][0] + (o ? '>' : ')')), + (et = 1)), + void 0 !== q && void 0 !== q[Y] && (At = q[Y] + ' Tw\n'), + 0 !== H.length && 0 === Y + ? t.push( + At + H.join(' ') + ' ' + J + ' ' + Z + ' Tm\n' + tt + ) + : 1 === et || (0 === et && 0 === Y) + ? t.push(At + J + ' ' + Z + ' Td\n' + tt) + : t.push(At + tt) + ; (t = 0 === et ? t.join(' Tj\nT* ') : t.join(' Tj\n')), + (t += ' Tj\n') + var rt = + 'BT\n/' + + c + + ' ' + + C + + ' Tf\n' + + (C * l).toFixed(2) + + ' TL\n' + + v + + '\n' + return (rt += s), (rt += t), $((rt += 'ET')), u + }), + (q.lstext = function(t, e, A, r) { + console.warn('jsPDF.lstext is deprecated') + for (var n = 0, i = t.length; n < i; n++, e += r) + this.text(t[n], e, A) + return this + }), + (q.line = function(t, e, A, r) { + return this.lines([[A - t, r - e]], t, e) + }), + (q.clip = function() { + $('W'), $('S') + }), + (q.clip_fixed = function(t) { + $('evenodd' === t ? 'W*' : 'W'), $('n') + }), + (q.lines = function(t, e, A, r, n, i) { + var o, a, s, c, h, d, p, g, B, w, m + for ( + 'number' == typeof t && ((u = A), (A = e), (e = t), (t = u)), + r = r || [1, 1], + $(Z(e * l) + ' ' + Z((f - A) * l) + ' m '), + o = r[0], + a = r[1], + c = t.length, + w = e, + m = A, + s = 0; + s < c; + s++ + ) + 2 === (h = t[s]).length + ? ((w = h[0] * o + w), + (m = h[1] * a + m), + $(Z(w * l) + ' ' + Z((f - m) * l) + ' l')) + : ((d = h[0] * o + w), + (p = h[1] * a + m), + (g = h[2] * o + w), + (B = h[3] * a + m), + (w = h[4] * o + w), + (m = h[5] * a + m), + $( + Z(d * l) + + ' ' + + Z((f - p) * l) + + ' ' + + Z(g * l) + + ' ' + + Z((f - B) * l) + + ' ' + + Z(w * l) + + ' ' + + Z((f - m) * l) + + ' c' + )) + return i && $(' h'), null !== n && $(ut(n)), this + }), + (q.rect = function(t, e, A, r, n) { + return ( + ut(n), + $( + [J(t * l), J((f - e) * l), J(A * l), J(-r * l), 're'].join( + ' ' + ) + ), + null !== n && $(ut(n)), + this + ) + }), + (q.triangle = function(t, e, A, r, n, i, o) { + return ( + this.lines( + [ + [A - t, r - e], + [n - A, i - r], + [t - n, e - i] + ], + t, + e, + [1, 1], + o, + !0 + ), + this + ) + }), + (q.roundedRect = function(t, e, A, r, n, i, o) { + var a = (4 / 3) * (Math.SQRT2 - 1) + return ( + this.lines( + [ + [A - 2 * n, 0], + [n * a, 0, n, i - i * a, n, i], + [0, r - 2 * i], + [0, i * a, -n * a, i, -n, i], + [2 * n - A, 0], + [-n * a, 0, -n, -i * a, -n, -i], + [0, 2 * i - r], + [0, -i * a, n * a, -i, n, -i] + ], + t + n, + e, + [1, 1], + o + ), + this + ) + }), + (q.ellipse = function(t, e, A, r, n) { + var i = (4 / 3) * (Math.SQRT2 - 1) * A, + o = (4 / 3) * (Math.SQRT2 - 1) * r + return ( + $( + [ + J((t + A) * l), + J((f - e) * l), + 'm', + J((t + A) * l), + J((f - (e - o)) * l), + J((t + i) * l), + J((f - (e - r)) * l), + J(t * l), + J((f - (e - r)) * l), + 'c' + ].join(' ') + ), + $( + [ + J((t - i) * l), + J((f - (e - r)) * l), + J((t - A) * l), + J((f - (e - o)) * l), + J((t - A) * l), + J((f - e) * l), + 'c' + ].join(' ') + ), + $( + [ + J((t - A) * l), + J((f - (e + o)) * l), + J((t - i) * l), + J((f - (e + r)) * l), + J(t * l), + J((f - (e + r)) * l), + 'c' + ].join(' ') + ), + $( + [ + J((t + i) * l), + J((f - (e + r)) * l), + J((t + A) * l), + J((f - (e + o)) * l), + J((t + A) * l), + J((f - e) * l), + 'c' + ].join(' ') + ), + null !== n && $(ut(n)), + this + ) + }), + (q.circle = function(t, e, A, r) { + return this.ellipse(t, e, A, A, r) + }), + (q.setProperties = function(t) { + for (var e in z) z.hasOwnProperty(e) && t[e] && (z[e] = t[e]) + return this + }), + (q.setFontSize = function(t) { + return (C = t), this + }), + (q.setFont = function(t, e) { + return (c = ct(t, e)), this + }), + (q.setFontStyle = q.setFontType = + function(t) { + return (c = ct(void 0, t)), this + }), + (q.getFontList = function() { + var t, + e, + A, + r = {} + for (t in T) + if (T.hasOwnProperty(t)) + for (e in ((r[t] = A = []), T[t])) + T[t].hasOwnProperty(e) && A.push(e) + return r + }), + (q.addFont = function(t, e, A, r) { + nt(t, e, A, (r = r || 'Identity-H')) + }), + (q.setLineWidth = function(t) { + return $((t * l).toFixed(2) + ' w'), this + }), + (q.setDrawColor = function(t, e, A, r) { + return ( + $( + V({ + ch1: t, + ch2: e, + ch3: A, + ch4: r, + pdfColorType: 'draw', + precision: 2 + }) + ), + this + ) + }), + (q.setFillColor = function(t, e, A, r) { + return ( + $( + V({ + ch1: t, + ch2: e, + ch3: A, + ch4: r, + pdfColorType: 'fill', + precision: 2 + }) + ), + this + ) + }), + (q.setTextColor = function(t, e, A, r) { + return ( + (v = V({ + ch1: t, + ch2: e, + ch3: A, + ch4: r, + pdfColorType: 'text', + precision: 3 + })), + this + ) + }), + (q.setCharSpace = function(t) { + return (U = t), this + }), + (q.setR2L = function(t) { + return (b = t), this + }), + (q.CapJoinStyles = { + 0: 0, + butt: 0, + but: 0, + miter: 0, + 1: 1, + round: 1, + rounded: 1, + circle: 1, + 2: 2, + projecting: 2, + project: 2, + square: 2, + bevel: 2 + }), + (q.setLineCap = function(t) { + var e = this.CapJoinStyles[t] + if (void 0 === e) + throw new Error( + "Line cap style of '" + + t + + "' is not recognized. See or extend .CapJoinStyles property for valid styles" + ) + return $((R = e) + ' J'), this + }), + (q.setLineJoin = function(t) { + var e = this.CapJoinStyles[t] + if (void 0 === e) + throw new Error( + "Line join style of '" + + t + + "' is not recognized. See or extend .CapJoinStyles property for valid styles" + ) + return $((M = e) + ' j'), this + }), + (q.output = ft), + (q.save = function(t) { + q.output('save', t) + }), + A.API)) + A.API.hasOwnProperty(gt) && + ('events' === gt && A.API.events.length + ? (function(t, e) { + var A, r, n + for (n = e.length - 1; -1 !== n; n--) + (A = e[n][0]), + (r = e[n][1]), + t.subscribe.apply( + t, + [A].concat('function' == typeof r ? [r] : r) + ) + })(j, A.API.events) + : (q[gt] = A.API[gt])) + return ( + (function() { + for ( + var t = 'helvetica', + e = 'times', + A = 'courier', + r = 'normal', + n = 'bold', + i = 'italic', + o = 'bolditalic', + a = [ + ['Helvetica', t, r, 'WinAnsiEncoding'], + ['Helvetica-Bold', t, n, 'WinAnsiEncoding'], + ['Helvetica-Oblique', t, i, 'WinAnsiEncoding'], + ['Helvetica-BoldOblique', t, o, 'WinAnsiEncoding'], + ['Courier', A, r, 'WinAnsiEncoding'], + ['Courier-Bold', A, n, 'WinAnsiEncoding'], + ['Courier-Oblique', A, i, 'WinAnsiEncoding'], + ['Courier-BoldOblique', A, o, 'WinAnsiEncoding'], + ['Times-Roman', e, r, 'WinAnsiEncoding'], + ['Times-Bold', e, n, 'WinAnsiEncoding'], + ['Times-Italic', e, i, 'WinAnsiEncoding'], + ['Times-BoldItalic', e, o, 'WinAnsiEncoding'], + ['ZapfDingbats', 'zapfdingbats', r, null], + ['Symbol', 'symbol', r, null] + ], + s = 0, + c = a.length; + s < c; + s++ + ) { + var l = nt(a[s][0], a[s][1], a[s][2], a[s][3]), + u = a[s][0].split('-') + rt(l, u[0], u[1] || '') + } + j.publish('addFonts', { + fonts: _, + dictionary: T + }) + })(), + (c = 'F1'), + ot(o, e), + j.publish('initialized'), + q + ) + } + var r = '1.3', + n = { + a0: [2383.94, 3370.39], + a1: [1683.78, 2383.94], + a2: [1190.55, 1683.78], + a3: [841.89, 1190.55], + a4: [595.28, 841.89], + a5: [419.53, 595.28], + a6: [297.64, 419.53], + a7: [209.76, 297.64], + a8: [147.4, 209.76], + a9: [104.88, 147.4], + a10: [73.7, 104.88], + b0: [2834.65, 4008.19], + b1: [2004.09, 2834.65], + b2: [1417.32, 2004.09], + b3: [1000.63, 1417.32], + b4: [708.66, 1000.63], + b5: [498.9, 708.66], + b6: [354.33, 498.9], + b7: [249.45, 354.33], + b8: [175.75, 249.45], + b9: [124.72, 175.75], + b10: [87.87, 124.72], + c0: [2599.37, 3676.54], + c1: [1836.85, 2599.37], + c2: [1298.27, 1836.85], + c3: [918.43, 1298.27], + c4: [649.13, 918.43], + c5: [459.21, 649.13], + c6: [323.15, 459.21], + c7: [229.61, 323.15], + c8: [161.57, 229.61], + c9: [113.39, 161.57], + c10: [79.37, 113.39], + dl: [311.81, 623.62], + letter: [612, 792], + 'government-letter': [576, 756], + legal: [612, 1008], + 'junior-legal': [576, 360], + ledger: [1224, 792], + tabloid: [792, 1224], + 'credit-card': [153, 243] + } + return ( + (A.API = { + events: [] + }), + (A.version = '0.0.0'), + e.exports + ? ((e.exports = A), (e.exports.jsPDF = A)) + : (t.jsPDF = A), + A + ) + })( + ('undefined' != typeof self && self) || + ('undefined' != typeof window && window) || + (void 0 !== r && r) || + Function('return typeof this === "object" && this.content')() || + Function('return this')() + ) + !(function(t, e) { + var A, + r, + n = 1, + i = function(t, e) { + ; (t.prototype = Object.create(e.prototype)), + (t.prototype.constructor = t) + }, + o = function(t) { + return t * (n / 1) + }, + a = function(t) { + var e = new F(), + A = R.internal.getHeight(t) || 0, + r = R.internal.getWidth(t) || 0 + return (e.BBox = [0, 0, r.toFixed(2), A.toFixed(2)]), e + }, + s = function(t, e, A) { + t = t || 0 + var r = 1 + return (r <<= e - 1), 1 == (A = A || 1) ? (t |= r) : (t &= ~r), t + }, + c = function(t, e, A) { + return ( + (A = A || 1.3), + (t = t || 0), + 1 == e.readOnly && (t = s(t, 1)), + 1 == e.required && (t = s(t, 2)), + 1 == e.noExport && (t = s(t, 3)), + 1 == e.multiline && (t = s(t, 13)), + e.password && (t = s(t, 14)), + e.noToggleToOff && (t = s(t, 15)), + e.radio && (t = s(t, 16)), + e.pushbutton && (t = s(t, 17)), + e.combo && (t = s(t, 18)), + e.edit && (t = s(t, 19)), + e.sort && (t = s(t, 20)), + e.fileSelect && 1.4 <= A && (t = s(t, 21)), + e.multiSelect && 1.4 <= A && (t = s(t, 22)), + e.doNotSpellCheck && 1.4 <= A && (t = s(t, 23)), + 1 == e.doNotScroll && 1.4 <= A && (t = s(t, 24)), + e.richText && 1.4 <= A && (t = s(t, 25)), + t + ) + }, + l = function(t) { + var e = t[0], + A = t[1], + n = t[2], + i = t[3], + a = {} + return ( + Array.isArray(e) + ? ((e[0] = o(e[0])), + (e[1] = o(e[1])), + (e[2] = o(e[2])), + (e[3] = o(e[3]))) + : ((e = o(e)), (A = o(A)), (n = o(n)), (i = o(i))), + (a.lowerLeft_X = e || 0), + (a.lowerLeft_Y = o(r) - A - i || 0), + (a.upperRight_X = e + n || 0), + (a.upperRight_Y = o(r) - A || 0), + [ + a.lowerLeft_X.toFixed(2), + a.lowerLeft_Y.toFixed(2), + a.upperRight_X.toFixed(2), + a.upperRight_Y.toFixed(2) + ] + ) + }, + u = function(t) { + if (t.appearanceStreamContent) return t.appearanceStreamContent + if (t.V || t.DV) { + var e = [], + A = t.V || t.DV, + r = h(t, A) + e.push('/Tx BMC'), + e.push('q'), + e.push('/F1 ' + r.fontSize.toFixed(2) + ' Tf'), + e.push('1 0 0 1 0 0 Tm'), + e.push('BT'), + e.push(r.text), + e.push('ET'), + e.push('Q'), + e.push('EMC') + var n = new a(t) + return (n.stream = e.join('\n')), n + } + }, + h = function(t, e, A, r) { + ; (r = r || 12), (A = A || 'helvetica') + var n = { + text: '', + fontSize: '' + }, + i = (e = + ')' == + (e = '(' == e.substr(0, 1) ? e.substr(1) : e).substr( + e.length - 1 + ) + ? e.substr(0, e.length - 1) + : e).split(' '), + o = r, + a = R.internal.getHeight(t) || 0 + a = a < 0 ? -a : a + var s = R.internal.getWidth(t) || 0 + s = s < 0 ? -s : s + var c = function(t, e, r) { + if (t + 1 < i.length) { + var n = e + ' ' + i[t + 1] + return d(n, r + 'px', A).width <= s - 4 + } + return !1 + } + o++ + t: for (; ;) { + e = '' + var l = d('3', --o + 'px', A).height, + u = t.multiline ? a - o : (a - l) / 2, + h = -2, + f = (u += 2), + p = 0, + g = 0, + B = 0 + if (o <= 0) { + ; (o = 12), + (e = '(...) Tj\n'), + (e += + '% Width of Text: ' + + d(e, '1px').width + + ', FieldWidth:' + + s + + '\n') + break + } + B = d(i[0] + ' ', o + 'px', A).width + var w = '', + m = 0 + for (var y in i) { + w = + ' ' == (w += i[y] + ' ').substr(w.length - 1) + ? w.substr(0, w.length - 1) + : w + var v = parseInt(y) + B = d(w + ' ', o + 'px', A).width + var Q = c(v, w, o), + C = y >= i.length - 1 + if (!Q || C) { + if (Q || C) { + if (C) g = v + else if (t.multiline && a < (l + 2) * (m + 2) + 2) + continue t + } else { + if (!t.multiline) continue t + if (a < (l + 2) * (m + 2) + 2) continue t + g = v + } + for (var U = '', b = p; b <= g; b++) U += i[b] + ' ' + switch ( + ((U = + ' ' == U.substr(U.length - 1) + ? U.substr(0, U.length - 1) + : U), + (B = d(U, o + 'px', A).width), + t.Q) + ) { + case 2: + h = s - B - 2 + break + case 1: + h = (s - B) / 2 + break + case 0: + default: + h = 2 + } + ; (e += h.toFixed(2) + ' ' + f.toFixed(2) + ' Td\n'), + (e += '(' + U + ') Tj\n'), + (e += -h.toFixed(2) + ' 0 Td\n'), + (f = -(o + 2)), + (B = 0), + (p = g + 1), + m++, + (w = '') + } else w += ' ' + } + break + } + return (n.text = e), (n.fontSize = o), n + }, + d = function(t, e, r) { + r = r || 'helvetica' + var n = A.internal.getFont(r), + i = + A.getStringUnitWidth(t, { + font: n, + fontSize: parseFloat(e), + charSpace: 0 + }) * parseFloat(e) + return { + height: + A.getStringUnitWidth('3', { + font: n, + fontSize: parseFloat(e), + charSpace: 0 + }) * + parseFloat(e) * + 1.5, + width: i + } + }, + f = { + fields: [], + xForms: [], + acroFormDictionaryRoot: null, + printedOut: !1, + internal: null, + isInitialized: !1 + }, + p = function() { + for (var t in A.internal.acroformPlugin.acroFormDictionaryRoot + .Fields) { + var e = + A.internal.acroformPlugin.acroFormDictionaryRoot.Fields[t] + e.hasAnnotation && B.call(A, e) + } + }, + g = function(t) { + A.internal.acroformPlugin.printedOut && + ((A.internal.acroformPlugin.printedOut = !1), + (A.internal.acroformPlugin.acroFormDictionaryRoot = null)), + A.internal.acroformPlugin.acroFormDictionaryRoot || Q.call(A), + A.internal.acroformPlugin.acroFormDictionaryRoot.Fields.push(t) + }, + B = function(t) { + var e = { + type: 'reference', + object: t + } + A.annotationPlugin.annotations[ + A.internal.getPageInfo(t.page).pageNumber + ].push(e) + }, + w = function() { + void 0 !== A.internal.acroformPlugin.acroFormDictionaryRoot + ? A.internal.write( + '/AcroForm ' + + A.internal.acroformPlugin.acroFormDictionaryRoot.objId + + ' 0 R' + ) + : console.log('Root missing...') + }, + m = function() { + A.internal.events.unsubscribe( + A.internal.acroformPlugin.acroFormDictionaryRoot._eventID + ), + delete A.internal.acroformPlugin.acroFormDictionaryRoot + ._eventID, + (A.internal.acroformPlugin.printedOut = !0) + }, + y = function(t) { + var e = !t + t || + (A.internal.newObjectDeferredBegin( + A.internal.acroformPlugin.acroFormDictionaryRoot.objId + ), + A.internal.out( + A.internal.acroformPlugin.acroFormDictionaryRoot.getString() + )), + (t = t || A.internal.acroformPlugin.acroFormDictionaryRoot.Kids) + for (var r in t) { + var n = t[r], + i = n.Rect + n.Rect && (n.Rect = l.call(this, n.Rect)), + A.internal.newObjectDeferredBegin(n.objId) + var o = n.objId + ' 0 obj\n<<\n' + if ( + ('object' === (void 0 === n ? 'undefined' : at(n)) && + 'function' == typeof n.getContent && + (o += n.getContent()), + (n.Rect = i), + n.hasAppearanceStream && !n.appearanceStreamContent) + ) { + var a = u.call(this, n) + ; (o += '/AP << /N ' + a + ' >>\n'), + A.internal.acroformPlugin.xForms.push(a) + } + if (n.appearanceStreamContent) { + for (var s in ((o += '/AP << '), n.appearanceStreamContent)) { + var c = n.appearanceStreamContent[s] + if ( + ((o += '/' + s + ' '), + (o += '<< '), + 1 <= Object.keys(c).length || Array.isArray(c)) + ) + for (var r in c) { + var h + 'function' == typeof (h = c[r]) && + (h = h.call(this, n)), + (o += '/' + r + ' ' + h + ' '), + 0 <= A.internal.acroformPlugin.xForms.indexOf(h) || + A.internal.acroformPlugin.xForms.push(h) + } + else + 'function' == typeof (h = c) && (h = h.call(this, n)), + (o += '/' + r + ' ' + h + ' \n'), + 0 <= A.internal.acroformPlugin.xForms.indexOf(h) || + A.internal.acroformPlugin.xForms.push(h) + o += ' >>\n' + } + o += '>>\n' + } + ; (o += '>>\nendobj\n'), A.internal.out(o) + } + e && v.call(this, A.internal.acroformPlugin.xForms) + }, + v = function(t) { + for (var e in t) { + var r = e, + n = t[e] + A.internal.newObjectDeferredBegin(n && n.objId) + var i = '' + 'object' === (void 0 === n ? 'undefined' : at(n)) && + 'function' == typeof n.getString && + (i = n.getString()), + A.internal.out(i), + delete t[r] + } + }, + Q = function() { + if ( + void 0 !== this.internal && + (void 0 === this.internal.acroformPlugin || + !1 === this.internal.acroformPlugin.isInitialized) + ) { + if ( + ((A = this), + (x.FieldNum = 0), + (this.internal.acroformPlugin = JSON.parse( + JSON.stringify(f) + )), + this.internal.acroformPlugin.acroFormDictionaryRoot) + ) + throw new Error('Exception while creating AcroformDictionary') + ; (n = A.internal.scaleFactor), + (r = A.internal.pageSize.getHeight()), + (A.internal.acroformPlugin.acroFormDictionaryRoot = new E()), + (A.internal.acroformPlugin.acroFormDictionaryRoot._eventID = + A.internal.events.subscribe('postPutResources', m)), + A.internal.events.subscribe('buildDocument', p), + A.internal.events.subscribe('putCatalog', w), + A.internal.events.subscribe('postPutPages', y), + (A.internal.acroformPlugin.isInitialized = !0) + } + }, + C = function(t) { + if (Array.isArray(t)) { + var e = ' [' + for (var A in t) + (e += t[A].toString()), (e += A < t.length - 1 ? ' ' : '') + return (e += ']') + } + }, + U = function(t) { + return ( + 0 !== (t = t || '').indexOf('(') && (t = '(' + t), + ')' != t.substring(t.length - 1) && (t += ')'), + t + ) + }, + b = function() { + var t + Object.defineProperty(this, 'objId', { + get: function() { + return ( + t || (t = A.internal.newObjectDeferred()), + t || console.log("Couldn't create Object ID"), + t + ) + }, + configurable: !1 + }) + } + ; (b.prototype.toString = function() { + return this.objId + ' 0 R' + }), + (b.prototype.getString = function() { + var t = this.objId + ' 0 obj\n<<' + return ( + (t += this.getContent() + '>>\n'), + this.stream && + ((t += 'stream\n'), + (t += this.stream), + (t += '\nendstream\n')), + (t += 'endobj\n') + ) + }), + (b.prototype.getContent = function() { + var t = '' + return (t += (function(t) { + var e = '', + A = Object.keys(t).filter(function(t) { + return ( + 'content' != t && + 'appearanceStreamContent' != t && + '_' != t.substring(0, 1) + ) + }) + for (var r in A) { + var n = A[r], + i = t[n] + i && + (Array.isArray(i) + ? (e += '/' + n + ' ' + C(i) + '\n') + : (e += + i instanceof b + ? '/' + n + ' ' + i.objId + ' 0 R\n' + : '/' + n + ' ' + i + '\n')) + } + return e + })(this)) + }) + var F = function() { + var t + b.call(this), + (this.Type = '/XObject'), + (this.Subtype = '/Form'), + (this.FormType = 1), + this.BBox, + this.Matrix, + (this.Resources = '2 0 R'), + this.PieceInfo, + Object.defineProperty(this, 'Length', { + enumerable: !0, + get: function() { + return void 0 !== t ? t.length : 0 + } + }), + Object.defineProperty(this, 'stream', { + enumerable: !1, + set: function(e) { + t = e.trim() + }, + get: function() { + return t || null + } + }) + } + i(F, b) + var E = function() { + b.call(this) + var t = [] + Object.defineProperty(this, 'Kids', { + enumerable: !1, + configurable: !0, + get: function() { + return 0 < t.length ? t : void 0 + } + }), + Object.defineProperty(this, 'Fields', { + enumerable: !0, + configurable: !0, + get: function() { + return t + } + }), + this.DA + } + i(E, b) + var x = function t() { + var e + b.call(this), + Object.defineProperty(this, 'Rect', { + enumerable: !0, + configurable: !1, + get: function() { + if (e) return e + }, + set: function(t) { + e = t + } + }) + var A, + r, + n, + i, + o = '' + Object.defineProperty(this, 'FT', { + enumerable: !0, + set: function(t) { + o = t + }, + get: function() { + return o + } + }), + Object.defineProperty(this, 'T', { + enumerable: !0, + configurable: !1, + set: function(t) { + A = t + }, + get: function() { + if (!A || A.length < 1) { + if (this instanceof O) return + return '(FieldObject' + t.FieldNum++ + ')' + } + return '(' == A.substring(0, 1) && A.substring(A.length - 1) + ? A + : '(' + A + ')' + } + }), + Object.defineProperty(this, 'DA', { + enumerable: !0, + get: function() { + if (r) return '(' + r + ')' + }, + set: function(t) { + r = t + } + }), + Object.defineProperty(this, 'DV', { + enumerable: !0, + configurable: !0, + get: function() { + if (n) return n + }, + set: function(t) { + n = t + } + }), + Object.defineProperty(this, 'V', { + enumerable: !0, + configurable: !0, + get: function() { + if (i) return i + }, + set: function(t) { + i = t + } + }), + Object.defineProperty(this, 'Type', { + enumerable: !0, + get: function() { + return this.hasAnnotation ? '/Annot' : null + } + }), + Object.defineProperty(this, 'Subtype', { + enumerable: !0, + get: function() { + return this.hasAnnotation ? '/Widget' : null + } + }), + this.BG, + Object.defineProperty(this, 'hasAnnotation', { + enumerable: !1, + get: function() { + return !!(this.Rect || this.BC || this.BG) + } + }), + Object.defineProperty(this, 'hasAppearanceStream', { + enumerable: !1, + configurable: !0, + writable: !0 + }), + Object.defineProperty(this, 'page', { + enumerable: !1, + configurable: !0, + writable: !0 + }) + } + i(x, b) + var H = function() { + x.call(this), + (this.FT = '/Ch'), + (this.Opt = []), + (this.V = '()'), + (this.TI = 0) + var t = !1 + Object.defineProperty(this, 'combo', { + enumerable: !1, + get: function() { + return t + }, + set: function(e) { + t = e + } + }), + Object.defineProperty(this, 'edit', { + enumerable: !0, + set: function(t) { + 1 == t + ? ((this._edit = !0), (this.combo = !0)) + : (this._edit = !1) + }, + get: function() { + return !!this._edit && this._edit + }, + configurable: !1 + }), + (this.hasAppearanceStream = !0) + } + i(H, x) + var I = function() { + H.call(this), (this.combo = !1) + } + i(I, H) + var S = function() { + I.call(this), (this.combo = !0) + } + i(S, I) + var _ = function() { + S.call(this), (this.edit = !0) + } + i(_, S) + var T = function() { + x.call(this), (this.FT = '/Btn') + } + i(T, x) + var N = function() { + T.call(this) + var t = !0 + Object.defineProperty(this, 'pushbutton', { + enumerable: !1, + get: function() { + return t + }, + set: function(e) { + t = e + } + }) + } + i(N, T) + var k = function() { + T.call(this) + var t = !0 + Object.defineProperty(this, 'radio', { + enumerable: !1, + get: function() { + return t + }, + set: function(e) { + t = e + } + }) + var e, + A = [] + Object.defineProperty(this, 'Kids', { + enumerable: !0, + get: function() { + if (0 < A.length) return A + } + }), + Object.defineProperty(this, '__Kids', { + get: function() { + return A + } + }), + Object.defineProperty(this, 'noToggleToOff', { + enumerable: !1, + get: function() { + return e + }, + set: function(t) { + e = t + } + }) + } + i(k, T) + var O = function(t, e) { + x.call(this), + (this.Parent = t), + (this._AppearanceType = R.RadioButton.Circle), + (this.appearanceStreamContent = + this._AppearanceType.createAppearanceStream(e)), + (this.F = s(this.F, 3, 1)), + (this.MK = this._AppearanceType.createMK()), + (this.AS = '/Off'), + (this._Name = e) + } + i(O, x), + (k.prototype.setAppearance = function(t) { + if ('createAppearanceStream' in t && 'createMK' in t) + for (var e in this.__Kids) { + var A = this.__Kids[e] + ; (A.appearanceStreamContent = t.createAppearanceStream( + A._Name + )), + (A.MK = t.createMK()) + } + else + console.log( + "Couldn't assign Appearance to RadioButton. Appearance was Invalid!" + ) + }), + (k.prototype.createOption = function(e) { + this.__Kids.length + var A = new O(this, e) + return this.__Kids.push(A), t.addField(A), A + }) + var P = function() { + T.call(this), + (this.appearanceStreamContent = + R.CheckBox.createAppearanceStream()), + (this.MK = R.CheckBox.createMK()), + (this.AS = '/On'), + (this.V = '/On') + } + i(P, T) + var D = function() { + var t, e + x.call(this), + (this.DA = R.createDefaultAppearanceStream()), + (this.F = 4), + Object.defineProperty(this, 'V', { + get: function() { + return t ? U(t) : t + }, + enumerable: !0, + set: function(e) { + t = e + } + }), + Object.defineProperty(this, 'DV', { + get: function() { + return e ? U(e) : e + }, + enumerable: !0, + set: function(t) { + e = t + } + }) + var A = !1 + Object.defineProperty(this, 'multiline', { + enumerable: !1, + get: function() { + return A + }, + set: function(t) { + A = t + } + }) + var r = !1 + Object.defineProperty(this, 'fileSelect', { + enumerable: !1, + get: function() { + return r + }, + set: function(t) { + r = t + } + }) + var n = !1 + Object.defineProperty(this, 'doNotSpellCheck', { + enumerable: !1, + get: function() { + return n + }, + set: function(t) { + n = t + } + }) + var i = !1 + Object.defineProperty(this, 'doNotScroll', { + enumerable: !1, + get: function() { + return i + }, + set: function(t) { + i = t + } + }) + var o = !1 + Object.defineProperty(this, 'MaxLen', { + enumerable: !0, + get: function() { + return o + }, + set: function(t) { + o = t + } + }), + Object.defineProperty(this, 'hasAppearanceStream', { + enumerable: !1, + get: function() { + return this.V || this.DV + } + }) + } + i(D, x) + var L = function() { + D.call(this) + var t = !0 + Object.defineProperty(this, 'password', { + enumerable: !1, + get: function() { + return t + }, + set: function(e) { + t = e + } + }) + } + i(L, D) + var R = { + CheckBox: { + createAppearanceStream: function() { + return { + N: { + On: R.CheckBox.YesNormal + }, + D: { + On: R.CheckBox.YesPushDown, + Off: R.CheckBox.OffPushDown + } + } + }, + createMK: function() { + return '<< /CA (3)>>' + }, + YesPushDown: function(t) { + var e = a(t), + r = [], + n = A.internal.getFont('zapfdingbats', 'normal').id + t.Q = 1 + var i = h(t, '3', 'ZapfDingbats', 50) + return ( + r.push('0.749023 g'), + r.push( + '0 0 ' + + R.internal.getWidth(t).toFixed(2) + + ' ' + + R.internal.getHeight(t).toFixed(2) + + ' re' + ), + r.push('f'), + r.push('BMC'), + r.push('q'), + r.push('0 0 1 rg'), + r.push('/' + n + ' ' + i.fontSize.toFixed(2) + ' Tf 0 g'), + r.push('BT'), + r.push(i.text), + r.push('ET'), + r.push('Q'), + r.push('EMC'), + (e.stream = r.join('\n')), + e + ) + }, + YesNormal: function(t) { + var e = a(t), + r = A.internal.getFont('zapfdingbats', 'normal').id, + n = [] + t.Q = 1 + var i = R.internal.getHeight(t), + o = R.internal.getWidth(t), + s = h(t, '3', 'ZapfDingbats', 0.9 * i) + return ( + n.push('1 g'), + n.push('0 0 ' + o.toFixed(2) + ' ' + i.toFixed(2) + ' re'), + n.push('f'), + n.push('q'), + n.push('0 0 1 rg'), + n.push( + '0 0 ' + + (o - 1).toFixed(2) + + ' ' + + (i - 1).toFixed(2) + + ' re' + ), + n.push('W'), + n.push('n'), + n.push('0 g'), + n.push('BT'), + n.push('/' + r + ' ' + s.fontSize.toFixed(2) + ' Tf 0 g'), + n.push(s.text), + n.push('ET'), + n.push('Q'), + (e.stream = n.join('\n')), + e + ) + }, + OffPushDown: function(t) { + var e = a(t), + A = [] + return ( + A.push('0.749023 g'), + A.push( + '0 0 ' + + R.internal.getWidth(t).toFixed(2) + + ' ' + + R.internal.getHeight(t).toFixed(2) + + ' re' + ), + A.push('f'), + (e.stream = A.join('\n')), + e + ) + } + }, + RadioButton: { + Circle: { + createAppearanceStream: function(t) { + var e = { + D: { + Off: R.RadioButton.Circle.OffPushDown + }, + N: {} + } + return ( + (e.N[t] = R.RadioButton.Circle.YesNormal), + (e.D[t] = R.RadioButton.Circle.YesPushDown), + e + ) + }, + createMK: function() { + return '<< /CA (l)>>' + }, + YesNormal: function(t) { + var e = a(t), + A = [], + r = + R.internal.getWidth(t) <= R.internal.getHeight(t) + ? R.internal.getWidth(t) / 4 + : R.internal.getHeight(t) / 4 + r *= 0.9 + var n = R.internal.Bezier_C + return ( + A.push('q'), + A.push( + '1 0 0 1 ' + + R.internal.getWidth(t) / 2 + + ' ' + + R.internal.getHeight(t) / 2 + + ' cm' + ), + A.push(r + ' 0 m'), + A.push( + r + ' ' + r * n + ' ' + r * n + ' ' + r + ' 0 ' + r + ' c' + ), + A.push( + '-' + + r * n + + ' ' + + r + + ' -' + + r + + ' ' + + r * n + + ' -' + + r + + ' 0 c' + ), + A.push( + '-' + + r + + ' -' + + r * n + + ' -' + + r * n + + ' -' + + r + + ' 0 -' + + r + + ' c' + ), + A.push( + r * n + + ' -' + + r + + ' ' + + r + + ' -' + + r * n + + ' ' + + r + + ' 0 c' + ), + A.push('f'), + A.push('Q'), + (e.stream = A.join('\n')), + e + ) + }, + YesPushDown: function(t) { + var e = a(t), + A = [], + r = + R.internal.getWidth(t) <= R.internal.getHeight(t) + ? R.internal.getWidth(t) / 4 + : R.internal.getHeight(t) / 4, + n = 2 * (r *= 0.9), + i = n * R.internal.Bezier_C, + o = r * R.internal.Bezier_C + return ( + A.push('0.749023 g'), + A.push('q'), + A.push( + '1 0 0 1 ' + + (R.internal.getWidth(t) / 2).toFixed(2) + + ' ' + + (R.internal.getHeight(t) / 2).toFixed(2) + + ' cm' + ), + A.push(n + ' 0 m'), + A.push(n + ' ' + i + ' ' + i + ' ' + n + ' 0 ' + n + ' c'), + A.push( + '-' + i + ' ' + n + ' -' + n + ' ' + i + ' -' + n + ' 0 c' + ), + A.push( + '-' + + n + + ' -' + + i + + ' -' + + i + + ' -' + + n + + ' 0 -' + + n + + ' c' + ), + A.push( + i + ' -' + n + ' ' + n + ' -' + i + ' ' + n + ' 0 c' + ), + A.push('f'), + A.push('Q'), + A.push('0 g'), + A.push('q'), + A.push( + '1 0 0 1 ' + + (R.internal.getWidth(t) / 2).toFixed(2) + + ' ' + + (R.internal.getHeight(t) / 2).toFixed(2) + + ' cm' + ), + A.push(r + ' 0 m'), + A.push(r + ' ' + o + ' ' + o + ' ' + r + ' 0 ' + r + ' c'), + A.push( + '-' + o + ' ' + r + ' -' + r + ' ' + o + ' -' + r + ' 0 c' + ), + A.push( + '-' + + r + + ' -' + + o + + ' -' + + o + + ' -' + + r + + ' 0 -' + + r + + ' c' + ), + A.push( + o + ' -' + r + ' ' + r + ' -' + o + ' ' + r + ' 0 c' + ), + A.push('f'), + A.push('Q'), + (e.stream = A.join('\n')), + e + ) + }, + OffPushDown: function(t) { + var e = a(t), + A = [], + r = + R.internal.getWidth(t) <= R.internal.getHeight(t) + ? R.internal.getWidth(t) / 4 + : R.internal.getHeight(t) / 4, + n = 2 * (r *= 0.9), + i = n * R.internal.Bezier_C + return ( + A.push('0.749023 g'), + A.push('q'), + A.push( + '1 0 0 1 ' + + (R.internal.getWidth(t) / 2).toFixed(2) + + ' ' + + (R.internal.getHeight(t) / 2).toFixed(2) + + ' cm' + ), + A.push(n + ' 0 m'), + A.push(n + ' ' + i + ' ' + i + ' ' + n + ' 0 ' + n + ' c'), + A.push( + '-' + i + ' ' + n + ' -' + n + ' ' + i + ' -' + n + ' 0 c' + ), + A.push( + '-' + + n + + ' -' + + i + + ' -' + + i + + ' -' + + n + + ' 0 -' + + n + + ' c' + ), + A.push( + i + ' -' + n + ' ' + n + ' -' + i + ' ' + n + ' 0 c' + ), + A.push('f'), + A.push('Q'), + (e.stream = A.join('\n')), + e + ) + } + }, + Cross: { + createAppearanceStream: function(t) { + var e = { + D: { + Off: R.RadioButton.Cross.OffPushDown + }, + N: {} + } + return ( + (e.N[t] = R.RadioButton.Cross.YesNormal), + (e.D[t] = R.RadioButton.Cross.YesPushDown), + e + ) + }, + createMK: function() { + return '<< /CA (8)>>' + }, + YesNormal: function(t) { + var e = a(t), + A = [], + r = R.internal.calculateCross(t) + return ( + A.push('q'), + A.push( + '1 1 ' + + (R.internal.getWidth(t) - 2).toFixed(2) + + ' ' + + (R.internal.getHeight(t) - 2).toFixed(2) + + ' re' + ), + A.push('W'), + A.push('n'), + A.push(r.x1.x.toFixed(2) + ' ' + r.x1.y.toFixed(2) + ' m'), + A.push(r.x2.x.toFixed(2) + ' ' + r.x2.y.toFixed(2) + ' l'), + A.push(r.x4.x.toFixed(2) + ' ' + r.x4.y.toFixed(2) + ' m'), + A.push(r.x3.x.toFixed(2) + ' ' + r.x3.y.toFixed(2) + ' l'), + A.push('s'), + A.push('Q'), + (e.stream = A.join('\n')), + e + ) + }, + YesPushDown: function(t) { + var e = a(t), + A = R.internal.calculateCross(t), + r = [] + return ( + r.push('0.749023 g'), + r.push( + '0 0 ' + + R.internal.getWidth(t).toFixed(2) + + ' ' + + R.internal.getHeight(t).toFixed(2) + + ' re' + ), + r.push('f'), + r.push('q'), + r.push( + '1 1 ' + + (R.internal.getWidth(t) - 2).toFixed(2) + + ' ' + + (R.internal.getHeight(t) - 2).toFixed(2) + + ' re' + ), + r.push('W'), + r.push('n'), + r.push(A.x1.x.toFixed(2) + ' ' + A.x1.y.toFixed(2) + ' m'), + r.push(A.x2.x.toFixed(2) + ' ' + A.x2.y.toFixed(2) + ' l'), + r.push(A.x4.x.toFixed(2) + ' ' + A.x4.y.toFixed(2) + ' m'), + r.push(A.x3.x.toFixed(2) + ' ' + A.x3.y.toFixed(2) + ' l'), + r.push('s'), + r.push('Q'), + (e.stream = r.join('\n')), + e + ) + }, + OffPushDown: function(t) { + var e = a(t), + A = [] + return ( + A.push('0.749023 g'), + A.push( + '0 0 ' + + R.internal.getWidth(t).toFixed(2) + + ' ' + + R.internal.getHeight(t).toFixed(2) + + ' re' + ), + A.push('f'), + (e.stream = A.join('\n')), + e + ) + } + } + }, + createDefaultAppearanceStream: function(t) { + return '/F1 0 Tf 0 g' + } + } + ; (R.internal = { + Bezier_C: 0.551915024494, + calculateCross: function(t) { + var e, + A, + r = R.internal.getWidth(t), + n = R.internal.getHeight(t), + i = (A = n) < (e = r) ? A : e + return { + x1: { + x: (r - i) / 2, + y: (n - i) / 2 + i + }, + x2: { + x: (r - i) / 2 + i, + y: (n - i) / 2 + }, + x3: { + x: (r - i) / 2, + y: (n - i) / 2 + }, + x4: { + x: (r - i) / 2 + i, + y: (n - i) / 2 + i + } + } + } + }), + (R.internal.getWidth = function(t) { + var e = 0 + return ( + 'object' === (void 0 === t ? 'undefined' : at(t)) && + (e = o(t.Rect[2])), + e + ) + }), + (R.internal.getHeight = function(t) { + var e = 0 + return ( + 'object' === (void 0 === t ? 'undefined' : at(t)) && + (e = o(t.Rect[3])), + e + ) + }), + (t.addField = function(t) { + return ( + Q.call(this), + t instanceof D + ? this.addTextField.call(this, t) + : t instanceof H + ? this.addChoiceField.call(this, t) + : t instanceof T + ? this.addButton.call(this, t) + : t instanceof O + ? g.call(this, t) + : t && g.call(this, t), + (t.page = A.internal.getCurrentPageInfo().pageNumber), + this + ) + }), + (t.addButton = function(t) { + Q.call(this) + var e = t || new x() + ; (e.FT = '/Btn'), + (e.Ff = c(e.Ff, t, A.internal.getPDFVersion())), + g.call(this, e) + }), + (t.addTextField = function(t) { + Q.call(this) + var e = t || new x() + ; (e.FT = '/Tx'), + (e.Ff = c(e.Ff, t, A.internal.getPDFVersion())), + g.call(this, e) + }), + (t.addChoiceField = function(t) { + Q.call(this) + var e = t || new x() + ; (e.FT = '/Ch'), + (e.Ff = c(e.Ff, t, A.internal.getPDFVersion())), + g.call(this, e) + }), + 'object' == (void 0 === e ? 'undefined' : at(e)) && + ((e.ChoiceField = H), + (e.ListBox = I), + (e.ComboBox = S), + (e.EditBox = _), + (e.Button = T), + (e.PushButton = N), + (e.RadioButton = k), + (e.CheckBox = P), + (e.TextField = D), + (e.PasswordField = L), + (e.AcroForm = { + Appearance: R + })), + (t.AcroFormChoiceField = H), + (t.AcroFormListBox = I), + (t.AcroFormComboBox = S), + (t.AcroFormEditBox = _), + (t.AcroFormButton = T), + (t.AcroFormPushButton = N), + (t.AcroFormRadioButton = k), + (t.AcroFormCheckBox = P), + (t.AcroFormTextField = D), + (t.AcroFormPasswordField = L), + (t.AcroForm = { + ChoiceField: H, + ListBox: I, + ComboBox: S, + EditBox: _, + Button: T, + PushButton: N, + RadioButton: k, + CheckBox: P, + TextField: D, + PasswordField: L + }) + })( + st.API, + ('undefined' != typeof window && window) || (void 0 !== r && r) + ), + (st.API.addHTML = function(t, e, A, r, n) { + if ( + 'undefined' == typeof html2canvas && + 'undefined' == typeof rasterizeHTML + ) + throw new Error( + 'You need either https://github.com/niklasvh/html2canvas or https://github.com/cburgmer/rasterizeHTML.js' + ) + 'number' != typeof e && ((r = e), (n = A)), + 'function' == typeof r && ((n = r), (r = null)), + 'function' != typeof n && (n = function() { }) + var i = this.internal, + o = i.scaleFactor, + a = i.pageSize.getWidth(), + s = i.pageSize.getHeight() + if ( + (((r = r || {}).onrendered = function(t) { + ; (e = parseInt(e) || 0), (A = parseInt(A) || 0) + var i = r.dim || {}, + c = Object.assign( + { + top: 0, + right: 0, + bottom: 0, + left: 0, + useFor: 'content' + }, + r.margin + ), + l = i.h || Math.min(s, t.height / o), + u = i.w || Math.min(a, t.width / o) - e, + h = r.format || 'JPEG', + d = r.imageCompression || 'SLOW' + if (t.height > s - c.top - c.bottom && r.pagesplit) { + var f = function(t, e, A, n, i) { + var o = document.createElement('canvas') + ; (o.height = i), (o.width = n) + var a = o.getContext('2d') + return ( + (a.mozImageSmoothingEnabled = !1), + (a.webkitImageSmoothingEnabled = !1), + (a.msImageSmoothingEnabled = !1), + (a.imageSmoothingEnabled = !1), + (a.fillStyle = r.backgroundColor || '#ffffff'), + a.fillRect(0, 0, n, i), + a.drawImage(t, e, A, n, i, 0, 0, n, i), + o + ) + }, + p = function() { + for (var r, i, l = 0, p = 0, g = {}, B = !1; ;) { + var w + if ( + ((p = 0), + (g.top = 0 !== l ? c.top : A), + (g.left = 0 !== l ? c.left : e), + (B = (a - c.left - c.right) * o < t.width), + 'content' === c.useFor + ? 0 === l + ? ((r = Math.min((a - c.left) * o, t.width)), + (i = Math.min((s - c.top) * o, t.height - l))) + : ((r = Math.min(a * o, t.width)), + (i = Math.min(s * o, t.height - l)), + (g.top = 0)) + : ((r = Math.min( + (a - c.left - c.right) * o, + t.width + )), + (i = Math.min( + (s - c.bottom - c.top) * o, + t.height - l + ))), + B) + ) + for (; ;) { + 'content' === c.useFor && + (0 === p + ? (r = Math.min((a - c.left) * o, t.width)) + : ((r = Math.min(a * o, t.width - p)), + (g.left = 0))) + var m = [ + (w = f(t, p, l, r, i)), + g.left, + g.top, + w.width / o, + w.height / o, + h, + null, + d + ] + if ( + (this.addImage.apply(this, m), + (p += r) >= t.width) + ) + break + this.addPage() + } + else + (m = [ + (w = f(t, 0, l, r, i)), + g.left, + g.top, + w.width / o, + w.height / o, + h, + null, + d + ]), + this.addImage.apply(this, m) + if ((l += i) >= t.height) break + this.addPage() + } + n(u, l, null, m) + }.bind(this) + if ('CANVAS' === t.nodeName) { + var g = new Image() + ; (g.onload = p), (g.src = t.toDataURL('image/png')), (t = g) + } else p() + } else { + var B = Math.random().toString(35), + w = [t, e, A, u, l, h, B, d] + this.addImage.apply(this, w), n(u, l, B, w) + } + }.bind(this)), + 'undefined' != typeof html2canvas && !r.rstz) + ) + return html2canvas(t, r) + if ('undefined' != typeof rasterizeHTML) { + var c = 'drawDocument' + return ( + 'string' == typeof t && + (c = /^http/.test(t) ? 'drawURL' : 'drawHTML'), + (r.width = r.width || a * o), + rasterizeHTML[c](t, void 0, r).then( + function(t) { + r.onrendered(t.image) + }, + function(t) { + n(null, t) + } + ) + ) + } + return null + }), + (function(t) { + var e = 'addImage_', + A = { + PNG: [[137, 80, 78, 71]], + TIFF: [ + [77, 77, 0, 42], + [73, 73, 42, 0] + ], + JPEG: [ + [255, 216, 255, 224, void 0, void 0, 74, 70, 73, 70, 0], + [255, 216, 255, 225, void 0, void 0, 69, 120, 105, 102, 0, 0] + ], + JPEG2000: [[0, 0, 0, 12, 106, 80, 32, 32]], + GIF87a: [[71, 73, 70, 56, 55, 97]], + GIF89a: [[71, 73, 70, 56, 57, 97]], + BMP: [ + [66, 77], + [66, 65], + [67, 73], + [67, 80], + [73, 67], + [80, 84] + ] + } + t.getImageFileTypeByImageData = function(t, e) { + var r, n + e = e || 'UNKNOWN' + var i, + o, + a, + s = 'UNKNOWN' + for (a in A) + for (i = A[a], r = 0; r < i.length; r += 1) { + for (o = !0, n = 0; n < i[r].length; n += 1) + if (void 0 !== i[r][n] && i[r][n] !== t.charCodeAt(n)) { + o = !1 + break + } + if (!0 === o) { + s = a + break + } + } + return ( + 'UNKOWN' === s && + 'UNKNOWN' !== e && + (console.warn( + 'FileType of Image not recognized. Processing image as "' + + e + + '".' + ), + (s = e)), + s + ) + } + var r = function t(e) { + var A = this.internal.newObject(), + r = this.internal.write, + n = this.internal.putStream + if ( + ((e.n = A), + r('<>'), + 'trns' in e && e.trns.constructor == Array) + ) { + for (var i = '', o = 0, a = e.trns.length; o < a; o++) + i += e.trns[o] + ' ' + e.trns[o] + ' ' + r('/Mask [' + i + ']') + } + if ( + ('smask' in e && r('/SMask ' + (A + 1) + ' 0 R'), + r('/Length ' + e.data.length + '>>'), + n(e.data), + r('endobj'), + 'smask' in e) + ) { + var s = + '/Predictor ' + + e.p + + ' /Colors 1 /BitsPerComponent ' + + e.bpc + + ' /Columns ' + + e.w, + c = { + w: e.w, + h: e.h, + cs: 'DeviceGray', + bpc: e.bpc, + dp: s, + data: e.smask + } + 'f' in e && (c.f = e.f), t.call(this, c) + } + e.cs === this.color_spaces.INDEXED && + (this.internal.newObject(), + r('<< /Length ' + e.pal.length + '>>'), + n(this.arrayBufferToBinaryString(new Uint8Array(e.pal))), + r('endobj')) + }, + n = function() { + var t = this.internal.collections[e + 'images'] + for (var A in t) r.call(this, t[A]) + }, + i = function() { + var t, + A = this.internal.collections[e + 'images'], + r = this.internal.write + for (var n in A) r('/I' + (t = A[n]).i, t.n, '0', 'R') + }, + o = function(e) { + return 'function' == typeof t['process' + e.toUpperCase()] + }, + a = function(t) { + return ( + 'object' === (void 0 === t ? 'undefined' : at(t)) && + 1 === t.nodeType + ) + }, + s = function(t, e) { + if ('IMG' === t.nodeName && t.hasAttribute('src')) { + var A = '' + t.getAttribute('src') + if (0 === A.indexOf('data:image/')) return A + !e && /\.png(?:[?#].*)?$/i.test(A) && (e = 'png') + } + if ('CANVAS' === t.nodeName) var r = t + else { + ; ((r = document.createElement('canvas')).width = + t.clientWidth || t.width), + (r.height = t.clientHeight || t.height) + var n = r.getContext('2d') + if (!n) + throw 'addImage requires canvas to be supported by browser.' + n.drawImage(t, 0, 0, r.width, r.height) + } + return r.toDataURL( + 'png' == ('' + e).toLowerCase() ? 'image/png' : 'image/jpeg' + ) + }, + c = function(t, e) { + var A + if (e) + for (var r in e) + if (t === e[r].alias) { + A = e[r] + break + } + return A + } + ; (t.color_spaces = { + DEVICE_RGB: 'DeviceRGB', + DEVICE_GRAY: 'DeviceGray', + DEVICE_CMYK: 'DeviceCMYK', + CAL_GREY: 'CalGray', + CAL_RGB: 'CalRGB', + LAB: 'Lab', + ICC_BASED: 'ICCBased', + INDEXED: 'Indexed', + PATTERN: 'Pattern', + SEPARATION: 'Separation', + DEVICE_N: 'DeviceN' + }), + (t.decode = { + DCT_DECODE: 'DCTDecode', + FLATE_DECODE: 'FlateDecode', + LZW_DECODE: 'LZWDecode', + JPX_DECODE: 'JPXDecode', + JBIG2_DECODE: 'JBIG2Decode', + ASCII85_DECODE: 'ASCII85Decode', + ASCII_HEX_DECODE: 'ASCIIHexDecode', + RUN_LENGTH_DECODE: 'RunLengthDecode', + CCITT_FAX_DECODE: 'CCITTFaxDecode' + }), + (t.image_compression = { + NONE: 'NONE', + FAST: 'FAST', + MEDIUM: 'MEDIUM', + SLOW: 'SLOW' + }), + (t.sHashCode = function(t) { + return ( + (t = t || ''), + Array.prototype.reduce && + t.split('').reduce(function(t, e) { + return (t = (t << 5) - t + e.charCodeAt(0)) & t + }, 0) + ) + }), + (t.isString = function(t) { + return 'string' == typeof t + }), + (t.validateStringAsBase64 = function(t) { + var e = !0 + return ( + (t = t || '').length % 4 != 0 && (e = !1), + !1 === /[A-Za-z0-9\/]+/.test(t.substr(0, t.length - 2)) && + (e = !1), + !1 === + /[A-Za-z0-9\/][A-Za-z0-9+\/]|[A-Za-z0-9+\/]=|==/.test( + t.substr(-2) + ) && (e = !1), + e + ) + }), + (t.extractInfoFromBase64DataURI = function(t) { + return /^data:([\w]+?\/([\w]+?));base64,(.+)$/g.exec(t) + }), + (t.supportsArrayBuffer = function() { + return ( + 'undefined' != typeof ArrayBuffer && + 'undefined' != typeof Uint8Array + ) + }), + (t.isArrayBuffer = function(t) { + return !!this.supportsArrayBuffer() && t instanceof ArrayBuffer + }), + (t.isArrayBufferView = function(t) { + return ( + !!this.supportsArrayBuffer() && + 'undefined' != typeof Uint32Array && + (t instanceof Int8Array || + t instanceof Uint8Array || + ('undefined' != typeof Uint8ClampedArray && + t instanceof Uint8ClampedArray) || + t instanceof Int16Array || + t instanceof Uint16Array || + t instanceof Int32Array || + t instanceof Uint32Array || + t instanceof Float32Array || + t instanceof Float64Array) + ) + }), + (t.binaryStringToUint8Array = function(t) { + for (var e = t.length, A = new Uint8Array(e), r = 0; r < e; r++) + A[r] = t.charCodeAt(r) + return A + }), + (t.arrayBufferToBinaryString = function(t) { + if ('function' == typeof atob) + return atob(this.arrayBufferToBase64(t)) + if ('function' == typeof TextDecoder) { + var e = new TextDecoder('ascii') + if ('ascii' === e.encoding) return e.decode(t) + } + for ( + var A = this.isArrayBuffer(t) ? t : new Uint8Array(t), + r = 20480, + n = '', + i = Math.ceil(A.byteLength / r), + o = 0; + o < i; + o++ + ) + n += String.fromCharCode.apply( + null, + A.slice(o * r, o * r + r) + ) + return n + }), + (t.arrayBufferToBase64 = function(t) { + for ( + var e, + A = '', + r = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', + n = new Uint8Array(t), + i = n.byteLength, + o = i % 3, + a = i - o, + s = 0; + s < a; + s += 3 + ) + A += + r[ + (16515072 & + (e = (n[s] << 16) | (n[s + 1] << 8) | n[s + 2])) >> + 18 + ] + + r[(258048 & e) >> 12] + + r[(4032 & e) >> 6] + + r[63 & e] + return ( + 1 == o + ? (A += r[(252 & (e = n[a])) >> 2] + r[(3 & e) << 4] + '==') + : 2 == o && + (A += + r[(64512 & (e = (n[a] << 8) | n[a + 1])) >> 10] + + r[(1008 & e) >> 4] + + r[(15 & e) << 2] + + '='), + A + ) + }), + (t.createImageInfo = function( + t, + e, + A, + r, + n, + i, + o, + a, + s, + c, + l, + u, + h + ) { + var d = { + alias: a, + w: e, + h: A, + cs: r, + bpc: n, + i: o, + data: t + } + return ( + i && (d.f = i), + s && (d.dp = s), + c && (d.trns = c), + l && (d.pal = l), + u && (d.smask = u), + h && (d.p = h), + d + ) + }), + (t.addImage = function(A, r, l, u, h, d, f, p, g) { + var B = '' + if ('string' != typeof r) { + var w = d + ; (d = h), (h = u), (u = l), (l = r), (r = w) + } + if ( + 'object' === (void 0 === A ? 'undefined' : at(A)) && + !a(A) && + 'imageData' in A + ) { + var m = A + ; (A = m.imageData), + (r = m.format || r), + (l = m.x || l || 0), + (u = m.y || u || 0), + (h = m.w || h), + (d = m.h || d), + (f = m.alias || f), + (p = m.compression || p), + (g = m.rotation || m.angle || g) + } + if (isNaN(l) || isNaN(u)) + throw ( + (console.error( + 'jsPDF.addImage: Invalid coordinates', + arguments + ), + new Error('Invalid coordinates passed to jsPDF.addImage')) + ) + var y, + v, + Q, + C, + U, + b, + F, + E = function() { + var t = this.internal.collections[e + 'images'] + return ( + t || + ((this.internal.collections[e + 'images'] = t = {}), + this.internal.events.subscribe('putResources', n), + this.internal.events.subscribe('putXobjectDict', i)), + t + ) + }.call(this) + if ( + !( + (y = c(A, E)) || + (a(A) && (A = s(A, r)), + (null == (F = f) || 0 === F.length) && + (f = 'string' == typeof (b = A) && t.sHashCode(b)), + (y = c(f, E))) + ) + ) { + if ( + (this.isString(A) && + ('' !== (B = this.convertStringToImageData(A)) + ? (A = B) + : void 0 !== (B = this.loadImageFile(A)) && (A = B)), + (r = this.getImageFileTypeByImageData(A, r)), + !o(r)) + ) + throw new Error( + "addImage does not support files of type '" + + r + + "', please ensure that a plugin for '" + + r + + "' support is added." + ) + if ( + (this.supportsArrayBuffer() && + (A instanceof Uint8Array || + ((v = A), (A = this.binaryStringToUint8Array(A)))), + !(y = this['process' + r.toUpperCase()]( + A, + ((U = 0), + (C = E) && + (U = Object.keys + ? Object.keys(C).length + : (function(t) { + var e = 0 + for (var A in t) t.hasOwnProperty(A) && e++ + return e + })(C)), + U), + f, + ((Q = p) && 'string' == typeof Q && (Q = Q.toUpperCase()), + Q in t.image_compression ? Q : t.image_compression.NONE), + v + ))) + ) + throw new Error( + 'An unkwown error occurred whilst processing the image' + ) + } + return ( + function(t, e, A, r, n, i, o, a) { + var s = function(t, e, A) { + return ( + t || e || (e = t = -96), + t < 0 && + (t = + (-1 * A.w * 72) / t / this.internal.scaleFactor), + e < 0 && + (e = + (-1 * A.h * 72) / e / this.internal.scaleFactor), + 0 === t && (t = (e * A.w) / A.h), + 0 === e && (e = (t * A.h) / A.w), + [t, e] + ) + }.call(this, A, r, n), + c = this.internal.getCoordinateString, + l = this.internal.getVerticalCoordinateString + if (((A = s[0]), (r = s[1]), (o[i] = n), a)) { + a *= Math.PI / 180 + var u = Math.cos(a), + h = Math.sin(a), + d = function(t) { + return t.toFixed(4) + }, + f = [d(u), d(h), d(-1 * h), d(u), 0, 0, 'cm'] + } + this.internal.write('q'), + a + ? (this.internal.write( + [1, '0', '0', 1, c(t), l(e + r), 'cm'].join(' ') + ), + this.internal.write(f.join(' ')), + this.internal.write( + [c(A), '0', '0', c(r), '0', '0', 'cm'].join(' ') + )) + : this.internal.write( + [c(A), '0', '0', c(r), c(t), l(e + r), 'cm'].join( + ' ' + ) + ), + this.internal.write('/I' + n.i + ' Do'), + this.internal.write('Q') + }.call(this, l, u, h, d, y, y.i, E, g), + this + ) + }), + (t.convertStringToImageData = function(e) { + var A, + r = '' + return ( + this.isString(e) && + (null !== (A = this.extractInfoFromBase64DataURI(e)) + ? t.validateStringAsBase64(A[3]) && (r = atob(A[3])) + : t.validateStringAsBase64(e) && (r = atob(e))), + r + ) + }) + var l = function(t, e) { + return t.subarray(e, e + 5) + } + ; (t.processJPEG = function(t, e, A, r, n, i) { + var o, + a = this.decode.DCT_DECODE + if ( + !this.isString(t) && + !this.isArrayBuffer(t) && + !this.isArrayBufferView(t) + ) + return null + if ( + (this.isString(t) && + (o = (function(t) { + var e + if ( + 255 === !t.charCodeAt(0) || + 216 === !t.charCodeAt(1) || + 255 === !t.charCodeAt(2) || + 224 === !t.charCodeAt(3) || + !t.charCodeAt(6) === 'J'.charCodeAt(0) || + !t.charCodeAt(7) === 'F'.charCodeAt(0) || + !t.charCodeAt(8) === 'I'.charCodeAt(0) || + !t.charCodeAt(9) === 'F'.charCodeAt(0) || + 0 === !t.charCodeAt(10) + ) + throw new Error( + 'getJpegSize requires a binary string jpeg file' + ) + for ( + var A = 256 * t.charCodeAt(4) + t.charCodeAt(5), + r = 4, + n = t.length; + r < n; + + ) { + if (((r += A), 255 !== t.charCodeAt(r))) + throw new Error( + 'getJpegSize could not find the size of the image' + ) + if ( + 192 === t.charCodeAt(r + 1) || + 193 === t.charCodeAt(r + 1) || + 194 === t.charCodeAt(r + 1) || + 195 === t.charCodeAt(r + 1) || + 196 === t.charCodeAt(r + 1) || + 197 === t.charCodeAt(r + 1) || + 198 === t.charCodeAt(r + 1) || + 199 === t.charCodeAt(r + 1) + ) + return ( + (e = 256 * t.charCodeAt(r + 5) + t.charCodeAt(r + 6)), + [ + 256 * t.charCodeAt(r + 7) + t.charCodeAt(r + 8), + e, + t.charCodeAt(r + 9) + ] + ) + ; (r += 2), + (A = 256 * t.charCodeAt(r) + t.charCodeAt(r + 1)) + } + })(t)), + this.isArrayBuffer(t) && (t = new Uint8Array(t)), + this.isArrayBufferView(t) && + ((o = (function(t) { + if (65496 != ((t[0] << 8) | t[1])) + throw new Error('Supplied data is not a JPEG') + for ( + var e, A = t.length, r = (t[4] << 8) + t[5], n = 4; + n < A; + + ) { + if ( + ((r = ((e = l(t, (n += r)))[2] << 8) + e[3]), + (192 === e[1] || 194 === e[1]) && 255 === e[0] && 7 < r) + ) + return { + width: ((e = l(t, n + 5))[2] << 8) + e[3], + height: (e[0] << 8) + e[1], + numcomponents: e[4] + } + n += 2 + } + throw new Error( + 'getJpegSizeFromBytes could not find the size of the image' + ) + })(t)), + (t = n || this.arrayBufferToBinaryString(t))), + void 0 === i) + ) + switch (o.numcomponents) { + case 1: + i = this.color_spaces.DEVICE_GRAY + break + case 4: + i = this.color_spaces.DEVICE_CMYK + break + default: + case 3: + i = this.color_spaces.DEVICE_RGB + } + return this.createImageInfo(t, o.width, o.height, i, 8, a, e, A) + }), + (t.processJPG = function() { + return this.processJPEG.apply(this, arguments) + }), + (t.loadImageFile = function(t, e, A) { + if ( + ((e = e || !0), + (A = A || function() { }), + Object.prototype.toString.call( + 'undefined' != typeof process ? process : 0 + ), + void 0 !== + ('undefined' == typeof window ? 'undefined' : at(window)) && + 'object' === + ('undefined' == typeof location + ? 'undefined' + : at(location)) && + 'http' === location.protocol.substr(0, 4)) + ) + return (function(t, e, A) { + var r = new XMLHttpRequest(), + n = [], + i = 0, + o = function(t) { + var e = t.length, + A = String.fromCharCode + for (i = 0; i < e; i += 1) + n.push(A(255 & t.charCodeAt(i))) + return n.join('') + } + if ( + (r.open('GET', t, !e), + r.overrideMimeType('text/plain; charset=x-user-defined'), + !1 === e && + (r.onload = function() { + return o(this.responseText) + }), + r.send(null), + 200 === r.status) + ) + return e ? o(r.responseText) : void 0 + console.warn('Unable to load file "' + t + '"') + })(t, e) + }), + (t.getImageProperties = function(t) { + var e, + A, + r = '' + if ( + (a(t) && (t = s(t)), + this.isString(t) && + ('' !== (r = this.convertStringToImageData(t)) + ? (t = r) + : void 0 !== (r = this.loadImageFile(t)) && (t = r)), + (A = this.getImageFileTypeByImageData(t)), + !o(A)) + ) + throw new Error( + "addImage does not support files of type '" + + A + + "', please ensure that a plugin for '" + + A + + "' support is added." + ) + if ( + (this.supportsArrayBuffer() && + (t instanceof Uint8Array || + (t = this.binaryStringToUint8Array(t))), + !(e = this['process' + A.toUpperCase()](t))) + ) + throw new Error( + 'An unkwown error occurred whilst processing the image' + ) + return { + fileType: A, + width: e.w, + height: e.h, + colorSpace: e.cs, + compressionMode: e.f, + bitsPerComponent: e.bpc + } + }) + })(st.API), + (s = st.API), + (c = { + annotations: [], + f2: function(t) { + return t.toFixed(2) + }, + notEmpty: function(t) { + if (void 0 !== t && '' != t) return !0 + } + }), + (st.API.annotationPlugin = c), + st.API.events.push([ + 'addPage', + function(t) { + this.annotationPlugin.annotations[t.pageNumber] = [] + } + ]), + s.events.push([ + 'putPage', + function(t) { + for ( + var e = this.annotationPlugin.annotations[t.pageNumber], + A = !1, + r = 0; + r < e.length && !A; + r++ + ) + switch ((s = e[r]).type) { + case 'link': + if ( + c.notEmpty(s.options.url) || + c.notEmpty(s.options.pageNumber) + ) { + A = !0 + break + } + case 'reference': + case 'text': + case 'freetext': + A = !0 + } + if (0 != A) { + this.internal.write('/Annots [') + var n = this.annotationPlugin.f2, + i = this.internal.scaleFactor, + o = this.internal.pageSize.getHeight(), + a = this.internal.getPageInfo(t.pageNumber) + for (r = 0; r < e.length; r++) { + var s + switch ((s = e[r]).type) { + case 'reference': + this.internal.write(' ' + s.object.objId + ' 0 R ') + break + case 'text': + var l = this.internal.newAdditionalObject(), + u = this.internal.newAdditionalObject(), + h = s.title || 'Note' + ; (B = + '<>'), + (l.content = B) + var d = l.objId + ' 0 R' + ; (B = + '<>' + else if (s.options.pageNumber) + switch ( + ((B = + '<>'), + this.internal.out('endobj') + }), + this.internal.events.subscribe('putCatalog', function() { + this.internal.out('/OpenAction ' + e + ' 0 R') + }) + } + return this + }), + (l = st.API).events.push([ + 'initialized', + function() { + this.canvas.pdf = this + } + ]), + (l.canvas = { + getContext: function(t) { + return (this.pdf.context2d._canvas = this).pdf.context2d + }, + childNodes: [] + }), + Object.defineProperty(l.canvas, 'width', { + get: function() { + return this._width + }, + set: function(t) { + ; (this._width = t), (this.getContext('2d').pageWrapX = t + 1) + } + }), + Object.defineProperty(l.canvas, 'height', { + get: function() { + return this._height + }, + set: function(t) { + ; (this._height = t), (this.getContext('2d').pageWrapY = t + 1) + } + }), + (u = st.API), + (g = { + x: void 0, + y: void 0, + w: void 0, + h: void 0, + ln: void 0 + }), + (B = 1), + (w = function(t, e, A, r, n) { + g = { + x: t, + y: e, + w: A, + h: r, + ln: n + } + }), + (m = function() { + return g + }), + (y = { + left: 0, + top: 0, + bottom: 0 + }), + (u.setHeaderFunction = function(t) { + p = t + }), + (u.getTextDimensions = function(t) { + ; (h = this.internal.getFont().fontName), + (d = this.table_font_size || this.internal.getFontSize()), + (f = this.internal.getFont().fontStyle) + var e, + A, + r = 19.049976 / 25.4 + ; (A = document.createElement('font')).id = 'jsPDFCell' + try { + A.style.fontStyle = f + } catch (e) { + A.style.fontWeight = f + } + ; (A.style.fontSize = d + 'pt'), (A.style.fontFamily = h) + try { + A.textContent = t + } catch (e) { + A.innerText = t + } + return ( + document.body.appendChild(A), + (e = { + w: (A.offsetWidth + 1) * r, + h: (A.offsetHeight + 1) * r + }), + document.body.removeChild(A), + e + ) + }), + (u.cellAddPage = function() { + var t = this.margins || y + this.addPage(), w(t.left, t.top, void 0, void 0), (B += 1) + }), + (u.cellInitialize = function() { + ; (g = { + x: void 0, + y: void 0, + w: void 0, + h: void 0, + ln: void 0 + }), + (B = 1) + }), + (u.cell = function(t, e, A, r, n, i, o) { + var a = m(), + s = !1 + if (void 0 !== a.ln) + if (a.ln === i) (t = a.x + a.w), (e = a.y) + else { + var c = this.margins || y + a.y + a.h + r + 13 >= + this.internal.pageSize.getHeight() - c.bottom && + (this.cellAddPage(), + (s = !0), + this.printHeaders && + this.tableHeaderRow && + this.printHeaderRow(i, !0)), + (e = m().y + m().h), + s && (e = 23) + } + if (void 0 !== n[0]) + if ( + (this.printingHeaderRow + ? this.rect(t, e, A, r, 'FD') + : this.rect(t, e, A, r), + 'right' === o) + ) { + n instanceof Array || (n = [n]) + for (var l = 0; l < n.length; l++) { + var u = n[l], + h = this.getStringUnitWidth(u) * this.internal.getFontSize() + this.text( + u, + t + A - h - 3, + e + this.internal.getLineHeight() * (l + 1) + ) + } + } else this.text(n, t + 3, e + this.internal.getLineHeight()) + return w(t, e, A, r, i), this + }), + (u.arrayMax = function(t, e) { + var A, + r, + n, + i = t[0] + for (A = 0, r = t.length; A < r; A += 1) + (n = t[A]), e ? -1 === e(i, n) && (i = n) : i < n && (i = n) + return i + }), + (u.table = function(t, e, A, r, n) { + if (!A) throw 'No data for PDF table' + var i, + o, + a, + s, + c, + l, + h, + d, + f, + p, + w = [], + m = [], + v = {}, + Q = {}, + C = [], + U = [], + b = !1, + F = !0, + E = 12, + x = y + if ( + ((x.width = this.internal.pageSize.getWidth()), + n && + (!0 === n.autoSize && (b = !0), + !1 === n.printHeaders && (F = !1), + n.fontSize && (E = n.fontSize), + n.css && + void 0 !== n.css['font-size'] && + (E = 16 * n.css['font-size']), + n.margins && (x = n.margins)), + (this.lnMod = 0), + (g = { + x: void 0, + y: void 0, + w: void 0, + h: void 0, + ln: void 0 + }), + (B = 1), + (this.printHeaders = F), + (this.margins = x), + this.setFontSize(E), + (this.table_font_size = E), + null == r) + ) + w = Object.keys(A[0]) + else if (r[0] && 'string' != typeof r[0]) + for (o = 0, a = r.length; o < a; o += 1) + (i = r[o]), + w.push(i.name), + m.push(i.prompt), + (Q[i.name] = i.width * (19.049976 / 25.4)) + else w = r + if (b) + for ( + p = function(t) { + return t[i] + }, + o = 0, + a = w.length; + o < a; + o += 1 + ) { + for ( + v[(i = w[o])] = A.map(p), + C.push(this.getTextDimensions(m[o] || i).w), + h = 0, + s = (l = v[i]).length; + h < s; + h += 1 + ) + (c = l[h]), C.push(this.getTextDimensions(c).w) + ; (Q[i] = u.arrayMax(C)), (C = []) + } + if (F) { + var H = this.calculateLineHeight(w, Q, m.length ? m : w) + for (o = 0, a = w.length; o < a; o += 1) + (i = w[o]), U.push([t, e, Q[i], H, String(m.length ? m[o] : i)]) + this.setTableHeaderRow(U), this.printHeaderRow(1, !1) + } + for (o = 0, a = A.length; o < a; o += 1) + for ( + d = A[o], + H = this.calculateLineHeight(w, Q, d), + h = 0, + f = w.length; + h < f; + h += 1 + ) + (i = w[h]), this.cell(t, e, Q[i], H, d[i], o + 2, i.align) + return ( + (this.lastCellPos = g), + (this.table_x = t), + (this.table_y = e), + this + ) + }), + (u.calculateLineHeight = function(t, e, A) { + for (var r, n = 0, i = 0; i < t.length; i++) { + A[(r = t[i])] = this.splitTextToSize(String(A[r]), e[r] - 3) + var o = this.internal.getLineHeight() * A[r].length + 3 + n < o && (n = o) + } + return n + }), + (u.setTableHeaderRow = function(t) { + this.tableHeaderRow = t + }), + (u.printHeaderRow = function(t, e) { + if (!this.tableHeaderRow) + throw 'Property tableHeaderRow does not exist.' + var A, r, n, i + if (((this.printingHeaderRow = !0), void 0 !== p)) { + var o = p(this, B) + w(o[0], o[1], o[2], o[3], -1) + } + this.setFontStyle('bold') + var a = [] + for (n = 0, i = this.tableHeaderRow.length; n < i; n += 1) + this.setFillColor(200, 200, 200), + (A = this.tableHeaderRow[n]), + e && + ((this.margins.top = 13), + (A[1] = (this.margins && this.margins.top) || 0), + a.push(A)), + (r = [].concat(A)), + this.cell.apply(this, r.concat(t)) + 0 < a.length && this.setTableHeaderRow(a), + this.setFontStyle('normal'), + (this.printingHeaderRow = !1) + }), + (function(t) { + function e() { + ; (this._isStrokeTransparent = !1), + (this._strokeOpacity = 1), + (this.strokeStyle = '#000000'), + (this.fillStyle = '#000000'), + (this._isFillTransparent = !1), + (this._fillOpacity = 1), + (this.font = '12pt times'), + (this.textBaseline = 'alphabetic'), + (this.textAlign = 'start'), + (this.lineWidth = 1), + (this.lineJoin = 'miter'), + (this.lineCap = 'butt'), + (this._transform = [1, 0, 0, 1, 0, 0]), + (this.globalCompositeOperation = 'normal'), + (this.globalAlpha = 1), + (this._clip_path = []), + (this.ignoreClearRect = !1), + (this.copy = function(t) { + ; (this._isStrokeTransparent = t._isStrokeTransparent), + (this._strokeOpacity = t._strokeOpacity), + (this.strokeStyle = t.strokeStyle), + (this._isFillTransparent = t._isFillTransparent), + (this._fillOpacity = t._fillOpacity), + (this.fillStyle = t.fillStyle), + (this.font = t.font), + (this.lineWidth = t.lineWidth), + (this.lineJoin = t.lineJoin), + (this.lineCap = t.lineCap), + (this.textBaseline = t.textBaseline), + (this.textAlign = t.textAlign), + (this._fontSize = t._fontSize), + (this._transform = t._transform.slice(0)), + (this.globalCompositeOperation = + t.globalCompositeOperation), + (this.globalAlpha = t.globalAlpha), + (this._clip_path = t._clip_path.slice(0)), + (this.ignoreClearRect = t.ignoreClearRect) + }) + } + t.events.push([ + 'initialized', + function() { + ; (((this.context2d.pdf = this).context2d.internal.pdf = + this).context2d.ctx = new e()), + (this.context2d.ctxStack = []), + (this.context2d.path = []) + } + ]), + (t.context2d = { + pageWrapXEnabled: !1, + pageWrapYEnabled: !1, + pageWrapX: 9999999, + pageWrapY: 9999999, + ctx: new e(), + f2: function(t) { + return t.toFixed(2) + }, + fillRect: function(t, e, A, r) { + if (!this._isFillTransparent()) { + ; (t = this._wrapX(t)), (e = this._wrapY(e)) + var n = this._matrix_map_rect(this.ctx._transform, { + x: t, + y: e, + w: A, + h: r + }) + this.pdf.rect(n.x, n.y, n.w, n.h, 'f') + } + }, + strokeRect: function(t, e, A, r) { + if (!this._isStrokeTransparent()) { + ; (t = this._wrapX(t)), (e = this._wrapY(e)) + var n = this._matrix_map_rect(this.ctx._transform, { + x: t, + y: e, + w: A, + h: r + }) + this.pdf.rect(n.x, n.y, n.w, n.h, 's') + } + }, + clearRect: function(t, e, A, r) { + if (!this.ctx.ignoreClearRect) { + ; (t = this._wrapX(t)), (e = this._wrapY(e)) + var n = this._matrix_map_rect(this.ctx._transform, { + x: t, + y: e, + w: A, + h: r + }) + this.save(), + this.setFillStyle('#ffffff'), + this.pdf.rect(n.x, n.y, n.w, n.h, 'f'), + this.restore() + } + }, + save: function() { + this.ctx._fontSize = this.pdf.internal.getFontSize() + var t = new e() + t.copy(this.ctx), this.ctxStack.push(this.ctx), (this.ctx = t) + }, + restore: function() { + ; (this.ctx = this.ctxStack.pop()), + this.setFillStyle(this.ctx.fillStyle), + this.setStrokeStyle(this.ctx.strokeStyle), + this.setFont(this.ctx.font), + this.pdf.setFontSize(this.ctx._fontSize), + this.setLineCap(this.ctx.lineCap), + this.setLineWidth(this.ctx.lineWidth), + this.setLineJoin(this.ctx.lineJoin) + }, + rect: function(t, e, A, r) { + this.moveTo(t, e), + this.lineTo(t + A, e), + this.lineTo(t + A, e + r), + this.lineTo(t, e + r), + this.lineTo(t, e), + this.closePath() + }, + beginPath: function() { + this.path = [] + }, + closePath: function() { + this.path.push({ + type: 'close' + }) + }, + _getRGBA: function(t) { + var e, + A, + r, + n, + i = new RGBColor(t) + if (!t) + return { + r: 0, + g: 0, + b: 0, + a: 0, + style: t + } + if (this.internal.rxTransparent.test(t)) n = r = A = e = 0 + else { + var o = this.internal.rxRgb.exec(t) + null != o + ? ((e = parseInt(o[1])), + (A = parseInt(o[2])), + (r = parseInt(o[3])), + (n = 1)) + : null != (o = this.internal.rxRgba.exec(t)) + ? ((e = parseInt(o[1])), + (A = parseInt(o[2])), + (r = parseInt(o[3])), + (n = parseFloat(o[4]))) + : ((n = 1), + '#' != t.charAt(0) && + (t = i.ok ? i.toHex() : '#000000'), + 4 === t.length + ? ((e = t.substring(1, 2)), + (e += e), + (A = t.substring(2, 3)), + (A += A), + (r = t.substring(3, 4)), + (r += r)) + : ((e = t.substring(1, 3)), + (A = t.substring(3, 5)), + (r = t.substring(5, 7))), + (e = parseInt(e, 16)), + (A = parseInt(A, 16)), + (r = parseInt(r, 16))) + } + return { + r: e, + g: A, + b: r, + a: n, + style: t + } + }, + setFillStyle: function(t) { + var e = this._getRGBA(t) + ; (this.ctx.fillStyle = t), + (this.ctx._isFillTransparent = 0 === e.a), + (this.ctx._fillOpacity = e.a), + this.pdf.setFillColor(e.r, e.g, e.b, { + a: e.a + }), + this.pdf.setTextColor(e.r, e.g, e.b, { + a: e.a + }) + }, + setStrokeStyle: function(t) { + var e = this._getRGBA(t) + ; (this.ctx.strokeStyle = e.style), + (this.ctx._isStrokeTransparent = 0 === e.a), + (this.ctx._strokeOpacity = e.a), + 0 === e.a + ? this.pdf.setDrawColor(255, 255, 255) + : (e.a, this.pdf.setDrawColor(e.r, e.g, e.b)) + }, + fillText: function(t, e, A, r) { + if (!this._isFillTransparent()) { + ; (e = this._wrapX(e)), (A = this._wrapY(A)) + var n = this._matrix_map_point(this.ctx._transform, [e, A]) + ; (e = n[0]), (A = n[1]) + var i = 57.2958 * this._matrix_rotation(this.ctx._transform) + if (0 < this.ctx._clip_path.length) { + var o + ; (o = window.outIntercept + ? 'group' === window.outIntercept.type + ? window.outIntercept.stream + : window.outIntercept + : this.internal.getCurrentPage()).push('q') + var a = this.path + ; (this.path = this.ctx._clip_path), + (this.ctx._clip_path = []), + this._fill(null, !0), + (this.ctx._clip_path = this.path), + (this.path = a) + } + var s = 1 + try { + s = this._matrix_decompose(this._getTransform()).scale[0] + } catch (t) { + console.warn(t) + } + if (s < 0.01) + this.pdf.text(t, e, this._getBaseline(A), null, i) + else { + var c = this.pdf.internal.getFontSize() + this.pdf.setFontSize(c * s), + this.pdf.text(t, e, this._getBaseline(A), null, i), + this.pdf.setFontSize(c) + } + 0 < this.ctx._clip_path.length && o.push('Q') + } + }, + strokeText: function(t, e, A, r) { + if (!this._isStrokeTransparent()) { + ; (e = this._wrapX(e)), (A = this._wrapY(A)) + var n = this._matrix_map_point(this.ctx._transform, [e, A]) + ; (e = n[0]), (A = n[1]) + var i = 57.2958 * this._matrix_rotation(this.ctx._transform) + if (0 < this.ctx._clip_path.length) { + var o + ; (o = window.outIntercept + ? 'group' === window.outIntercept.type + ? window.outIntercept.stream + : window.outIntercept + : this.internal.getCurrentPage()).push('q') + var a = this.path + ; (this.path = this.ctx._clip_path), + (this.ctx._clip_path = []), + this._fill(null, !0), + (this.ctx._clip_path = this.path), + (this.path = a) + } + var s = 1 + try { + s = this._matrix_decompose(this._getTransform()).scale[0] + } catch (t) { + console.warn(t) + } + if (1 === s) + this.pdf.text( + t, + e, + this._getBaseline(A), + { + stroke: !0 + }, + i + ) + else { + var c = this.pdf.internal.getFontSize() + this.pdf.setFontSize(c * s), + this.pdf.text( + t, + e, + this._getBaseline(A), + { + stroke: !0 + }, + i + ), + this.pdf.setFontSize(c) + } + 0 < this.ctx._clip_path.length && o.push('Q') + } + }, + setFont: function(t) { + if ( + ((this.ctx.font = t), + null != + (c = + /\s*(\w+)\s+(\w+)\s+(\w+)\s+([\d\.]+)(px|pt|em)\s+(.*)?/.exec( + t + ))) + ) { + var e = c[1], + A = (c[2], c[3]), + r = c[4], + n = c[5], + i = c[6] + ; (r = + 'px' === n + ? Math.floor(parseFloat(r)) + : 'em' === n + ? Math.floor(parseFloat(r) * this.pdf.getFontSize()) + : Math.floor(parseFloat(r))), + this.pdf.setFontSize(r), + 'bold' === A || '700' === A + ? this.pdf.setFontStyle('bold') + : 'italic' === e + ? this.pdf.setFontStyle('italic') + : this.pdf.setFontStyle('normal'), + (l = + 'bold' === A || '700' === A + ? 'italic' === e + ? 'bolditalic' + : 'bold' + : 'italic' === e + ? 'italic' + : 'normal') + for ( + var o = i.toLowerCase().split(/\s*,\s*/), + a = 'Times', + s = 0; + s < o.length; + s++ + ) { + if ( + void 0 !== + this.pdf.internal.getFont(o[s], l, { + noFallback: !0, + disableWarning: !0 + }) + ) { + a = o[s] + break + } + if ( + 'bolditalic' === l && + void 0 !== + this.pdf.internal.getFont(o[s], 'bold', { + noFallback: !0, + disableWarning: !0 + }) + ) + (a = o[s]), (l = 'bold') + else if ( + void 0 !== + this.pdf.internal.getFont(o[s], 'normal', { + noFallback: !0, + disableWarning: !0 + }) + ) { + ; (a = o[s]), (l = 'normal') + break + } + } + this.pdf.setFont(a, l) + } else { + var c = /\s*(\d+)(pt|px|em)\s+([\w "]+)\s*([\w "]+)?/.exec( + t + ) + if (null != c) { + var l, + u = c[1], + h = (c[2], c[3]) + ; (l = c[4]) || (l = 'normal'), + (u = + 'em' === n + ? Math.floor(parseFloat(r) * this.pdf.getFontSize()) + : Math.floor(parseFloat(u))), + this.pdf.setFontSize(u), + this.pdf.setFont(h, l) + } + } + }, + setTextBaseline: function(t) { + this.ctx.textBaseline = t + }, + getTextBaseline: function() { + return this.ctx.textBaseline + }, + setTextAlign: function(t) { + this.ctx.textAlign = t + }, + getTextAlign: function() { + return this.ctx.textAlign + }, + setLineWidth: function(t) { + ; (this.ctx.lineWidth = t), this.pdf.setLineWidth(t) + }, + setLineCap: function(t) { + ; (this.ctx.lineCap = t), this.pdf.setLineCap(t) + }, + setLineJoin: function(t) { + ; (this.ctx.lineJoin = t), this.pdf.setLineJoin(t) + }, + moveTo: function(t, e) { + ; (t = this._wrapX(t)), (e = this._wrapY(e)) + var A = this._matrix_map_point(this.ctx._transform, [t, e]), + r = { + type: 'mt', + x: (t = A[0]), + y: (e = A[1]) + } + this.path.push(r) + }, + _wrapX: function(t) { + return this.pageWrapXEnabled ? t % this.pageWrapX : t + }, + _wrapY: function(t) { + return this.pageWrapYEnabled + ? (this._gotoPage(this._page(t)), + (t - this.lastBreak) % this.pageWrapY) + : t + }, + transform: function(t, e, A, r, n, i) { + this.ctx._transform = this._matrix_multiply( + this.ctx._transform, + [t, e, A, r, n, i] + ) + }, + setTransform: function(t, e, A, r, n, i) { + this.ctx._transform = [t, e, A, r, n, i] + }, + _getTransform: function() { + return this.ctx._transform + }, + lastBreak: 0, + pageBreaks: [], + _page: function(t) { + if (this.pageWrapYEnabled) { + for ( + var e = (this.lastBreak = 0), A = 0, r = 0; + r < this.pageBreaks.length; + r++ + ) + if (t >= this.pageBreaks[r]) { + e++, 0 === this.lastBreak && A++ + var n = this.pageBreaks[r] - this.lastBreak + ; (this.lastBreak = this.pageBreaks[r]), + (A += Math.floor(n / this.pageWrapY)) + } + return ( + 0 === this.lastBreak && + (A += Math.floor(t / this.pageWrapY) + 1), + A + e + ) + } + return this.pdf.internal.getCurrentPageInfo().pageNumber + }, + _gotoPage: function(t) { }, + lineTo: function(t, e) { + ; (t = this._wrapX(t)), (e = this._wrapY(e)) + var A = this._matrix_map_point(this.ctx._transform, [t, e]), + r = { + type: 'lt', + x: (t = A[0]), + y: (e = A[1]) + } + this.path.push(r) + }, + bezierCurveTo: function(t, e, A, r, n, i) { + var o + ; (t = this._wrapX(t)), + (e = this._wrapY(e)), + (A = this._wrapX(A)), + (r = this._wrapY(r)), + (n = this._wrapX(n)), + (i = this._wrapY(i)), + (n = (o = this._matrix_map_point(this.ctx._transform, [ + n, + i + ]))[0]), + (i = o[1]) + var a = { + type: 'bct', + x1: (t = (o = this._matrix_map_point(this.ctx._transform, [ + t, + e + ]))[0]), + y1: (e = o[1]), + x2: (A = (o = this._matrix_map_point(this.ctx._transform, [ + A, + r + ]))[0]), + y2: (r = o[1]), + x: n, + y: i + } + this.path.push(a) + }, + quadraticCurveTo: function(t, e, A, r) { + var n + ; (t = this._wrapX(t)), + (e = this._wrapY(e)), + (A = this._wrapX(A)), + (r = this._wrapY(r)), + (A = (n = this._matrix_map_point(this.ctx._transform, [ + A, + r + ]))[0]), + (r = n[1]) + var i = { + type: 'qct', + x1: (t = (n = this._matrix_map_point(this.ctx._transform, [ + t, + e + ]))[0]), + y1: (e = n[1]), + x: A, + y: r + } + this.path.push(i) + }, + arc: function(t, e, A, r, n, i) { + if ( + ((t = this._wrapX(t)), + (e = this._wrapY(e)), + !this._matrix_is_identity(this.ctx._transform)) + ) { + var o = this._matrix_map_point(this.ctx._transform, [t, e]) + ; (t = o[0]), (e = o[1]) + var a = this._matrix_map_point(this.ctx._transform, [0, 0]), + s = this._matrix_map_point(this.ctx._transform, [0, A]) + A = Math.sqrt( + Math.pow(s[0] - a[0], 2) + Math.pow(s[1] - a[1], 2) + ) + } + var c = { + type: 'arc', + x: t, + y: e, + radius: A, + startAngle: r, + endAngle: n, + anticlockwise: i + } + this.path.push(c) + }, + drawImage: function(t, e, A, r, n, i, o, a, s) { + void 0 !== i && ((e = i), (A = o), (r = a), (n = s)), + (e = this._wrapX(e)), + (A = this._wrapY(A)) + var c, + l = this._matrix_map_rect(this.ctx._transform, { + x: e, + y: A, + w: r, + h: n + }), + u = + (this._matrix_map_rect(this.ctx._transform, { + x: i, + y: o, + w: a, + h: s + }), + /data:image\/(\w+).*/i.exec(t)) + ; (c = null != u ? u[1] : 'png'), + this.pdf.addImage(t, c, l.x, l.y, l.w, l.h) + }, + _matrix_multiply: function(t, e) { + var A = e[0], + r = e[1], + n = e[2], + i = e[3], + o = e[4], + a = e[5], + s = A * t[0] + r * t[2], + c = n * t[0] + i * t[2], + l = o * t[0] + a * t[2] + t[4] + return ( + (r = A * t[1] + r * t[3]), + (i = n * t[1] + i * t[3]), + (a = o * t[1] + a * t[3] + t[5]), + [(A = s), r, (n = c), i, (o = l), a] + ) + }, + _matrix_rotation: function(t) { + return Math.atan2(t[2], t[0]) + }, + _matrix_decompose: function(t) { + var e = t[0], + A = t[1], + r = t[2], + n = t[3], + i = Math.sqrt(e * e + A * A), + o = (e /= i) * r + (A /= i) * n + ; (r -= e * o), (n -= A * o) + var a = Math.sqrt(r * r + n * n) + return ( + (o /= a), + e * (n /= a) < A * (r /= a) && + ((e = -e), (A = -A), (o = -o), (i = -i)), + { + scale: [i, 0, 0, a, 0, 0], + translate: [1, 0, 0, 1, t[4], t[5]], + rotate: [e, A, -A, e, 0, 0], + skew: [1, 0, o, 1, 0, 0] + } + ) + }, + _matrix_map_point: function(t, e) { + var A = t[0], + r = t[1], + n = t[2], + i = t[3], + o = t[4], + a = t[5], + s = e[0], + c = e[1] + return [s * A + c * n + o, s * r + c * i + a] + }, + _matrix_map_point_obj: function(t, e) { + var A = this._matrix_map_point(t, [e.x, e.y]) + return { + x: A[0], + y: A[1] + } + }, + _matrix_map_rect: function(t, e) { + var A = this._matrix_map_point(t, [e.x, e.y]), + r = this._matrix_map_point(t, [e.x + e.w, e.y + e.h]) + return { + x: A[0], + y: A[1], + w: r[0] - A[0], + h: r[1] - A[1] + } + }, + _matrix_is_identity: function(t) { + return ( + 1 == t[0] && + 0 == t[1] && + 0 == t[2] && + 1 == t[3] && + 0 == t[4] && + 0 == t[5] + ) + }, + rotate: function(t) { + var e = [ + Math.cos(t), + Math.sin(t), + -Math.sin(t), + Math.cos(t), + 0, + 0 + ] + this.ctx._transform = this._matrix_multiply( + this.ctx._transform, + e + ) + }, + scale: function(t, e) { + var A = [t, 0, 0, e, 0, 0] + this.ctx._transform = this._matrix_multiply( + this.ctx._transform, + A + ) + }, + translate: function(t, e) { + var A = [1, 0, 0, 1, t, e] + this.ctx._transform = this._matrix_multiply( + this.ctx._transform, + A + ) + }, + stroke: function() { + if (0 < this.ctx._clip_path.length) { + var t + ; (t = window.outIntercept + ? 'group' === window.outIntercept.type + ? window.outIntercept.stream + : window.outIntercept + : this.internal.getCurrentPage()).push('q') + var e = this.path + ; (this.path = this.ctx._clip_path), + (this.ctx._clip_path = []), + this._stroke(!0), + (this.ctx._clip_path = this.path), + (this.path = e), + this._stroke(!1), + t.push('Q') + } else this._stroke(!1) + }, + _stroke: function(t) { + if (t || !this._isStrokeTransparent()) { + for (var e = [], A = this.path, r = 0; r < A.length; r++) { + var n = A[r] + switch (n.type) { + case 'mt': + e.push({ + start: n, + deltas: [], + abs: [] + }) + break + case 'lt': + var i = [n.x - A[r - 1].x, n.y - A[r - 1].y] + e[e.length - 1].deltas.push(i), + e[e.length - 1].abs.push(n) + break + case 'bct': + ; (i = [ + n.x1 - A[r - 1].x, + n.y1 - A[r - 1].y, + n.x2 - A[r - 1].x, + n.y2 - A[r - 1].y, + n.x - A[r - 1].x, + n.y - A[r - 1].y + ]), + e[e.length - 1].deltas.push(i) + break + case 'qct': + var o = A[r - 1].x + (2 / 3) * (n.x1 - A[r - 1].x), + a = A[r - 1].y + (2 / 3) * (n.y1 - A[r - 1].y), + s = n.x + (2 / 3) * (n.x1 - n.x), + c = n.y + (2 / 3) * (n.y1 - n.y), + l = n.x, + u = n.y + ; (i = [ + o - A[r - 1].x, + a - A[r - 1].y, + s - A[r - 1].x, + c - A[r - 1].y, + l - A[r - 1].x, + u - A[r - 1].y + ]), + e[e.length - 1].deltas.push(i) + break + case 'arc': + 0 == e.length && + e.push({ + start: { + x: 0, + y: 0 + }, + deltas: [], + abs: [] + }), + (e[e.length - 1].arc = !0), + Array.isArray(e[e.length - 1].abs) && + e[e.length - 1].abs.push(n) + } + } + for (r = 0; r < e.length; r++) { + var h + if (((h = r == e.length - 1 ? 's' : null), e[r].arc)) + for (var d = e[r].abs, f = 0; f < d.length; f++) { + var p = d[f], + g = (360 * p.startAngle) / (2 * Math.PI), + B = (360 * p.endAngle) / (2 * Math.PI), + w = p.x, + m = p.y + this.internal.arc2( + this, + w, + m, + p.radius, + g, + B, + p.anticlockwise, + h, + t + ) + } + else + (w = e[r].start.x), + (m = e[r].start.y), + t + ? (this.pdf.lines(e[r].deltas, w, m, null, null), + this.pdf.clip_fixed()) + : this.pdf.lines(e[r].deltas, w, m, null, h) + } + } + }, + _isFillTransparent: function() { + return this.ctx._isFillTransparent || 0 == this.globalAlpha + }, + _isStrokeTransparent: function() { + return this.ctx._isStrokeTransparent || 0 == this.globalAlpha + }, + fill: function(t) { + if (0 < this.ctx._clip_path.length) { + var e + ; (e = window.outIntercept + ? 'group' === window.outIntercept.type + ? window.outIntercept.stream + : window.outIntercept + : this.internal.getCurrentPage()).push('q') + var A = this.path + ; (this.path = this.ctx._clip_path), + (this.ctx._clip_path = []), + this._fill(t, !0), + (this.ctx._clip_path = this.path), + (this.path = A), + this._fill(t, !1), + e.push('Q') + } else this._fill(t, !1) + }, + _fill: function(t, e) { + if (!this._isFillTransparent()) { + var r, + n = 'function' == typeof this.pdf.internal.newObject2 + r = window.outIntercept + ? 'group' === window.outIntercept.type + ? window.outIntercept.stream + : window.outIntercept + : this.internal.getCurrentPage() + var i = [], + o = window.outIntercept + if (n) + switch (this.ctx.globalCompositeOperation) { + case 'normal': + case 'source-over': + break + case 'destination-in': + case 'destination-out': + var a = this.pdf.internal.newStreamObject(), + s = this.pdf.internal.newObject2() + s.push('<>' + ), + s.push('>>') + var c = 'MASK' + s.objId + this.pdf.internal.addGraphicsState(c, s.objId) + var l = '/' + c + ' gs' + r.splice(0, 0, 'q'), + r.splice(1, 0, l), + r.push('Q'), + (window.outIntercept = a) + break + default: + var u = + '/' + + this.pdf.internal.blendModeMap[ + this.ctx.globalCompositeOperation.toUpperCase() + ] + u && this.pdf.internal.out(u + ' gs') + } + var h = this.ctx.globalAlpha + if ( + (this.ctx._fillOpacity < 1 && (h = this.ctx._fillOpacity), + n) + ) { + var d = this.pdf.internal.newObject2() + d.push('<>'), + (c = 'GS_O_' + d.objId), + this.pdf.internal.addGraphicsState(c, d.objId), + this.pdf.internal.out('/' + c + ' gs') + } + for (var f = this.path, p = 0; p < f.length; p++) { + var g = f[p] + switch (g.type) { + case 'mt': + i.push({ + start: g, + deltas: [], + abs: [] + }) + break + case 'lt': + var B = [g.x - f[p - 1].x, g.y - f[p - 1].y] + i[i.length - 1].deltas.push(B), + i[i.length - 1].abs.push(g) + break + case 'bct': + ; (B = [ + g.x1 - f[p - 1].x, + g.y1 - f[p - 1].y, + g.x2 - f[p - 1].x, + g.y2 - f[p - 1].y, + g.x - f[p - 1].x, + g.y - f[p - 1].y + ]), + i[i.length - 1].deltas.push(B) + break + case 'qct': + var w = f[p - 1].x + (2 / 3) * (g.x1 - f[p - 1].x), + m = f[p - 1].y + (2 / 3) * (g.y1 - f[p - 1].y), + y = g.x + (2 / 3) * (g.x1 - g.x), + v = g.y + (2 / 3) * (g.y1 - g.y), + Q = g.x, + C = g.y + ; (B = [ + w - f[p - 1].x, + m - f[p - 1].y, + y - f[p - 1].x, + v - f[p - 1].y, + Q - f[p - 1].x, + C - f[p - 1].y + ]), + i[i.length - 1].deltas.push(B) + break + case 'arc': + 0 === i.length && + i.push({ + deltas: [], + abs: [] + }), + (i[i.length - 1].arc = !0), + Array.isArray(i[i.length - 1].abs) && + i[i.length - 1].abs.push(g) + break + case 'close': + i.push({ + close: !0 + }) + } + } + for (p = 0; p < i.length; p++) { + var U + if ( + (p == i.length - 1 + ? ((U = 'f'), 'evenodd' === t && (U += '*')) + : (U = null), + i[p].close) + ) + this.pdf.internal.out('h'), + U && this.pdf.internal.out(U) + else if (i[p].arc) { + i[p].start && + this.internal.move2(this, i[p].start.x, i[p].start.y) + for (var b = i[p].abs, F = 0; F < b.length; F++) { + var E = b[F] + if (void 0 !== E.startAngle) { + var x = (360 * E.startAngle) / (2 * Math.PI), + H = (360 * E.endAngle) / (2 * Math.PI), + I = E.x, + S = E.y + 0 === F && this.internal.move2(this, I, S), + this.internal.arc2( + this, + I, + S, + E.radius, + x, + H, + E.anticlockwise, + null, + e + ), + F === b.length - 1 && + i[p].start && + ((I = i[p].start.x), + (S = i[p].start.y), + this.internal.line2(A, I, S)) + } else this.internal.line2(A, E.x, E.y) + } + } else + (I = i[p].start.x), + (S = i[p].start.y), + e + ? (this.pdf.lines(i[p].deltas, I, S, null, null), + this.pdf.clip_fixed()) + : this.pdf.lines(i[p].deltas, I, S, null, U) + } + window.outIntercept = o + } + }, + pushMask: function() { + if ('function' == typeof this.pdf.internal.newObject2) { + var t = this.pdf.internal.newStreamObject(), + e = this.pdf.internal.newObject2() + e.push('<>'), + e.push('>>') + var A = 'MASK' + e.objId + this.pdf.internal.addGraphicsState(A, e.objId) + var r = '/' + A + ' gs' + this.pdf.internal.out(r) + } else console.log('jsPDF v2 not enabled') + }, + clip: function() { + if (0 < this.ctx._clip_path.length) + for (var t = 0; t < this.path.length; t++) + this.ctx._clip_path.push(this.path[t]) + else this.ctx._clip_path = this.path + this.path = [] + }, + measureText: function(t) { + var e = this.pdf + return { + getWidth: function() { + var A = e.internal.getFontSize(), + r = + (e.getStringUnitWidth(t) * A) / e.internal.scaleFactor + return (r *= 1.3333) + }, + get width() { + return this.getWidth(t) + } + } + }, + _getBaseline: function(t) { + var e = parseInt(this.pdf.internal.getFontSize()), + A = 0.25 * e + switch (this.ctx.textBaseline) { + case 'bottom': + return t - A + case 'top': + return t + e + case 'hanging': + return t + e - A + case 'middle': + return t + e / 2 - A + case 'ideographic': + return t + case 'alphabetic': + default: + return t + } + } + }) + var A = t.context2d + Object.defineProperty(A, 'fillStyle', { + set: function(t) { + this.setFillStyle(t) + }, + get: function() { + return this.ctx.fillStyle + } + }), + Object.defineProperty(A, 'strokeStyle', { + set: function(t) { + this.setStrokeStyle(t) + }, + get: function() { + return this.ctx.strokeStyle + } + }), + Object.defineProperty(A, 'lineWidth', { + set: function(t) { + this.setLineWidth(t) + }, + get: function() { + return this.ctx.lineWidth + } + }), + Object.defineProperty(A, 'lineCap', { + set: function(t) { + this.setLineCap(t) + }, + get: function() { + return this.ctx.lineCap + } + }), + Object.defineProperty(A, 'lineJoin', { + set: function(t) { + this.setLineJoin(t) + }, + get: function() { + return this.ctx.lineJoin + } + }), + Object.defineProperty(A, 'miterLimit', { + set: function(t) { + this.ctx.miterLimit = t + }, + get: function() { + return this.ctx.miterLimit + } + }), + Object.defineProperty(A, 'textBaseline', { + set: function(t) { + this.setTextBaseline(t) + }, + get: function() { + return this.getTextBaseline() + } + }), + Object.defineProperty(A, 'textAlign', { + set: function(t) { + this.setTextAlign(t) + }, + get: function() { + return this.getTextAlign() + } + }), + Object.defineProperty(A, 'font', { + set: function(t) { + this.setFont(t) + }, + get: function() { + return this.ctx.font + } + }), + Object.defineProperty(A, 'globalCompositeOperation', { + set: function(t) { + this.ctx.globalCompositeOperation = t + }, + get: function() { + return this.ctx.globalCompositeOperation + } + }), + Object.defineProperty(A, 'globalAlpha', { + set: function(t) { + this.ctx.globalAlpha = t + }, + get: function() { + return this.ctx.globalAlpha + } + }), + Object.defineProperty(A, 'canvas', { + get: function() { + return { + parentNode: !1, + style: !1 + } + } + }), + Object.defineProperty(A, 'ignoreClearRect', { + set: function(t) { + this.ctx.ignoreClearRect = t + }, + get: function() { + return this.ctx.ignoreClearRect + } + }), + (A.internal = {}), + (A.internal.rxRgb = + /rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/), + (A.internal.rxRgba = + /rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d\.]+)\s*\)/), + (A.internal.rxTransparent = + /transparent|rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*0+\s*\)/), + (A.internal.arc = function(t, e, A, r, n, i, o, a) { + for ( + var s = this.pdf.internal.scaleFactor, + c = this.pdf.internal.pageSize.getHeight(), + l = this.pdf.internal.f2, + u = n * (Math.PI / 180), + h = i * (Math.PI / 180), + d = this.createArc(r, u, h, o), + f = 0; + f < d.length; + f++ + ) { + var p = d[f] + 0 === f + ? this.pdf.internal.out( + [ + l((p.x1 + e) * s), + l((c - (p.y1 + A)) * s), + 'm', + l((p.x2 + e) * s), + l((c - (p.y2 + A)) * s), + l((p.x3 + e) * s), + l((c - (p.y3 + A)) * s), + l((p.x4 + e) * s), + l((c - (p.y4 + A)) * s), + 'c' + ].join(' ') + ) + : this.pdf.internal.out( + [ + l((p.x2 + e) * s), + l((c - (p.y2 + A)) * s), + l((p.x3 + e) * s), + l((c - (p.y3 + A)) * s), + l((p.x4 + e) * s), + l((c - (p.y4 + A)) * s), + 'c' + ].join(' ') + ), + (t._lastPoint = { + x: e, + y: A + }) + } + null !== a && + this.pdf.internal.out(this.pdf.internal.getStyle(a)) + }), + (A.internal.arc2 = function(t, e, A, r, n, i, o, a, s) { + var c = e, + l = A + s + ? (this.arc(t, c, l, r, n, i, o, null), this.pdf.clip_fixed()) + : this.arc(t, c, l, r, n, i, o, a) + }), + (A.internal.move2 = function(t, e, A) { + var r = this.pdf.internal.scaleFactor, + n = this.pdf.internal.pageSize.getHeight(), + i = this.pdf.internal.f2 + this.pdf.internal.out( + [i(e * r), i((n - A) * r), 'm'].join(' ') + ), + (t._lastPoint = { + x: e, + y: A + }) + }), + (A.internal.line2 = function(t, e, A) { + var r = this.pdf.internal.scaleFactor, + n = this.pdf.internal.pageSize.getHeight(), + i = this.pdf.internal.f2, + o = { + x: e, + y: A + } + this.pdf.internal.out( + [i(o.x * r), i((n - o.y) * r), 'l'].join(' ') + ), + (t._lastPoint = o) + }), + (A.internal.createArc = function(t, e, A, r) { + var n = 2 * Math.PI, + i = Math.PI / 2, + o = e + for ( + (o < n || n < o) && (o %= n), o < 0 && (o = n + o); + A < e; + + ) + e -= n + var a = Math.abs(A - e) + a < n && r && (a = n - a) + for (var s = [], c = r ? -1 : 1, l = o; 1e-5 < a;) { + var u = l + c * Math.min(a, i) + s.push(this.createSmallArc(t, l, u)), + (a -= Math.abs(u - l)), + (l = u) + } + return s + }), + (A.internal.getCurrentPage = function() { + return this.pdf.internal.pages[ + this.pdf.internal.getCurrentPageInfo().pageNumber + ] + }), + (A.internal.createSmallArc = function(t, e, A) { + var r = (A - e) / 2, + n = t * Math.cos(r), + i = t * Math.sin(r), + o = n, + a = -i, + s = o * o + a * a, + c = s + o * n + a * i, + l = ((4 / 3) * (Math.sqrt(2 * s * c) - c)) / (o * i - a * n), + u = o - l * a, + h = a + l * o, + d = u, + f = -h, + p = r + e, + g = Math.cos(p), + B = Math.sin(p) + return { + x1: t * Math.cos(e), + y1: t * Math.sin(e), + x2: u * g - h * B, + y2: u * B + h * g, + x3: d * g - f * B, + y3: d * B + f * g, + x4: t * Math.cos(A), + y4: t * Math.sin(A) + } + }) + })( + st.API, + ('undefined' != typeof self && self) || + ('undefined' != typeof window && window) || + (void 0 !== r && r) || + Function('return typeof this === "object" && this.content')() || + Function('return this')() + ), + (function(t) { + var e, A, r, n, i, o, a, s, c, l, u, h, d, f, p, g, B, w, m, y + ; (e = (function() { + function t() { } + return function(e) { + return (t.prototype = e), new t() + } + })()), + (l = function(t) { + var e, A, r, n, i, o, a + for ( + A = 0, r = t.length, e = void 0, o = n = !1; + !n && A !== r; + + ) + (e = t[A] = t[A].trimLeft()) && (n = !0), A++ + for (A = r - 1; r && !o && -1 !== A;) + (e = t[A] = t[A].trimRight()) && (o = !0), A-- + for (i = /\s+$/g, a = !0, A = 0; A !== r;) + '\u2028' != t[A] && + ((e = t[A].replace(/\s+/g, ' ')), + a && (e = e.trimLeft()), + e && (a = i.test(e)), + (t[A] = e)), + A++ + return t + }), + (h = function(t) { + var e, A, n + for (e = void 0, A = (n = t.split(',')).shift(); !e && A;) + (e = r[A.trim().toLowerCase()]), (A = n.shift()) + return e + }), + (d = function(t) { + var e + return ( + -1 < (t = 'auto' === t ? '0px' : t).indexOf('em') && + !isNaN(Number(t.replace('em', ''))) && + (t = 18.719 * Number(t.replace('em', '')) + 'px'), + -1 < t.indexOf('pt') && + !isNaN(Number(t.replace('pt', ''))) && + (t = 1.333 * Number(t.replace('pt', '')) + 'px'), + (e = f[t]) + ? e + : void 0 !== + (e = { + 'xx-small': 9, + 'x-small': 11, + small: 13, + medium: 16, + large: 19, + 'x-large': 23, + 'xx-large': 28, + auto: 0 + }[t]) + ? (f[t] = e / 16) + : (e = parseFloat(t)) + ? (f[t] = e / 16) + : ((e = t.match(/([\d\.]+)(px)/)), + Array.isArray(e) && 3 === e.length + ? (f[t] = parseFloat(e[1]) / 16) + : (f[t] = 1)) + ) + }), + (c = function(t) { + var e, A, r, c, l + return ( + (l = t), + (c = + document.defaultView && + document.defaultView.getComputedStyle + ? document.defaultView.getComputedStyle(l, null) + : l.currentStyle + ? l.currentStyle + : l.style), + (A = void 0), + ((e = {})['font-family'] = + h( + (r = function(t) { + return ( + (t = t.replace(/-\D/g, function(t) { + return t.charAt(1).toUpperCase() + })), + c[t] + ) + })('font-family') + ) || 'times'), + (e['font-style'] = n[r('font-style')] || 'normal'), + (e['text-align'] = i[r('text-align')] || 'left'), + 'bold' === (A = o[r('font-weight')] || 'normal') && + ('normal' === e['font-style'] + ? (e['font-style'] = A) + : (e['font-style'] = A + e['font-style'])), + (e['font-size'] = d(r('font-size')) || 1), + (e['line-height'] = d(r('line-height')) || 1), + (e.display = 'inline' === r('display') ? 'inline' : 'block'), + (A = 'block' === e.display), + (e['margin-top'] = (A && d(r('margin-top'))) || 0), + (e['margin-bottom'] = (A && d(r('margin-bottom'))) || 0), + (e['padding-top'] = (A && d(r('padding-top'))) || 0), + (e['padding-bottom'] = (A && d(r('padding-bottom'))) || 0), + (e['margin-left'] = (A && d(r('margin-left'))) || 0), + (e['margin-right'] = (A && d(r('margin-right'))) || 0), + (e['padding-left'] = (A && d(r('padding-left'))) || 0), + (e['padding-right'] = (A && d(r('padding-right'))) || 0), + (e['page-break-before'] = r('page-break-before') || 'auto'), + (e.float = a[r('cssFloat')] || 'none'), + (e.clear = s[r('clear')] || 'none'), + (e.color = r('color')), + e + ) + }), + (p = function(t, e, A) { + var r, n, i, o, a + if (((i = !1), (o = n = void 0), (r = A['#' + t.id]))) + if ('function' == typeof r) i = r(t, e) + else + for (n = 0, o = r.length; !i && n !== o;) + (i = r[n](t, e)), n++ + if (((r = A[t.nodeName]), !i && r)) + if ('function' == typeof r) i = r(t, e) + else + for (n = 0, o = r.length; !i && n !== o;) + (i = r[n](t, e)), n++ + for ( + a = + 'string' == typeof t.className + ? t.className.split(' ') + : [], + n = 0; + n < a.length; + n++ + ) + if (((r = A['.' + a[n]]), !i && r)) + if ('function' == typeof r) i = r(t, e) + else + for (n = 0, o = r.length; !i && n !== o;) + (i = r[n](t, e)), n++ + return i + }), + (y = function(t, e) { + var A, r, n, i, o, a, s, c, l + for ( + A = [], + r = [], + n = 0, + l = t.rows[0].cells.length, + s = t.clientWidth; + n < l; + + ) + (c = t.rows[0].cells[n]), + (r[n] = { + name: c.textContent.toLowerCase().replace(/\s+/g, ''), + prompt: c.textContent.replace(/\r?\n/g, ''), + width: + (c.clientWidth / s) * e.pdf.internal.pageSize.getWidth() + }), + n++ + for (n = 1; n < t.rows.length;) { + for (a = t.rows[n], o = {}, i = 0; i < a.cells.length;) + (o[r[i].name] = a.cells[i].textContent.replace( + /\r?\n/g, + '' + )), + i++ + A.push(o), n++ + } + return { + rows: A, + headers: r + } + }) + var v = { + SCRIPT: 1, + STYLE: 1, + NOSCRIPT: 1, + OBJECT: 1, + EMBED: 1, + SELECT: 1 + }, + Q = 1 + ; (A = function(t, r, n) { + var i, o, a, s, l, u, h, d + for ( + o = t.childNodes, + i = void 0, + (l = 'block' === (a = c(t)).display) && + (r.setBlockBoundary(), r.setBlockStyle(a)), + s = 0, + u = o.length; + s < u; + + ) { + if ( + 'object' === (void 0 === (i = o[s]) ? 'undefined' : at(i)) + ) { + if ( + (r.executeWatchFunctions(i), + 1 === i.nodeType && 'HEADER' === i.nodeName) + ) { + var f = i, + B = r.pdf.margins_doc.top + r.pdf.internal.events.subscribe( + 'addPage', + function(t) { + ; (r.y = B), + A(f, r, n), + (r.pdf.margins_doc.top = r.y + 10), + (r.y += 10) + }, + !1 + ) + } + if (8 === i.nodeType && '#comment' === i.nodeName) + ~i.textContent.indexOf('ADD_PAGE') && + (r.pdf.addPage(), (r.y = r.pdf.margins_doc.top)) + else if (1 !== i.nodeType || v[i.nodeName]) + if (3 === i.nodeType) { + var w = i.nodeValue + if (i.nodeValue && 'LI' === i.parentNode.nodeName) + if ('OL' === i.parentNode.parentNode.nodeName) + w = Q++ + '. ' + w + else { + var m = a['font-size'], + C = (3 - 0.75 * m) * r.pdf.internal.scaleFactor, + U = 0.75 * m * r.pdf.internal.scaleFactor, + b = (1.74 * m) / r.pdf.internal.scaleFactor + d = function(t, e) { + this.pdf.circle(t + C, e + U, b, 'FD') + } + } + 16 & i.ownerDocument.body.compareDocumentPosition(i) && + r.addText(w, a) + } else 'string' == typeof i && r.addText(i, a) + else { + var F + if ('IMG' === i.nodeName) { + var E = i.getAttribute('src') + F = g[r.pdf.sHashCode(E) || E] + } + if (F) { + r.pdf.internal.pageSize.getHeight() - + r.pdf.margins_doc.bottom < + r.y + i.height && + r.y > r.pdf.margins_doc.top && + (r.pdf.addPage(), + (r.y = r.pdf.margins_doc.top), + r.executeWatchFunctions(i)) + var x = c(i), + H = r.x, + I = 12 / r.pdf.internal.scaleFactor, + S = (x['margin-left'] + x['padding-left']) * I, + _ = (x['margin-right'] + x['padding-right']) * I, + T = (x['margin-top'] + x['padding-top']) * I, + N = (x['margin-bottom'] + x['padding-bottom']) * I + void 0 !== x.float && 'right' === x.float + ? (H += r.settings.width - i.width - _) + : (H += S), + r.pdf.addImage(F, H, r.y + T, i.width, i.height), + (F = void 0), + 'right' === x.float || 'left' === x.float + ? (r.watchFunctions.push( + function(t, e, A, n) { + return r.y >= e + ? ((r.x += t), (r.settings.width += A), !0) + : !!( + n && + 1 === n.nodeType && + !v[n.nodeName] && + r.x + n.width > + r.pdf.margins_doc.left + + r.pdf.margins_doc.width + ) && + ((r.x += t), + (r.y = e), + (r.settings.width += A), + !0) + }.bind( + this, + 'left' === x.float ? -i.width - S - _ : 0, + r.y + i.height + T + N, + i.width + ) + ), + r.watchFunctions.push( + function(t, e, A) { + return ( + !( + r.y < t && + e === r.pdf.internal.getNumberOfPages() + ) || + (1 === A.nodeType && + 'both' === c(A).clear && + ((r.y = t), !0)) + ) + }.bind( + this, + r.y + i.height, + r.pdf.internal.getNumberOfPages() + ) + ), + (r.settings.width -= i.width + S + _), + 'left' === x.float && (r.x += i.width + S + _)) + : (r.y += i.height + T + N) + } else if ('TABLE' === i.nodeName) + (h = y(i, r)), + (r.y += 10), + r.pdf.table(r.x, r.y, h.rows, h.headers, { + autoSize: !1, + printHeaders: n.printHeaders, + margins: r.pdf.margins_doc, + css: c(i) + }), + (r.y = r.pdf.lastCellPos.y + r.pdf.lastCellPos.h + 20) + else if ('OL' === i.nodeName || 'UL' === i.nodeName) + (Q = 1), p(i, r, n) || A(i, r, n), (r.y += 10) + else if ('LI' === i.nodeName) { + var k = r.x + ; (r.x += 20 / r.pdf.internal.scaleFactor), + (r.y += 3), + p(i, r, n) || A(i, r, n), + (r.x = k) + } else + 'BR' === i.nodeName + ? ((r.y += a['font-size'] * r.pdf.internal.scaleFactor), + r.addText('\u2028', e(a))) + : p(i, r, n) || A(i, r, n) + } + } + s++ + } + if (((n.outY = r.y), l)) return r.setBlockBoundary(d) + }), + (g = {}), + (B = function(t, e, A, r) { + function n() { + e.pdf.internal.events.publish('imagesLoaded'), r(o) + } + + function i(t, A, r) { + if (t) { + var i = new Image() + ; (o = ++c), + (i.crossOrigin = ''), + (i.onerror = i.onload = + function() { + if ( + i.complete && + (0 === i.src.indexOf('data:image/') && + ((i.width = A || i.width || 0), + (i.height = r || i.height || 0)), + i.width + i.height) + ) { + var o = e.pdf.sHashCode(t) || t + g[o] = g[o] || i + } + --c || n() + }), + (i.src = t) + } + } + for ( + var o, a = t.getElementsByTagName('img'), s = a.length, c = 0; + s--; + + ) + i(a[s].getAttribute('src'), a[s].width, a[s].height) + return c || n() + }), + (w = function(t, e, r) { + var n = t.getElementsByTagName('footer') + if (0 < n.length) { + n = n[0] + var i = e.pdf.internal.write, + o = e.y + ; (e.pdf.internal.write = function() { }), A(n, e, r) + var a = Math.ceil(e.y - o) + 5 + ; (e.y = o), + (e.pdf.internal.write = i), + (e.pdf.margins_doc.bottom += a) + for ( + var s = function(t) { + var i = void 0 !== t ? t.pageNumber : 1, + o = e.y + ; (e.y = + e.pdf.internal.pageSize.getHeight() - + e.pdf.margins_doc.bottom), + (e.pdf.margins_doc.bottom -= a) + for ( + var s = n.getElementsByTagName('span'), c = 0; + c < s.length; + ++c + ) + -1 < + (' ' + s[c].className + ' ') + .replace(/[\n\t]/g, ' ') + .indexOf(' pageCounter ') && (s[c].innerHTML = i), + -1 < + (' ' + s[c].className + ' ') + .replace(/[\n\t]/g, ' ') + .indexOf(' totalPages ') && + (s[c].innerHTML = '###jsPDFVarTotalPages###') + A(n, e, r), (e.pdf.margins_doc.bottom += a), (e.y = o) + }, + c = n.getElementsByTagName('span'), + l = 0; + l < c.length; + ++l + ) + -1 < + (' ' + c[l].className + ' ') + .replace(/[\n\t]/g, ' ') + .indexOf(' totalPages ') && + e.pdf.internal.events.subscribe( + 'htmlRenderingFinished', + e.pdf.putTotalPages.bind( + e.pdf, + '###jsPDFVarTotalPages###' + ), + !0 + ) + e.pdf.internal.events.subscribe('addPage', s, !1), + s(), + (v.FOOTER = 1) + } + }), + (m = function(t, e, r, n, i, o) { + if (!e) return !1 + var a, s, c, l + 'string' == typeof e || e.parentNode || (e = '' + e.innerHTML), + 'string' == typeof e && + ((a = e.replace(/<\/?script[^>]*?>/gi, '')), + (l = + 'jsPDFhtmlText' + + Date.now().toString() + + (1e3 * Math.random()).toFixed(0)), + ((c = document.createElement('div')).style.cssText = + 'position: absolute !important;clip: rect(1px 1px 1px 1px); /* IE6, IE7 */clip: rect(1px, 1px, 1px, 1px);padding:0 !important;border:0 !important;height: 1px !important;width: 1px !important; top:auto;left:-100px;overflow: hidden;'), + (c.innerHTML = + '