diff --git a/HerramientaCASA.sln b/HerramientaCASA.sln new file mode 100644 index 0000000..64adfb6 --- /dev/null +++ b/HerramientaCASA.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.11.35312.102 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HerramientaCASA", "HerramientaCASA\HerramientaCASA.csproj", "{60B569DA-FC18-45B9-8ACC-8E29D8C2EA2C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "bdHerramientaCACOA", "bdHerramientaCACOA\bdHerramientaCACOA.csproj", "{5A4F92A5-CFD3-46F7-968C-7657BA57459D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {60B569DA-FC18-45B9-8ACC-8E29D8C2EA2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60B569DA-FC18-45B9-8ACC-8E29D8C2EA2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60B569DA-FC18-45B9-8ACC-8E29D8C2EA2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60B569DA-FC18-45B9-8ACC-8E29D8C2EA2C}.Release|Any CPU.Build.0 = Release|Any CPU + {5A4F92A5-CFD3-46F7-968C-7657BA57459D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A4F92A5-CFD3-46F7-968C-7657BA57459D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A4F92A5-CFD3-46F7-968C-7657BA57459D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A4F92A5-CFD3-46F7-968C-7657BA57459D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7361A131-4003-4809-BF4C-8CFA8A879159} + EndGlobalSection +EndGlobal diff --git a/HerramientaCASA/Components/App.razor b/HerramientaCASA/Components/App.razor new file mode 100644 index 0000000..35bdbf1 --- /dev/null +++ b/HerramientaCASA/Components/App.razor @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/HerramientaCASA/Components/Layout/ConfiguracionLayout.razor b/HerramientaCASA/Components/Layout/ConfiguracionLayout.razor new file mode 100644 index 0000000..42f156d --- /dev/null +++ b/HerramientaCASA/Components/Layout/ConfiguracionLayout.razor @@ -0,0 +1,108 @@ +@inherits LayoutComponentBase +@using BlazorBootstrap; +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.Components.Web +@inject NavigationManager Navigation +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+
+
+
+ @Body +
+
+
+ + + @code { + + + protected override async Task OnInitializedAsync() + { + var obtenerDatoAdmin = await ProtectedSessionStore.GetAsync("EsAdmin"); + var obtenerDatoId = await ProtectedSessionStore.GetAsync("idUsuario"); + // Redirigir al home si no hay token y la ruta no es pública + if (obtenerDatoId.Value == 0 || !obtenerDatoAdmin.Value) + { + Navigation.NavigateTo("/", true); + } + } + } diff --git a/HerramientaCASA/Components/Layout/LoginLayout.razor b/HerramientaCASA/Components/Layout/LoginLayout.razor new file mode 100644 index 0000000..6747fa4 --- /dev/null +++ b/HerramientaCASA/Components/Layout/LoginLayout.razor @@ -0,0 +1,40 @@ +@inherits LayoutComponentBase +@using BlazorBootstrap; +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.Components.Web +@inject UserState UserState + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ @Body +
+
+ + +@code{ + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Layout/MainLayout.razor b/HerramientaCASA/Components/Layout/MainLayout.razor new file mode 100644 index 0000000..67f2d13 --- /dev/null +++ b/HerramientaCASA/Components/Layout/MainLayout.razor @@ -0,0 +1,113 @@ +@using BlazorBootstrap; +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.Components.Web +@inherits LayoutComponentBase +@inject NavigationManager Navigation +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+
+
+
+ @Body +
+
+
+ + +@code { + private bool MostrarExtra => Navigation.Uri.Contains("PanelControl", StringComparison.OrdinalIgnoreCase); + + + protected override async Task OnInitializedAsync() + { + var obtenerDatoAdmin = await ProtectedSessionStore.GetAsync("EsAdmin"); + var obtenerDatoId = await ProtectedSessionStore.GetAsync("idUsuario"); + // Redirigir al home si no hay token y la ruta no es pública + if (obtenerDatoId.Value == 0 || obtenerDatoAdmin.Value) + { + Navigation.NavigateTo("/", true); + } + } +} diff --git a/HerramientaCASA/Components/Layout/MainLayout.razor.css b/HerramientaCASA/Components/Layout/MainLayout.razor.css new file mode 100644 index 0000000..038baf1 --- /dev/null +++ b/HerramientaCASA/Components/Layout/MainLayout.razor.css @@ -0,0 +1,96 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/HerramientaCASA/Components/Layout/NavMenu.razor b/HerramientaCASA/Components/Layout/NavMenu.razor new file mode 100644 index 0000000..5cf3348 --- /dev/null +++ b/HerramientaCASA/Components/Layout/NavMenu.razor @@ -0,0 +1,30 @@ + + + + + + diff --git a/HerramientaCASA/Components/Layout/NavMenu.razor.css b/HerramientaCASA/Components/Layout/NavMenu.razor.css new file mode 100644 index 0000000..4e15395 --- /dev/null +++ b/HerramientaCASA/Components/Layout/NavMenu.razor.css @@ -0,0 +1,105 @@ +.navbar-toggler { + appearance: none; + cursor: pointer; + width: 3.5rem; + height: 2.5rem; + color: white; + position: absolute; + top: 0.5rem; + right: 1rem; + border: 1px solid rgba(255, 255, 255, 0.1); + background: 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") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); +} + +.navbar-toggler:checked { + background-color: rgba(255, 255, 255, 0.5); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep .nav-link { + color: #d7d7d7; + background: none; + border: none; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + width: 100%; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep .nav-link:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +.nav-scrollable { + display: none; +} + +.navbar-toggler:checked ~ .nav-scrollable { + display: block; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .nav-scrollable { + /* Never collapse the sidebar for wide screens */ + display: block; + + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/HerramientaCASA/Components/Pages/Bajas.razor b/HerramientaCASA/Components/Pages/Bajas.razor new file mode 100644 index 0000000..99b143c --- /dev/null +++ b/HerramientaCASA/Components/Pages/Bajas.razor @@ -0,0 +1,513 @@ +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using Microsoft.EntityFrameworkCore +@using System.Text +@using bdHerramientaCACOA.db + +@page "/Bajas" +@page "/Bajas/{idSimulador}" + +@inject UserState userState +@inject NavigationManager Navigation + + + +

+ @TextoSuperior +

+@if (!actualizado) +{ +
+ Esta simulación utiliza valores desactualizados. ¿Quiere Realizar una copia actualizada? + +
+} + + +
+ + @if (TituloBoton == "Guardar") + { +

Se va a guardar esta nueva simulación podrá acceder a ella para consultarla y editarla desde el apartado Mis Simulaciones

+ } + else + { +

Se van a sobrescribir los datos de la simulación actual con los cambios realizados, esta opción no puede deshacerse.

¿Desea continuar?

+ } +
+
+ + + + +
+ + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ +
+ + + @if (!nuevoElemento) + { + + } + else + { + + } + +
+ +
+
+ + Nombre de la simulación: + +
+
+
Convenio Colectivo:
+ + + + + + + + + + +
+
+
Datos del Despacho Profesional
+
+
+
+
+
+ + + + + + + + + + + + + + +
Año oferta: + +
Oferta económica: +
+ € +
+
Tasa producción: +
+ % +
+
+
+
+
+
+ + + + @context.Descripcion + + + + + + + + +
+ h +
+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Total Costes Personal (€)@objetoBaja.TotalCostesPersonales €
Horas Despacho + + @objetoBaja.HorasDespacho h + +
Tasa de Producción + @objetoBaja.TasaProduccion %
Coste Directo Hora Producción@objetoBaja.CosteDirectoHP €
Costes Indirectos@objetoBaja.CosteIndirecto €
Costes Variables@objetoBaja.CosteVariable €
Total Coste Hora Producción@objetoBaja.TotalCosteHP €
Tiempo ejecución Trab. Prof. + @objetoBaja.TiempoEjecucionTrabProf h +
Semanas Producción @objetoBaja.SemanasProduccion
+
+
+
+
+ + +@code { + [Parameter] + public string? idSimulador { get; set; } = ""; + public bool actualizado = true; + + public string TextoSuperior = "Nueva Simulación de Baja"; + public string TituloBoton = "Guardar"; + private Modal popupGuardar = default!; + + public BAJA objetoBaja { get; set; } + public tsHerramientasCACOA bd; + List listadoGrupos = new List(); + + private DatosGrupoTrabajo itemSeleccionado { get; set; } = new DatosGrupoTrabajo(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + + List mensajes = new List(); + + private string nombreOriginal = ""; + + + protected override async Task OnInitializedAsync() + { + try + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + if (string.IsNullOrEmpty(idSimulador)) + { + try + { + objetoBaja = new BAJA(); + objetoBaja.Inicializar(bd); + } + catch (Exception ex) + { + var a = ex.Message; + } + } + else + { + string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + -875421649); + + simulaciones simu = bd.simulaciones.Where(x => x.idSimulacion == int.Parse(idDesencriptado)).First(); + int idFicheroJSON = simu.idFicheroJSON; + idSimulador = idDesencriptado; + var byteFichero = bd.ficheros.Where(x => x.idFichero == idFicheroJSON).First().Fichero; + + string BajaJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + objetoBaja = System.Text.Json.JsonSerializer.Deserialize(BajaJson); + + var fechaActVar = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD").Fecha1; + if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion == null && simu.FechaCreacion < fechaActVar)) + { + actualizado = false; + } + TextoSuperior = "Modificando simulación \"" + simu.Descripcion + "\""; + TituloBoton = "Modificar"; + + nombreOriginal = objetoBaja.Descripcion; + + } + + listadoGrupos = objetoBaja.ListaDespachoProfesional.ToList(); + } + catch (Exception ex) + { + Console.WriteLine($"Error durante la inicialización: {ex.Message}"); + } + } + + + + private async Task abrirPopupGestionDatos(DatosGrupoTrabajo objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + } + else + { + nuevoElemento = false; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar uso"; + } + else + { + tituloPopup = "Nuevo uso"; + } + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + + private async Task GestionarDatos(string accion) + { + switch (accion) + { + case "update": + objetoBaja.ActualizarDatosGrupoTrabajo(itemSeleccionado); + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + objetoBaja.ListaDespachoProfesional.Add(itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoBaja.ListaDespachoProfesional.Remove(itemSeleccionado); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + listadoGrupos = objetoBaja.ListaDespachoProfesional.ToList(); + await InvokeAsync(StateHasChanged); + } + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(DatosGrupoTrabajo objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + private async void NumTrabCambiado(double e, DatosGrupoTrabajo objeto) + { + objeto.NumTrabajadores = (double)e; + objetoBaja.ActualizarDatosGrupoTrabajo(objeto); + + await InvokeAsync(StateHasChanged); + } + private async void HorasSemanalesCambiado(double e, DatosGrupoTrabajo objeto) + { + objeto.HorasSemanales = (double)e; + objetoBaja.ActualizarDatosGrupoTrabajo(objeto); + + await InvokeAsync(StateHasChanged); + } + + + private void guardarBaja() + { + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoBaja); + int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.BAJA)).idEnumeracion; + + + if (string.IsNullOrEmpty(idSimulador)) + { + if (bd.simulaciones.Any(x => x.Descripcion ==objetoBaja.Descripcion&& x.idTipoSimulacion == idtipoSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + crearBaja(jsonObjeto); + } + } + else + { + var listadoSimulacionesExistentes = bd.simulaciones.Where(x => x.Descripcion != nombreOriginal && x.idTipoSimulacion == idtipoSimulacion).ToList(); + + if (listadoSimulacionesExistentes.Any(x => x.Descripcion == objetoBaja.Descripcion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + actualizarBaja(jsonObjeto); + } + } + } + + private void crearBaja(string jsonObjeto) + { + int idBajaCreada= UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.BAJA, jsonObjeto, objetoBaja.Descripcion, "baja.json", userState.idUser); + string link = "/Bajas?idSimulador=" + tsUtilidades.crypt.FEncS(idBajaCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Baja creada correctamente.", + }); + Navigation.NavigateTo(link, true); + } + private void actualizarBaja(string jsonObjeto) + { + UtilidadesCASA.actualziarObjeto(bd, jsonObjeto, objetoBaja.Descripcion, idSimulador); + cerrarPopupGuardar(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Baja actualizada correctamente.", + }); + } + + private void clonarBaja() + { + objetoBaja.Inicializar(bd); + objetoBaja.CalcularBaja(); + objetoBaja.Descripcion = objetoBaja.Descripcion + " (Act:" + DateTime.Now + ")"; + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoBaja); + var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.CASA, jsonObjeto, objetoBaja.Descripcion, "baja.json", userState.idUser); + + var link = "/Bajas?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + + Navigation.NavigateTo(link, true); + } + public void RefreshState() + { + this.StateHasChanged(); + } + private async Task CalcularTabla(string idProvincia) + { + + objetoBaja.idProvincia = idProvincia; + objetoBaja.ListaCDCI = objetoBaja.CalcularTabla(idProvincia); + objetoBaja.CalcularBaja(); + RefreshState(); + } + private async Task abrirPopupGuardar() + { + await popupGuardar.ShowAsync(); + } + private async Task cerrarPopupGuardar() + { + await popupGuardar.HideAsync(); + } +} + + diff --git a/HerramientaCASA/Components/Pages/Comun/ClonarDespacho.razor b/HerramientaCASA/Components/Pages/Comun/ClonarDespacho.razor new file mode 100644 index 0000000..f75784c --- /dev/null +++ b/HerramientaCASA/Components/Pages/Comun/ClonarDespacho.razor @@ -0,0 +1,157 @@ +@using HerramientaCASA.Components.Pages.HerramientaCASATabs.DespachoProfesionalComponents +@using HerramientaCASA.Model +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore +@inject NavigationManager Navigation +@inject UserState UserState + + +@if (listadoSimulaciones.Count > 0) +{ + + +
+

+ Esta opción le permite copiar sólo los datos de la pestaña despacho profesional de una simulacion existente. +

+

+ Se reemplazarán los datos del despacho profesional de la simulación actual.
Los cambios no se almacenarán hasta que pulse en el botón Guardar/Modificar. +

+
+
+ +
+ + + @foreach (var simulacion in listadoSimulaciones) + { + + } + +
+
+
+ + + + +
+ + +
+
+ +
+
+} + + +@code { + [Parameter] + public ClonarDespachoVM datosDespachoClonado { get; set; } = new ClonarDespachoVM(); + + [CascadingParameter] + public HerramientaCASA.Components.Pages.HerramientaCASATabs.DespachoProfesional _Parent { get; set; } + + + // CAMBIAR POR LA OTRA PAGINA QUE LLAMA A CLONAR DESPACHO Y CAMBIAR ABAJO EN LA FUNCION + [CascadingParameter] + public HerramientaCASA.Components.Pages.HerramientaURBANTabs.DespachoProfesionalURBAN _OtroParent { get; set; } + + private List listadoSimulaciones = new List(); + private int idFicheroObtenido; + private Modal popupGestionDatos = default!; + + public tsHerramientasCACOA bd; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + cargarListaSimulaciones(); + + idFicheroObtenido = listadoSimulaciones.Count > 0 ? listadoSimulaciones.First().idFicheroJSON : 0; + } + + private async void cargarListaSimulaciones() + { + + var idUser = await ProtectedSessionStore.GetAsync("idUsuario"); + + listadoSimulaciones = bd.simulaciones.Include(x => x.idTipoSimulacionNavigation).Where(x => x.idCodigo == idUser.Value && (x.idTipoSimulacionNavigation.Codigo == "TIPOHERRAMIENTA.CASA" || x.idTipoSimulacionNavigation.Codigo == "TIPOHERRAMIENTA.URBAND") && x.idSimulacion != datosDespachoClonado.idSimulacion).ToList(); + + } + public void RefreshState() + { + this.StateHasChanged(); + } + + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + private async Task abrirPopupGestionDatos() + { + StateHasChanged(); + await popupGestionDatos.ShowAsync(); + } + + private void clonarDespacho() + { + if (_Parent != null) + { + var byteFichero = bd.ficheros.First(x => x.idFichero == idFicheroObtenido).Fichero; + + string CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + var casaCopiada = System.Text.Json.JsonSerializer.Deserialize(CASAJson); + + datosDespachoClonado.despachoProf.Trabajadores = casaCopiada.DespachoProfesional.Trabajadores; + datosDespachoClonado.despachoProf.CostesIndirectos = casaCopiada.DespachoProfesional.CostesIndirectos; + datosDespachoClonado.despachoProf.CostesPersonal = casaCopiada.DespachoProfesional.CostesPersonal; + + refrescarPadre(); + StateHasChanged(); + cerrarPopupGestionDatos(); + // Navigation.NavigateTo("/HerramientaCASAS?idClonado=" + tsUtilidades.crypt.FEncS(idFicheroObtenido.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649), true); + + } + else if (_OtroParent != null) + { + + var byteFichero = bd.ficheros.First(x => x.idFichero == idFicheroObtenido).Fichero; + + string CASAURBANJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + var casaCopiada = System.Text.Json.JsonSerializer.Deserialize(CASAURBANJson); + + datosDespachoClonado.despachoProf.Trabajadores = casaCopiada.DespachoProfesional.Trabajadores; + datosDespachoClonado.despachoProf.CostesIndirectos = casaCopiada.DespachoProfesional.CostesIndirectos; + datosDespachoClonado.despachoProf.CostesPersonal = casaCopiada.DespachoProfesional.CostesPersonal; + + + refrescarPadre(); + StateHasChanged(); + cerrarPopupGestionDatos(); + } + } + + + private void refrescarPadre() + { + if (_Parent != null) + { + _Parent.hacerCalculos(); + _Parent.RefreshState(); + } + else if (_OtroParent != null) + { + _OtroParent.hacerCalculos(); + _OtroParent.RefreshState(); + } + } +} diff --git a/HerramientaCASA/Components/Pages/Comun/OtrosTrabajos.razor b/HerramientaCASA/Components/Pages/Comun/OtrosTrabajos.razor new file mode 100644 index 0000000..bf874b0 --- /dev/null +++ b/HerramientaCASA/Components/Pages/Comun/OtrosTrabajos.razor @@ -0,0 +1,505 @@ +@using System.Globalization +@using HerramientaCASA.Components.Pages.HerramientaCASATabs.CostesProduccionComponents +@using bdHerramientaCACOA.db +@using static bdHerramientaCACOA.CASA + + + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + +
+ + + @foreach (var grupoTipologia in enumeracionOtrosTrabajos) + { + + } + +
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idTrabajo))
+
+ +
+
+ +
+ € +
+
+
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.Coste))
+
+ + +
+ + + + +
+
+ + +
+
+ Otros trabajos incluidos en el Encargo +
+
+ + + + + @context.Denominacion + + + @context.Coste.MilesYDecimales() € + + +
+ + + + + + +
+ +
+
+
+ + + + + + +
+
+
+ +
+
+ Total Otros trabajos: + + @if (_LicitacionPadre != null) + { + @objetoLicitaciones.TotalOtrosTrabajos.MilesYDecimales() € + } + else if (_HerramientaCASAPadre != null) + { + @objetoCASA.CostesProduccion.TotalOtrosTrabajos.MilesYDecimales() € + } +
+
+ +
+
+
+ +@code { + [Parameter] + public LICITACIONES objetoLicitaciones { get; set; } = new LICITACIONES(); + + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + List listOtrosTrabajos = new List(); + + List enumeracionOtrosTrabajos = new List(); + + [SupplyParameterFromForm] + private CASA.OtrosTrabajos itemSeleccionado { get; set; } = new CASA.OtrosTrabajos(); + + private CASA.OtrosTrabajos itemSeleccionadoTemporal { get; set; } = new CASA.OtrosTrabajos(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + + private EditContext editContext; + + + List mensajes = new List(); + + // PADRE LICITACIONES + [CascadingParameter] + public Licitaciones _LicitacionPadre { get; set; } + + // PADRE LICITACIONES + [CascadingParameter] + public CostesTrabajo _HerramientaCASAPadre { get; set; } + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + @if (_LicitacionPadre != null) + { + enumeracionOtrosTrabajos = objetoLicitaciones.Enumerados.ListaOtrosTrabajos; + } + else if (_HerramientaCASAPadre != null) + { + enumeracionOtrosTrabajos = objetoCASA.Enumerados.ListaOtrosTrabajos; + } + + cargarListado(); + } + + private void cargarListado() + { + if (_LicitacionPadre != null) + { + listOtrosTrabajos = objetoLicitaciones.OtrosTrabajos.ToList(); + } + else if (_HerramientaCASAPadre != null) + { + listOtrosTrabajos = objetoCASA.CostesProduccion.OtrosTrabajos.ToList(); + } + } + + + // CALCULOS PARA LICITACIONES + private async void OtroTrabajoCambiadoLicitaciones(double e, CASA.OtrosTrabajos objeto) + { + objeto.Coste = (double)e; + objetoLicitaciones.ActualizarOtrosTrabajos(objeto); + objetoLicitaciones.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _LicitacionPadre.RefreshState(); + } + + // CALCULOS PARA CASA + private async void OtroTrabajoCambiadoCASA(double e, CASA.OtrosTrabajos objeto) + { + objeto.Coste = (double)e; + objetoCASA.ActualizarOtrosTrabajos(objeto); + + await InvokeAsync(StateHasChanged); + _HerramientaCASAPadre.RefreshState(); + } + + + private void refrescarPadre() + { + if (_LicitacionPadre != null) + { + _LicitacionPadre.RefreshState(); + } + else if (_HerramientaCASAPadre != null) + { + _HerramientaCASAPadre.RefreshState(); + } + } + + private void comprobarPadre(string accion) + { + switch (accion) + { + case "update": + + + if (_LicitacionPadre != null) + { + objetoLicitaciones.ActualizarOtrosTrabajos(itemSeleccionado); + } + else if (_HerramientaCASAPadre != null) + { + objetoCASA.ActualizarOtrosTrabajos(itemSeleccionado); + } + + break; + + case "create": + + + if (_LicitacionPadre != null) + { + objetoLicitaciones.InsertarOtrosTrabajos(itemSeleccionado); + } + else if (_HerramientaCASAPadre != null) + { + objetoCASA.InsertarOtrosTrabajos(itemSeleccionado); + } + + break; + + case "delete": + + + if (_LicitacionPadre != null) + { + objetoLicitaciones.EliminarOtrosTrabajos(itemSeleccionado); + } + else if (_HerramientaCASAPadre != null) + { + objetoCASA.EliminarOtrosTrabajos(itemSeleccionado); + } + + break; + } + } + + + //////////// PARTE DE GESTIONAR DATOS POPUP /////////// + + private async Task GestionarDatos(string accion) + { + + + switch (accion) + { + case "update": + + rellenarItem(); + + if (_LicitacionPadre != null) + { + itemSeleccionado.Denominacion = objetoLicitaciones.Enumerados.ListaOtrosTrabajos.First(x => x.idEnumeracion == itemSeleccionado.idTrabajo).ValorAlfabetico1; + } + else if (_HerramientaCASAPadre != null) + { + itemSeleccionado.Denominacion = objetoCASA.Enumerados.ListaOtrosTrabajos.First(x => x.idEnumeracion == itemSeleccionado.idTrabajo).ValorAlfabetico1; + } + + comprobarPadre(accion); + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + + rellenarItem(); + + if (_LicitacionPadre != null) + { + itemSeleccionado.Denominacion = objetoLicitaciones.Enumerados.ListaOtrosTrabajos.First(x => x.idEnumeracion == itemSeleccionado.idTrabajo).ValorAlfabetico1; + } + else if (_HerramientaCASAPadre != null) + { + itemSeleccionado.Denominacion = objetoCASA.Enumerados.ListaOtrosTrabajos.First(x => x.idEnumeracion == itemSeleccionado.idTrabajo).ValorAlfabetico1; + } + + comprobarPadre(accion); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + comprobarPadre(accion); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + cargarListado(); + await InvokeAsync(StateHasChanged); + refrescarPadre(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + private async Task abrirPopupGestionDatos(CASA.OtrosTrabajos objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + itemSeleccionadoTemporal = new CASA.OtrosTrabajos(); + + } + else + { + nuevoElemento = false; + itemSeleccionadoTemporal = new CASA.OtrosTrabajos() + { + idTrabajo = objeto.idTrabajo, +Coste = objeto.Coste, +Denominacion = objeto.Denominacion + }; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar Trabajo"; + } + else + { + tituloPopup = "Añadir Trabajo"; + } + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionadoTemporal.Coste): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + itemSeleccionadoTemporal.Coste = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + case nameof(itemSeleccionadoTemporal.idTrabajo): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionadoTemporal.idTrabajo = int.Parse(value); + } + else + { + itemSeleccionadoTemporal.idTrabajo = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(itemSeleccionadoTemporal.Coste) && itemSeleccionadoTemporal.Coste <= 0) + { + messageStore?.Add(field, "El coste debe ser mayor que 0."); + } + + if (fieldName == nameof(itemSeleccionadoTemporal.idTrabajo) && itemSeleccionadoTemporal.idTrabajo == 0) + { + messageStore?.Add(field, "Seleccione un trabajo."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.Coste }, nameof(itemSeleccionadoTemporal.Coste)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idTrabajo }, nameof(itemSeleccionadoTemporal.idTrabajo)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(itemSeleccionadoTemporal.Coste), nameof(itemSeleccionadoTemporal.idTrabajo) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.OtrosTrabajos).GetProperty(field)?.GetValue(itemSeleccionadoTemporal) }, field); + } + } + + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.OtrosTrabajos objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + + private void rellenarItem() + { + itemSeleccionado.idTrabajo = itemSeleccionadoTemporal.idTrabajo; + itemSeleccionado.Coste = itemSeleccionadoTemporal.Coste; + itemSeleccionado.Denominacion = itemSeleccionadoTemporal.Denominacion; + } +} diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/CDCIConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/CDCIConf.razor new file mode 100644 index 0000000..5a7fb04 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/CDCIConf.razor @@ -0,0 +1,488 @@ +@* @page "/CDCIConf" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.numTrabajadores))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.HorasProduccionAnuales))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.CosteMinimoPersonal))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.CosteMaxPersonal))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.HorasProduccionAnuales))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.CostesDirectos))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.CostesIndirectos))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.TotalDespachoProfesional))
+
+
+ + + + +
+
+ +
+ +
+ +
+ + + + + @context.numTrabajadores + + + + @context.HorasProduccionAnuales + + + + @context.CosteMinimoPersonal + + + + @context.CosteMaxPersonal + + + @context.CosteDirectoMedio + + + @context.CostesDirectos + + + @context.CostesIndirectos + + + @context.TotalDespachoProfesional + + + + + + + + + + + + +
+ +@code { + + public List listadoCDCI { get; set; } = new List(); + + [SupplyParameterFromForm] + private costedespachoprofesional itemSeleccionado { get; set; } = new costedespachoprofesional(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string tipoFactorComplejidad = "FACCOMP."; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoCDCI = bd.costedespachoprofesional.OrderBy(x => x.numTrabajadores).ToList(); + } + + + private async Task abrirPopupGestionDatos(costedespachoprofesional objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + } + else + { + nuevoElemento = false; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar CD+CI"; + } + else + { + tituloPopup = "Nuevo CD+CI"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + + case nameof(itemSeleccionado.numTrabajadores): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.numTrabajadores = int.Parse(value, CultureInfo.InvariantCulture); + } + else + { + + itemSeleccionado.numTrabajadores = 0; + } + + break; + + case nameof(itemSeleccionado.HorasProduccionAnuales): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.HorasProduccionAnuales = double.Parse(value); + } + else + { + itemSeleccionado.HorasProduccionAnuales = 0; + } + + break; + case nameof(itemSeleccionado.CosteMinimoPersonal): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.CosteMinimoPersonal = double.Parse(value); + } + else + { + itemSeleccionado.CosteMinimoPersonal = 0; + } + + break; + case nameof(itemSeleccionado.CosteMaxPersonal): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.CosteMaxPersonal = double.Parse(value); + } + else + { + itemSeleccionado.CosteMaxPersonal = 0; + } + + break; + case nameof(itemSeleccionado.CosteDirectoMedio): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.CosteDirectoMedio = double.Parse(value); + } + else + { + itemSeleccionado.CosteDirectoMedio = 0; + } + + break; + case nameof(itemSeleccionado.CostesDirectos): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.CostesDirectos = double.Parse(value); + } + else + { + itemSeleccionado.CostesDirectos = 0; + } + + break; + case nameof(itemSeleccionado.CostesIndirectos): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.CostesIndirectos = double.Parse(value); + } + else + { + itemSeleccionado.CostesIndirectos = 0; + } + + break; + case nameof(itemSeleccionado.TotalDespachoProfesional): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.TotalDespachoProfesional = double.Parse(value); + } + else + { + itemSeleccionado.TotalDespachoProfesional = 0; + } + + break; + } + + messageStore?.Clear(field); + + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.numTrabajadores }, nameof(itemSeleccionado.numTrabajadores)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.HorasProduccionAnuales }, nameof(itemSeleccionado.HorasProduccionAnuales)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CosteMinimoPersonal }, nameof(itemSeleccionado.CosteMinimoPersonal)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CosteMaxPersonal }, nameof(itemSeleccionado.CosteMaxPersonal)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CosteDirectoMedio }, nameof(itemSeleccionado.CosteDirectoMedio)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CostesIndirectos }, nameof(itemSeleccionado.CostesIndirectos)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.CostesDirectos }, nameof(itemSeleccionado.CostesDirectos)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.TotalDespachoProfesional }, nameof(itemSeleccionado.TotalDespachoProfesional)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var costeObtenido = bd.costedespachoprofesional.Where(x => x.idCosteDespachoProfesional == itemSeleccionado.idCosteDespachoProfesional).FirstOrDefault(); + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarCosteDespachoProfesional(bd, costeObtenido, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.crearCosteDespachoProfesional(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarCosteDespachoProfesional(bd, costeObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoCDCI = bd.costedespachoprofesional.OrderBy(x => x.numTrabajadores).ToList(); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(costedespachoprofesional objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { + nameof(itemSeleccionado.numTrabajadores), + nameof(itemSeleccionado.HorasProduccionAnuales), + nameof(itemSeleccionado.CosteMinimoPersonal), + nameof(itemSeleccionado.CosteMaxPersonal), + nameof(itemSeleccionado.CosteDirectoMedio), + nameof(itemSeleccionado.CostesDirectos), + nameof(itemSeleccionado.CostesIndirectos), + nameof(itemSeleccionado.TotalDespachoProfesional) + }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(factorescorreccion).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} *@ \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/CalculoCDCI.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/CalculoCDCI.razor new file mode 100644 index 0000000..c58c107 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/CalculoCDCI.razor @@ -0,0 +1,192 @@ +@page "/CalculoCDCI" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + +
+ Usa esta herramienta para ver como se calcula la tabla de CD+CI que se utiliza en los calculos +
+ Seleccione una Provincia: + + + + + + + + + + +
+ Equipo de trabajo minimo: +
+
+ Titulado grado superior:
+ +
+
+ Titulado grado medio:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Téc. Superior@ValorTecSuperior
Téc. Medio@ValorTecMedio
Téc. Medio@ValorDelineante
Jornada Laboral Anual@jornadaLaboralAnual
%Horas Produccion media@horasProdMedia
%Costes Variables@porcentajeCostesVariables
IPC COSTE INDIRECTO@ipcCosteDirecto
+ + + + + @context.NumeroTrabajadores + + + @context.HorasProduccionAnuales + + + @context.CosteMinimoPersonal + + + + @context.CosteMaximoPersonal + + + @context.CosteMedioPersonal + + + @context.CostesDirectos + + + @context.CostesIndirectos + + + @context.CostesVariables + + + @context.TotalDespachoProfesional + + + +
+ +@code { + public tsHerramientasCACOA bd; + List mensajes = new List(); + + string convenioSeleccionado = ""; + double ValorTecSuperior = 0; + double ValorTecMedio = 0; + double ValorDelineante = 0; + int jornadaLaboralAnual = 0; + double horasProdMedia = 0; + double porcentajeCostesVariables = 0; + double ipcCosteDirecto = 1; + int minimoGradoSuperior = 1; + int minimoGradoMedio = 0; + + List listaCDCI { get; set; } = new List(); + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + CalcularTabla(""); + } + private async Task MinimoSupCambiado(int valor) + { + if (valor < 1) + { + minimoGradoSuperior = 1; + } + else + { + minimoGradoSuperior = valor; + } + CalcularTabla(convenioSeleccionado); + } + private async Task MinimoMedCambiado(int valor) + { + + minimoGradoMedio = valor; + CalcularTabla(convenioSeleccionado); + } + private async Task CalcularTabla(string idProvincia) + { + listaCDCI = new List(); + //Obtenemos variables a utilizar + jornadaLaboralAnual =(int) bd.enumeraciones.First(x => x.Codigo == "VARCASA.JORLABANUAL").ValorNumerico1; + horasProdMedia =(double) bd.enumeraciones.First(x => x.Codigo == "VARCASA.HORPRODMEDIA").ValorNumerico1; + porcentajeCostesVariables = (double)bd.enumeraciones.First(x => x.Codigo == "VARCASA.COSTESVARIABLES").ValorNumerico1; + ipcCosteDirecto = (double)bd.enumeraciones.First(x => x.Codigo == "VARCASA.IPCCD").ValorNumerico1; + + var idGradSup = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.TECGRADSUP").idEnumeracion; + var idGradMed = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.GESTPROY").idEnumeracion; + var idDelin = bd.enumeraciones.First(x => x.Codigo == "PUESTOTRABAJO.DELINPROY").idEnumeracion; + if(idProvincia== ""){ idProvincia = null; } + + ValorTecSuperior = bd.conveniocolectivo.FirstOrDefault(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradSup) != null ? bd.conveniocolectivo.First(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradSup).CosteAnualTrabajador : 0; + ValorTecMedio = bd.conveniocolectivo.FirstOrDefault(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradMed) != null ? bd.conveniocolectivo.First(x => x.idProvincia == idProvincia && x.idEnumeracion == idGradMed).CosteAnualTrabajador : 0; + ValorDelineante = bd.conveniocolectivo.FirstOrDefault(x => x.idProvincia == idProvincia && x.idEnumeracion == idDelin) != null ? bd.conveniocolectivo.First(x => x.idProvincia == idProvincia && x.idEnumeracion == idDelin).CosteAnualTrabajador : 0; ; + + double masCaro = Math.Max(ValorTecSuperior, Math.Max(ValorTecMedio, ValorDelineante)); + double masBarato = Math.Min(ValorTecSuperior, Math.Min(ValorTecMedio, ValorDelineante)); + + int minimoTrabajadores = minimoGradoMedio + minimoGradoSuperior; + //Se calcula + //listaCDCI.Add(new CosteDirectoIndirecto(1, 1 * ValorTecSuperior, 1 * ValorTecSuperior, jornadaLaboralAnual, horasProdMedia, porcentajeCostesVariables)); + if (minimoTrabajadores == 1 && minimoGradoSuperior == 1) + {//Se calcula como siempre, el calculo de licitaciones CASA + for (int i = 2; i <= 20; i++) + { + double costeMinimo = ValorTecSuperior + (masBarato * (i - 1)); + double costeMaximo = ValorTecSuperior + (masCaro * (i - 1)); + listaCDCI.Add(new CosteDirectoIndirecto(i, costeMinimo, costeMaximo, jornadaLaboralAnual, horasProdMedia, porcentajeCostesVariables, ipcCosteDirecto)); + } + } + else + {//Se calcula con minimos, por si ponen minimos en licitaciones URBAN + for (int i = minimoTrabajadores+1; i <= 20; i++) + { + var numresto = i - minimoTrabajadores; + double costeMinimo = (ValorTecSuperior*minimoGradoSuperior)+(ValorTecMedio*minimoGradoMedio) + (masBarato * numresto); + double costeMaximo = (ValorTecSuperior * minimoGradoSuperior) + (ValorTecMedio * minimoGradoMedio) + (masCaro * (numresto)); + listaCDCI.Add(new CosteDirectoIndirecto(i, costeMinimo, costeMaximo, jornadaLaboralAnual, horasProdMedia, porcentajeCostesVariables, ipcCosteDirecto)); + } + } + + } +} + diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/ConvenioColectivo.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/ConvenioColectivo.razor new file mode 100644 index 0000000..1d6728d --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/ConvenioColectivo.razor @@ -0,0 +1,416 @@ +@page "/ConvenioColectivo" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + + + +
+
+ +
+
+ +
+ + + + + @context.NombreProvincia + + + @context.valorGradoSup.MilesYDecimales() € + + + + @context.valorGradoMed.MilesYDecimales() € + + + @context.valorDelinPro.MilesYDecimales() € + + + + @context.valorAdmin.MilesYDecimales() € + + + +
+ + + +
+ @* + + + *@ +
+
+
+
+ +@code { + + public List listadoConProv = new List(); + public List listadoCCAux = new List(); + + [SupplyParameterFromForm] + private ConvenioProvincia itemSeleccionado { get; set; } = new ConvenioProvincia(); + + public string Filter { get; set; } = ""; + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string tipoFactorComplejidad = "FACCOMP."; + + protected override async Task OnInitializedAsync() + { + try + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + obtenerListaConvenioProvincia(); + } + catch (Exception ex) + { + var a = ex.Message; + + } + } + private void obtenerListaConvenioProvincia() + { + var listadoCC = bd.conveniocolectivo.OrderBy(x => x.idProvincia).ToList(); + var listadoCP = listadoCC.GroupBy(x => x.idProvincia).ToList(); + for (int i = 0; i < listadoCP.Count; i++) + { + List cpg = listadoCP[i].ToList(); + + ConvenioProvincia cp = new ConvenioProvincia(); + cp.id = i; + + cp.idProvincia = cpg.First().idProvincia; + if (cp.idProvincia != null) + { + cp.NombreProvincia = cpg.First().idProvinciaNavigation.Nombre; + } + var gradoSup = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.TECGRADSUP"); + var gradoMed = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.GESTPROY"); + var delin = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.DELINPROY"); + var admin = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.ADMIN"); + cp.idGradoSup = gradoSup.idConvenioColectivo; + cp.valorGradoSup = gradoSup.CosteAnualTrabajador; + cp.idGradoMedio = gradoMed.idConvenioColectivo; + cp.valorGradoMed = gradoMed.CosteAnualTrabajador; + cp.idDelinPro = delin.idConvenioColectivo; + cp.valorDelinPro = delin.CosteAnualTrabajador; + cp.idAdmin = admin.idConvenioColectivo; + cp.valorAdmin = admin.CosteAnualTrabajador; + + listadoConProv.Add(cp); + } + + + + listadoCCAux = listadoConProv; + + } + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoConProv = new List(); + foreach (ConvenioProvincia item in listadoCCAux) + { + if (IsVisible(item) == true) + { + listadoConProv.Add(item); + } + } + } + + public bool IsVisible(ConvenioProvincia listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.NombreProvincia != null && listado.NombreProvincia.Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return false; + } + + private async Task abrirPopupGestionDatos(ConvenioProvincia objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + } + else + { + nuevoElemento = false; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar CD+CI: " + itemSeleccionado.NombreProvincia; + } + else + { + tituloPopup = "Nuevo CD+CI"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionado.valorGradoSup): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.valorGradoSup = int.Parse(value, CultureInfo.InvariantCulture); + } + else + { + + itemSeleccionado.valorGradoSup = 0; + } + + break; + case nameof(itemSeleccionado.valorGradoMed): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.valorGradoMed = int.Parse(value, CultureInfo.InvariantCulture); + } + else + { + + itemSeleccionado.valorGradoMed = 0; + } + + break; + case nameof(itemSeleccionado.valorDelinPro): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.valorDelinPro = int.Parse(value, CultureInfo.InvariantCulture); + } + else + { + + itemSeleccionado.valorDelinPro = 0; + } + + break; + case nameof(itemSeleccionado.valorAdmin): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.valorAdmin = int.Parse(value, CultureInfo.InvariantCulture); + } + else + { + + itemSeleccionado.valorAdmin = 0; + } + + break; + + } + + messageStore?.Clear(field); + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorGradoSup }, nameof(itemSeleccionado.valorGradoSup)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorGradoMed }, nameof(itemSeleccionado.valorGradoMed)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorDelinPro }, nameof(itemSeleccionado.valorDelinPro)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorAdmin }, nameof(itemSeleccionado.valorAdmin)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + //var convObtenido = bd.conveniocolectivo.Where(x => x.idConvenioColectivo == itemSeleccionado.idConvenioColectivo).FirstOrDefault(); + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarConvenioColectivo(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + // case "create": + // UtilidadesCASA.crearConvenioColectivo(bd, itemSeleccionado); + + // await cerrarPopupGestionDatos(); + // mensajes.Add(new ToastMessage + // { + // Type = ToastType.Primary, + // Message = $"Guardado correctamente.", + // }); + // break; + + // case "delete": + // UtilidadesCASA.eliminarCosteDespachoProfesional(bd, costeObtenido); + + // await cerrarPopupConfirmarBorrado(); + // mensajes.Add(new ToastMessage + // { + // Type = ToastType.Primary, + // Message = $"Eliminado correctamente.", + // }); + // break; + } + bd.SaveChanges(); + obtenerListaConvenioProvincia(); + await InvokeAsync(StateHasChanged); + + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(ConvenioProvincia objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + + messageStore?.Clear(); + foreach (var field in new[] { nameof(itemSeleccionado.valorGradoSup), nameof(itemSeleccionado.valorGradoMed), nameof(itemSeleccionado.valorDelinPro), nameof(itemSeleccionado.valorAdmin) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(ConvenioProvincia).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrban.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrban.razor new file mode 100644 index 0000000..c377df7 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrban.razor @@ -0,0 +1,68 @@ +@page "/DocumentosUrban" + +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@rendermode InteractiveServer +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + +
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ + + +
+
+
+ + + +
+ +
+
+
+
+
+ +@code { + public tsHerramientasCACOA bd; + public List listadoTipoDocu { get; set; } = new List(); + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + + listadoTipoDocu = bd.enumeraciones.Where(x => x.Codigo.Contains("TIPODOCU.")).ToList(); + } + + + public void RefreshState() + { + listadoTipoDocu = bd.enumeraciones.Where(x => x.Codigo.Contains("TIPODOCU.")).ToList(); + this.StateHasChanged(); + } +} diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/DocuUrban.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/DocuUrban.razor new file mode 100644 index 0000000..e8b3720 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/DocuUrban.razor @@ -0,0 +1,380 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@rendermode InteractiveServer + +@using BlazorBootstrap +@using System.Globalization +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ + + + +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + + + + + @context.Descripcion + + + + @context.CoeficienteHoras.MilesYDecimales() + + + + @if (context.Checkeable) + { + + + + } + + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoDocumentancion { get; set; } = new List(); + public List listadoDocumentancionAux { get; set; } = new List(); + + [SupplyParameterFromForm] + private documentacion itemSeleccionado { get; set; } = new documentacion(); + + private string tituloPopup = ""; + public string Filter { get; set; } = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private double? coeficienteItem = 0; + private bool checkItem = false; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private List listadoTipoDocu { get; set; } = new List(); + private string tipoProyectoEnum = "TIPODOCU."; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoDocumentancion = bd.documentacion.ToList(); + listadoDocumentancionAux = listadoDocumentancion; + } + + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoDocumentancion = new List(); + foreach (bdHerramientaCACOA.db.documentacion item in listadoDocumentancionAux) + { + if (IsVisible(item) == true) + { + listadoDocumentancion.Add(item); + } + } + } + + public bool IsVisible(bdHerramientaCACOA.db.documentacion listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.Descripcion.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + + return false; + } + + + private async Task abrirPopupGestionDatos(documentacion objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + coeficienteItem = 0; + checkItem = false; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.Descripcion; + coeficienteItem = objeto.CoeficienteHoras; + checkItem = objeto.Checkeable; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar documentanción"; + } + else + { + tituloPopup = "Añadir documentanción"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var docuObtenida = bd.documentacion.Where(x => x.iddocumentacion== itemSeleccionado.iddocumentacion).FirstOrDefault(); + + itemSeleccionado.Descripcion = descripcionItem; + itemSeleccionado.CoeficienteHoras = coeficienteItem; + itemSeleccionado.Checkeable = checkItem; + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarDocumentacion(bd, docuObtenida, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.crearDocumentacion(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarDocumentacion(bd, docuObtenida); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoDocumentancion = bd.documentacion.ToList(); + listadoDocumentancionAux = listadoDocumentancion; + + await InvokeAsync(StateHasChanged); + } + + private async void opcionalCambiado(bool e) + { + checkItem = e; + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(documentacion objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(documentacion).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/ProyectoDocumentacion.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/ProyectoDocumentacion.razor new file mode 100644 index 0000000..dc5c068 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/ProyectoDocumentacion.razor @@ -0,0 +1,418 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@rendermode InteractiveServer + +@using BlazorBootstrap +@using System.Globalization +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + + @foreach (var grupoProyecto in listProyectos) + { + + } + +
+
+ + +
+
+ + + @foreach (var grupoProyecto in listDocu) + { + + } + +
+
+ +
+
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ +
+
+ + +
+
+ +
+ + + + +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + + + + + @context.tipoproyecto + + + + @context.documentacion + + + + @if (context.esMinima == true) + { + + + + } + + + + @if (context.esOpcional == true) + { + + + + } + + + + @if (context.esNecesario == true) + { + + + + } + + + + + @context.orden + + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoTipos_Docu { get; set; } = new List(); + public List listadoTipos_DocuAux { get; set; } = new List(); + + public List listProyectos { get; set; } = new List(); + public List listDocu { get; set; } = new List(); + + [SupplyParameterFromForm] + private v_tipoproyecto_documentacion itemSeleccionado { get; set; } = new v_tipoproyecto_documentacion(); + + private string tituloPopup = ""; + public string Filter { get; set; } = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private int? idTipoProyecItem = 0; + private int? idTipoDocItem = 0; + private int ordenItem= 0; + private bool? docuOpcionalItem = false; + private bool? docuMinimItem = false; + private bool? docuNecesaItem = false; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoTipos_Docu = bd.v_tipoproyecto_documentacion.ToList(); + listadoTipos_DocuAux = listadoTipos_Docu; + + listProyectos = bd.tipoproyectos.ToList(); + listDocu = bd.documentacion.ToList(); + } + + private async void Seleccionar(int item) + { + switch(item){ + case 1: + docuMinimItem = true; + docuNecesaItem = false; + docuOpcionalItem = false; + break; + + case 2: + docuMinimItem = false; + docuNecesaItem = false; + docuOpcionalItem = true; + break; + + + case 3: + docuMinimItem = false; + docuNecesaItem = true; + docuOpcionalItem = false; + break; + } + } + + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoTipos_Docu = new List(); + foreach (bdHerramientaCACOA.db.v_tipoproyecto_documentacion item in listadoTipos_DocuAux) + { + if (IsVisible(item) == true) + { + listadoTipos_Docu.Add(item); + } + } + } + + public bool IsVisible(bdHerramientaCACOA.db.v_tipoproyecto_documentacion listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.tipoproyecto.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (listado.documentacion.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + + return false; + } + + + private async Task abrirPopupGestionDatos(v_tipoproyecto_documentacion objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + idTipoProyecItem = 0; + idTipoDocItem = 0; + ordenItem = 0; + docuOpcionalItem = false; + docuMinimItem = false; + docuNecesaItem = false; + } + else + { + nuevoElemento = false; + + idTipoProyecItem = objeto.idtipoproyecto; + idTipoDocItem = objeto.iddocumentacion; + ordenItem = objeto.orden; + docuOpcionalItem = objeto.esOpcional; + docuMinimItem = objeto.esMinima; + docuNecesaItem = objeto.esNecesario; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar documentanción"; + } + else + { + idTipoProyecItem = listProyectos.First().idtipoproyectos; + idTipoDocItem = listDocu.First().iddocumentacion; + + docuMinimItem = true; + + tituloPopup = "Añadir documentanción"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + + private async Task GestionarDatos(string accion) + { + var docuObtenida = bd.tipoproyecto_documentacion.Where(x => x.idtipoproyecto_documentacion == itemSeleccionado.idtipoproyecto_documentacion).FirstOrDefault(); + + itemSeleccionado.idtipoproyecto = idTipoProyecItem; + itemSeleccionado.iddocumentacion = idTipoDocItem; + itemSeleccionado.orden = ordenItem; + itemSeleccionado.esOpcional = docuOpcionalItem; + itemSeleccionado.esMinima = docuMinimItem; + itemSeleccionado.esNecesario = docuNecesaItem; + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarProyecto_Documentacion(bd, docuObtenida, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.crearProyecto_Documentacion(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarProyecto_Documentacion(bd, docuObtenida); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoTipos_Docu = bd.v_tipoproyecto_documentacion.ToList(); + listadoTipos_DocuAux = listadoTipos_Docu; + await InvokeAsync(StateHasChanged); + } + + private async void opcionalCambiado(bool e) + { + docuMinimItem= e; + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(v_tipoproyecto_documentacion objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/TipoDocuEnumUrban.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/TipoDocuEnumUrban.razor new file mode 100644 index 0000000..441cd0d --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/TipoDocuEnumUrban.razor @@ -0,0 +1,312 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+
+
+ + + +
+
+ +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoTipoDocu { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "TIPODOCU"; + + [CascadingParameter] + public DocumentosUrban _Parent { get; set; } + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoTipoDocu = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + ordenItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar tipo trabajo"; + } + else + { + tituloPopup = "Añadir tipo trabajo"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoTipoDocu = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/TipoProyectosUrban.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/TipoProyectosUrban.razor new file mode 100644 index 0000000..910baeb --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/DocumentosUrbanTabs/TipoProyectosUrban.razor @@ -0,0 +1,425 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@rendermode InteractiveServer + +@using BlazorBootstrap +@using System.Globalization +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + + + + + +
+ Nota: Si es el ùltimo tipo proyecto se borrara tambien su enumerado +

+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + @foreach (var grupoTipologia in listadoTipoDocu) + { + + } + +
@GetExternalValidationMessage(nameof(idTipoDocItem))
+
+
+ +
+
+ + +
+
@GetExternalValidationMessage(nameof(abreviItem))
+
+ + +
+ + + + +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + + + + + @context.Descripcion + + + + @context.idTipoDocumentoNavigation.ValorAlfabetico1 + + + + @context.Abreviatura + + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoTiposProyectos { get; set; } = new List(); + public List listadoTiposProyectosAux { get; set; } = new List(); + + [SupplyParameterFromForm] + private tipoproyectos itemSeleccionado { get; set; } = new tipoproyectos(); + + [Parameter] + public List listadoTipoDocu { get; set; } = new List(); + + private string tituloPopup = ""; + public string Filter { get; set; } = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int idTipoDocItem= 0; + private string abreviItem = ""; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + + private string tipoProyectoEnum = "TIPODOCU."; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoTiposProyectos = bd.tipoproyectos.Include(x => x.idTipoDocumentoNavigation).Where(x => x.idTipoDocumentoNavigation.Codigo.Contains(tipoProyectoEnum)).OrderBy(x => x.idTipoDocumentoNavigation.Orden).ToList(); + listadoTiposProyectosAux = listadoTiposProyectos; + } + + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoTiposProyectos = new List(); + foreach (bdHerramientaCACOA.db.tipoproyectos item in listadoTiposProyectosAux) + { + if (IsVisible(item) == true) + { + listadoTiposProyectos.Add(item); + } + } + } + + public bool IsVisible(bdHerramientaCACOA.db.tipoproyectos listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.idTipoDocumentoNavigation != null && listado.idTipoDocumentoNavigation.ValorAlfabetico1.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (listado.Descripcion.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + + if (listado.Abreviatura.ToString().Contains(Filter, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return false; + } + + + private async Task abrirPopupGestionDatos(tipoproyectos objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + idTipoDocItem = 0; + abreviItem = ""; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.Descripcion; + idTipoDocItem = objeto.idTipoDocumento; + abreviItem = objeto.Abreviatura; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar tipo proyecto"; + } + else + { + tituloPopup = "Añadir tipo proyecto"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(abreviItem): + if (!string.IsNullOrEmpty(value)) + { + + abreviItem = value; + } + else + { + abreviItem = ""; + } + break; + + case nameof(idTipoDocItem): + + if (!string.IsNullOrEmpty(value)) + { + + idTipoDocItem = int.Parse(value); + } + else + { + idTipoDocItem = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(abreviItem) && abreviItem == "") + { + messageStore?.Add(field, "La abreviatura no puede estar vacía."); + } + + if (fieldName == nameof(idTipoDocItem) && idTipoDocItem == 0) + { + messageStore?.Add(field, "Seleccione un tipo de documento."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = abreviItem }, nameof(abreviItem)); + ValidarYActualizar(new ChangeEventArgs { Value = idTipoDocItem }, nameof(idTipoDocItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var tipoProyectoObtenido = bd.tipoproyectos.Where(x => x.idtipoproyectos == itemSeleccionado.idtipoproyectos).FirstOrDefault(); + + itemSeleccionado.Descripcion = descripcionItem; + itemSeleccionado.Abreviatura = abreviItem; + itemSeleccionado.idTipoDocumento = idTipoDocItem; + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarTipoProyecto(bd, tipoProyectoObtenido, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.crearTipoProyecto(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarTipoProyecto(bd, tipoProyectoObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoTiposProyectos = bd.tipoproyectos.Include(x => x.idTipoDocumentoNavigation).Where(x => x.idTipoDocumentoNavigation.Codigo.Contains(tipoProyectoEnum)).OrderBy(x => x.idTipoDocumentoNavigation.Orden).ToList(); + listadoTiposProyectosAux = listadoTiposProyectos; + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(tipoproyectos objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(abreviItem), nameof(idTipoDocItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(tipoproyectos).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/Enumeraciones.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/Enumeraciones.razor new file mode 100644 index 0000000..1855c61 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/Enumeraciones.razor @@ -0,0 +1,85 @@ +@page "/Enumeraciones" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap + + +
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+ + +
+ +
+
+
+
+
+ + +@code { + +} diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/CostesIndirectosConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/CostesIndirectosConf.razor new file mode 100644 index 0000000..91d74bc --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/CostesIndirectosConf.razor @@ -0,0 +1,306 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
+ +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoCostesIndirectos { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "CI"; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoCostesIndirectos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + descripcionItem = ""; + ordenItem = 0; + } + else + { + nuevoElemento = false; + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar coste indirecto"; + } + else + { + tituloPopup = "Nuevo coste indirecto"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoCostesIndirectos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem)}) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/CostesVariablesConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/CostesVariablesConf.razor new file mode 100644 index 0000000..b6bb3bd --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/CostesVariablesConf.razor @@ -0,0 +1,307 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+
+
+ + + +
+
+ +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoCostesVariables { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "CV"; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoCostesVariables = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + descripcionItem = ""; + ordenItem = 0; + } + else + { + nuevoElemento = false; + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar coste variable"; + } + else + { + tituloPopup = "Nuevo coste variable"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoCostesVariables = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FactorCompleEnum.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FactorCompleEnum.razor new file mode 100644 index 0000000..74a517e --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FactorCompleEnum.razor @@ -0,0 +1,323 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
+
+

Al crear un nuevo factor se añadirá automaticamente el "factor medio (0%) por seguridad"

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

+ +
+ + + + + @context.ValorAlfabetico1 + + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoPeriodos { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "FACCOMP"; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + descripcionItem = ""; + ordenItem = 0; + } + else + { + nuevoElemento = false; + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar factor complejidad"; + } + else + { + tituloPopup = "Nuevo factor complejidad"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + try + { + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + bd.SaveChanges(); + factorescorreccion fc = new factorescorreccion(); + fc.idEnumeracion = itemSeleccionado.idEnumeracion; + fc.Descripcion = itemSeleccionado.ValorAlfabetico1 + "Medio (0%)"; + fc.Coeficiente = 0; + UtilidadesCASA.crearFactorCorrecion(bd, fc); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + }catch(Exception ex) + { + string error = ex.Message; + } + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem)}) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FactorRendiEnum.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FactorRendiEnum.razor new file mode 100644 index 0000000..d12e8ce --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FactorRendiEnum.razor @@ -0,0 +1,325 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
+
+

Al crear un nuevo factor se añadirá automaticamente el "factor medio (0%) por seguridad"

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

+ +
+ + + + + @context.ValorAlfabetico1 + + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoPeriodos { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "FACREND"; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + ordenItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar factor rendimiento"; + } + else + { + tituloPopup = "Nuevo factor rendimiento"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + try + { + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + bd.SaveChanges(); + factorescorreccion fc = new factorescorreccion(); + fc.idEnumeracion = itemSeleccionado.idEnumeracion; + fc.Descripcion = itemSeleccionado.ValorAlfabetico1 + "Medio (0%)"; + fc.Coeficiente = 0; + UtilidadesCASA.crearFactorCorrecion(bd, fc); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + catch (Exception ex) + { + string error = ex.Message; + } + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem)}) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FasesConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FasesConf.razor new file mode 100644 index 0000000..fb314f9 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/FasesConf.razor @@ -0,0 +1,425 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(valorNumericoItem))
+ +
+ + + +
+
@GetExternalValidationMessage(nameof(plazosItem))
+
+ +
+
+ + + +
+
+ + +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + + @context.ValorNumerico1 + + + + @context.ValorNumerico2 + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoFases { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private double? valorNumericoOriginal; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + private double? valorNumericoItem = 0; + private double? plazosItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "FASES"; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoFases = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + valorNumericoOriginal = objeto.ValorNumerico1; + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + + descripcionItem = ""; + ordenItem = 0; + valorNumericoItem = 0; + plazosItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + valorNumericoItem = objeto.ValorNumerico1; + plazosItem = objeto.ValorNumerico2; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar fase"; + } + else + { + tituloPopup = "Nueva fase"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(valorNumericoItem): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + valorNumericoItem = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + case nameof(plazosItem): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + plazosItem = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(valorNumericoItem) && valorNumericoItem == null) + { + messageStore?.Add(field, "El valor numérico no puede estar vacío."); + } + + editContext?.NotifyValidationStateChanged(); + } + + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = valorNumericoItem }, nameof(valorNumericoItem)); + ValidarYActualizar(new ChangeEventArgs { Value = plazosItem }, nameof(plazosItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + itemSeleccionado.ValorNumerico1 = valorNumericoItem; + itemSeleccionado.ValorNumerico2 = plazosItem; + + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoFases = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + bool porcentajeMenosCien = comprobarPorcentaje(); + + if (porcentajeMenosCien) + { + await GestionarDatos(accion); + } + else + { + await cerrarPopupGestionDatos(); + itemSeleccionado.ValorNumerico1 = valorNumericoOriginal; + await InvokeAsync(StateHasChanged); + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"El porcentaje total no puede ser mayor de 100.", + }); + + } + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(valorNumericoItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + + + private bool comprobarPorcentaje() + { + bool menorCien = false; + + var porcentajeTotal = listadoFases.Sum(x => x.ValorNumerico1); + + if (!nuevoElemento) + { + if (porcentajeTotal <= 100) + { + menorCien = true; + } + } + else + { + if (porcentajeTotal + valorNumericoItem <= 100) + { + menorCien = true; + } + } + + + return menorCien; + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/IntervencionesConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/IntervencionesConf.razor new file mode 100644 index 0000000..e6c232a --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/IntervencionesConf.razor @@ -0,0 +1,347 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(valorNumericoItem))
+
+ +
+
+ + + +
+
+ +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + + @context.ValorNumerico1 + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoPeriodos { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + private double? valorNumericoItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "INTERVENCION"; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + valorNumericoItem = 0; + ordenItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.ValorAlfabetico1; + valorNumericoItem = objeto.ValorNumerico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar intervención"; + } + else + { + tituloPopup = "Nueva intervención"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(valorNumericoItem): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + valorNumericoItem = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(valorNumericoItem) && valorNumericoItem == null) + { + messageStore?.Add(field, "El valor numérico no puede estar vacío."); + } + + editContext?.NotifyValidationStateChanged(); + } + + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = valorNumericoItem }, nameof(valorNumericoItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.ValorNumerico1 = valorNumericoItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(valorNumericoItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/OtrosTrabajosConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/OtrosTrabajosConf.razor new file mode 100644 index 0000000..d58e410 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/OtrosTrabajosConf.razor @@ -0,0 +1,308 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+
+
+ + + +
+
+ +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoOtrosTrabajos { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "OTROSTRAB"; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoOtrosTrabajos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + ordenItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar trabajo"; + } + else + { + tituloPopup = "Nuevo trabajo"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoOtrosTrabajos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem ) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/PeriodosConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/PeriodosConf.razor new file mode 100644 index 0000000..88adc69 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/PeriodosConf.razor @@ -0,0 +1,345 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(valorNumericoItem))
+
+
+
+ + + +
+
+ +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + + @context.ValorNumerico1 + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoPeriodos { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + private double? valorNumericoItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "PERIODOS"; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + ordenItem = 0; + valorNumericoItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + valorNumericoItem = objeto.ValorNumerico1; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar periodo"; + } + else + { + tituloPopup = "Nuevo periodo"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(valorNumericoItem): + + if (!string.IsNullOrEmpty(value)) + { + string parseado = value.Replace(",","."); + valorNumericoItem = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(valorNumericoItem) && valorNumericoItem == null) + { + messageStore?.Add(field, "El valor numérico no puede estar vacío."); + } + + editContext?.NotifyValidationStateChanged(); + } + + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = valorNumericoItem }, nameof(valorNumericoItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + itemSeleccionado.ValorNumerico1 = valorNumericoItem ; + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoPeriodos = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(valorNumericoItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/PuestosTrabajoConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/PuestosTrabajoConf.razor new file mode 100644 index 0000000..744820a --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/EnumeracionesTabs/PuestosTrabajoConf.razor @@ -0,0 +1,307 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+
+
+ + + +
+
+ +
+ + + + +
+
+ + + +
+ +
+

+ +
+ + + + + @context.ValorAlfabetico1 + + + @context.Orden + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoPuestosTrabajo { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private int? ordenItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private string codigoEnumeracion = "PUESTOTRABAJO"; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoPuestosTrabajo = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + descripcionItem = ""; + ordenItem = 0; + } + else + { + nuevoElemento = false; + descripcionItem = objeto.ValorAlfabetico1; + ordenItem = objeto.Orden; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar puesto trabajo"; + } + else + { + tituloPopup = "Nuevo puesto trabajo"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var enumObtenido = bd.enumeraciones.Where(x => x.idEnumeracion == itemSeleccionado.idEnumeracion).FirstOrDefault(); + + itemSeleccionado.ValorAlfabetico1 = descripcionItem; + itemSeleccionado.Orden = ordenItem; + + switch (accion) + { + case "update": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento, enumObtenido); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.guardarEnumeracion(bd, itemSeleccionado, codigoEnumeracion, nuevoElemento); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarEnumeracion(bd, enumObtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoPuestosTrabajo = UtilidadesCASA.devolverListadoOrdenadoEnumeracion(bd, codigoEnumeracion); + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(enumeraciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccion.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccion.razor new file mode 100644 index 0000000..bd6b2b4 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccion.razor @@ -0,0 +1,35 @@ +@page "/FactoresCorreccion" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@rendermode InteractiveServer +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + +
+ + + +
+ +
+
+
+ + + +
+ +
+
+
+
+
+ + + + +@code { + +} diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccionTabs/FactoresCompleConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccionTabs/FactoresCompleConf.razor new file mode 100644 index 0000000..deb2e55 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccionTabs/FactoresCompleConf.razor @@ -0,0 +1,425 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@rendermode InteractiveServer + +@using BlazorBootstrap +@using System.Globalization +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + + + + + +
+ Nota: Si es el ùltimo factor de complejidad se borrara tambien su enumerado +

+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(coeficienteItem))
+
+
+
+ + + @foreach (var grupoTipologia in listadoComplejidad) + { + + } + +
@GetExternalValidationMessage(nameof(idCompleItem))
+
+
+
+ + + + +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + + + + + @context.idEnumeracionNavigation.ValorAlfabetico1 + + + + @context.Descripcion + + + + @context.Coeficiente + + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoFactoresComplejidad { get; set; } = new List(); + public List listadoFactoresComplejidadAux { get; set; } = new List(); + + [SupplyParameterFromForm] + private factorescorreccion itemSeleccionado { get; set; } = new factorescorreccion(); + + private string tituloPopup = ""; + public string Filter { get; set; } = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private double coeficienteItem = 0; + private int idCompleItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private List listadoComplejidad { get; set; } = new List(); + private string tipoFactorComplejidad = "FACCOMP."; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoComplejidad = bd.enumeraciones.Where(x => x.Codigo.Contains(tipoFactorComplejidad)).ToList(); + + listadoFactoresComplejidad = bd.factorescorreccion.Include(x => x.idEnumeracionNavigation).Where(x => x.idEnumeracionNavigation.Codigo.Contains(tipoFactorComplejidad)).OrderBy(x=> x.idEnumeracionNavigation.Orden).ToList(); + listadoFactoresComplejidadAux = listadoFactoresComplejidad; + } + + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoFactoresComplejidad = new List(); + foreach (bdHerramientaCACOA.db.factorescorreccion item in listadoFactoresComplejidadAux) + { + if (IsVisible(item) == true) + { + listadoFactoresComplejidad.Add(item); + } + } + } + + public bool IsVisible(bdHerramientaCACOA.db.factorescorreccion listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.idEnumeracionNavigation != null && listado.idEnumeracionNavigation.ValorAlfabetico1.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (listado.Descripcion.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + + if (listado.Coeficiente.ToString().Contains(Filter, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return false; + } + + + private async Task abrirPopupGestionDatos(factorescorreccion objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + coeficienteItem = 0; + idCompleItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.Descripcion; + coeficienteItem = objeto.Coeficiente; + idCompleItem = objeto.idEnumeracion; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar factor complejidad"; + } + else + { + tituloPopup = "Nuevo factor complejidad"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(coeficienteItem): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + coeficienteItem = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + + case nameof(idCompleItem): + + if (!string.IsNullOrEmpty(value)) + { + + idCompleItem = int.Parse(value); + } + else + { + idCompleItem = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(coeficienteItem) && coeficienteItem == null) + { + messageStore?.Add(field, "El coeficiente no puede estar vacío."); + } + + if (fieldName == nameof(idCompleItem) && idCompleItem == 0) + { + messageStore?.Add(field, "Seleccione una complejidad."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = coeficienteItem }, nameof(coeficienteItem)); + ValidarYActualizar(new ChangeEventArgs { Value = idCompleItem }, nameof(idCompleItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var factorbtenido = bd.factorescorreccion.Where(x => x.idFactorCorreccion == itemSeleccionado.idFactorCorreccion).FirstOrDefault(); + + itemSeleccionado.Descripcion = descripcionItem; + itemSeleccionado.Coeficiente = coeficienteItem; + itemSeleccionado.idEnumeracion = idCompleItem; + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarFactorCorrecion(bd, factorbtenido, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.crearFactorCorrecion(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarFactorCorrecion(bd, factorbtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoFactoresComplejidad = bd.factorescorreccion.Include(x => x.idEnumeracionNavigation).Where(x => x.idEnumeracionNavigation.Codigo.Contains(tipoFactorComplejidad)).OrderBy(x => x.idEnumeracionNavigation.Orden).ToList(); + listadoFactoresComplejidadAux = listadoFactoresComplejidad; + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(factorescorreccion objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(coeficienteItem), nameof(idCompleItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(factorescorreccion).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccionTabs/FactoresRendiConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccionTabs/FactoresRendiConf.razor new file mode 100644 index 0000000..6528de7 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/FactoresCorreccionTabs/FactoresRendiConf.razor @@ -0,0 +1,421 @@ +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@rendermode InteractiveServer +@using BlazorBootstrap +@using System.Globalization +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(coeficienteItem))
+
+
+
+ + + @foreach (var grupoTipologia in listadoRendimiento) + { + + } + +
@GetExternalValidationMessage(nameof(idRendiItem))
+
+
+
+ + + + +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + + + + @context.idEnumeracionNavigation.ValorAlfabetico1 + + + + @context.Descripcion + + + + @context.Coeficiente + + + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoFactoresRendimiento { get; set; } = new List(); + public List listadoFactoresRendimientoAux { get; set; } = new List(); + + [SupplyParameterFromForm] + private factorescorreccion itemSeleccionado { get; set; } = new factorescorreccion(); + + private string tituloPopup = ""; + public string Filter { get; set; } = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private double coeficienteItem = 0; + private int idRendiItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private List listadoRendimiento { get; set; } = new List(); + private string tipoFactorComplejidad = "FACREND."; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoRendimiento = bd.enumeraciones.Where(x => x.Codigo.Contains(tipoFactorComplejidad)).OrderBy(x=>x.Orden).ToList(); + + listadoFactoresRendimiento = bd.factorescorreccion.Include(x => x.idEnumeracionNavigation).Where(x => x.idEnumeracionNavigation.Codigo.Contains(tipoFactorComplejidad)).OrderBy(x=> x.idEnumeracionNavigation.Orden).ToList(); + listadoFactoresRendimientoAux = listadoFactoresRendimiento; + } + + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoFactoresRendimiento = new List(); + foreach (bdHerramientaCACOA.db.factorescorreccion item in listadoFactoresRendimientoAux) + { + if (IsVisible(item) == true) + { + listadoFactoresRendimiento.Add(item); + } + } + } + + public bool IsVisible(bdHerramientaCACOA.db.factorescorreccion listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.idEnumeracionNavigation != null && listado.idEnumeracionNavigation.ValorAlfabetico1.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (listado.Descripcion.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + + if (listado.Coeficiente.ToString().Contains(Filter, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return false; + } + + private async Task abrirPopupGestionDatos(factorescorreccion objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + coeficienteItem = 0; + idRendiItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.Descripcion; + coeficienteItem = objeto.Coeficiente; + idRendiItem = objeto.idEnumeracion; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar factor rendimiento"; + } + else + { + tituloPopup = "Nuevo factor rendimiento"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(coeficienteItem): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + coeficienteItem = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + + case nameof(idRendiItem): + + if (!string.IsNullOrEmpty(value)) + { + + idRendiItem = int.Parse(value); + } + else + { + idRendiItem = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(coeficienteItem) && coeficienteItem == null) + { + messageStore?.Add(field, "El coeficiente no puede estar vacío."); + } + + if (fieldName == nameof(idRendiItem) && idRendiItem == 0) + { + messageStore?.Add(field, "Seleccione un rendimiento."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = coeficienteItem }, nameof(coeficienteItem)); + ValidarYActualizar(new ChangeEventArgs { Value = idRendiItem }, nameof(idRendiItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var factorbtenido = bd.factorescorreccion.Where(x => x.idFactorCorreccion == itemSeleccionado.idFactorCorreccion).FirstOrDefault(); + + itemSeleccionado.Descripcion = descripcionItem; + itemSeleccionado.Coeficiente = coeficienteItem; + itemSeleccionado.idEnumeracion = idRendiItem; + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarFactorCorrecion(bd, factorbtenido, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.crearFactorCorrecion(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarFactorCorrecion(bd, factorbtenido); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoFactoresRendimiento = bd.factorescorreccion.Include(x => x.idEnumeracionNavigation).Where(x => x.idEnumeracionNavigation.Codigo.Contains(tipoFactorComplejidad)).OrderBy(x => x.idEnumeracionNavigation.Orden).ToList(); + listadoFactoresRendimientoAux = listadoFactoresRendimiento; + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(factorescorreccion objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(coeficienteItem), nameof(idRendiItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(factorescorreccion).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/PanelControlConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/PanelControlConf.razor new file mode 100644 index 0000000..e8cfb21 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/PanelControlConf.razor @@ -0,0 +1,57 @@ +@page "/PanelControlConf" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap + + + + + + +@code { + +} diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/TipologiasConf.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/TipologiasConf.razor new file mode 100644 index 0000000..6c5d490 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/TipologiasConf.razor @@ -0,0 +1,421 @@ +@page "/TipologiasConf" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+ +
+
+ + + +
+
@GetExternalValidationMessage(nameof(coeficienteItem))
+
+
+
+ + + @foreach (var grupoTipologia in listadoGrupos) + { + + } + +
@GetExternalValidationMessage(nameof(idGrupoItem))
+
+
+
+ + + + +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + + + + + @context.Descripcion + + + + @context.CoeficienteUso + + + + @context.idGrupoTipNavigation.ValorAlfabetico1 + + + +
+ + + + + + +
+
+
+
+
+ +@code { + + public List listadoTipologias { get; set; } = new List(); + public List listadoTipologiasAux { get; set; } = new List(); + + [SupplyParameterFromForm] + private tipologias itemSeleccionado { get; set; } = new tipologias(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + public string Filter { get; set; } = ""; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private double coeficienteItem = 0; + private int idGrupoItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + private List listadoGrupos { get; set; } = new List(); + private string tipoFactorComplejidad = "GRUPTIP."; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoGrupos = bd.enumeraciones.Where(x => x.Codigo.Contains(tipoFactorComplejidad)).ToList(); + + listadoTipologias = bd.tipologias.Include(x => x.idGrupoTipNavigation).Where(x => x.idGrupoTipNavigation.Codigo.Contains(tipoFactorComplejidad)).ToList(); + listadoTipologiasAux = listadoTipologias; + } + + + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoTipologias = new List(); + foreach (bdHerramientaCACOA.db.tipologias item in listadoTipologiasAux) + { + if (IsVisible(item) == true) + { + listadoTipologias.Add(item); + } + } + } + + public bool IsVisible(bdHerramientaCACOA.db.tipologias listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.CoeficienteUso.ToString().ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (listado.Descripcion.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + + if (listado.idGrupoTipNavigation.ValorAlfabetico1.ToString().ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return false; + } + + private async Task abrirPopupGestionDatos(tipologias objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + + descripcionItem = ""; + coeficienteItem = 0; + idGrupoItem = 0; + } + else + { + nuevoElemento = false; + + descripcionItem = objeto.Descripcion; + coeficienteItem = objeto.CoeficienteUso; + idGrupoItem = objeto.idGrupoTip; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar tipología"; + } + else + { + tituloPopup = "Nueva tipología"; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(coeficienteItem): + + if (!string.IsNullOrEmpty(value)) + { + + coeficienteItem = double.Parse(value, CultureInfo.InvariantCulture); + } + + break; + + case nameof(idGrupoItem): + + if (!string.IsNullOrEmpty(value)) + { + + idGrupoItem = int.Parse(value); + } + else + { + idGrupoItem = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(coeficienteItem) && coeficienteItem == 0) + { + messageStore?.Add(field, "El coeficiente no puede estar vacío."); + } + + if (fieldName == nameof(idGrupoItem) && idGrupoItem == 0) + { + messageStore?.Add(field, "Seleccione un grupo."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = coeficienteItem }, nameof(coeficienteItem)); + ValidarYActualizar(new ChangeEventArgs { Value = idGrupoItem }, nameof(idGrupoItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private async Task GestionarDatos(string accion) + { + + var tipologiaObtenida = bd.tipologias.Where(x => x.idtipologia == itemSeleccionado.idtipologia).FirstOrDefault(); + + itemSeleccionado.Descripcion = descripcionItem; + itemSeleccionado.CoeficienteUso = coeficienteItem; + itemSeleccionado.idGrupoTip = idGrupoItem; + + switch (accion) + { + case "update": + UtilidadesCASA.actualizarTipologias(bd, tipologiaObtenida, itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + UtilidadesCASA.crearTipologia(bd, itemSeleccionado); + + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + UtilidadesCASA.eliminarTipologia(bd, tipologiaObtenida); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + bd.SaveChanges(); + listadoTipologias = bd.tipologias.Include(x => x.idGrupoTipNavigation).Where(x => x.idGrupoTipNavigation.Codigo.Contains(tipoFactorComplejidad)).ToList(); + listadoTipologiasAux = listadoTipologias; + await InvokeAsync(StateHasChanged); + } + + + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(tipologias objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + await GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(coeficienteItem), nameof(idGrupoItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(tipologias).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/ConfiguracionPages/Variables.razor b/HerramientaCASA/Components/Pages/ConfiguracionPages/Variables.razor new file mode 100644 index 0000000..09b7071 --- /dev/null +++ b/HerramientaCASA/Components/Pages/ConfiguracionPages/Variables.razor @@ -0,0 +1,286 @@ +@page "/Variables" +@inject NavigationManager Navigation +@layout ConfiguracionLayout +@using BlazorBootstrap +@using System.Globalization +@using bdHerramientaCACOA.db + + + + + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(descripcionItem))
+
+
+
+ + + +
+
@GetExternalValidationMessage(nameof(valorNumericoItem))
+
+
+ + + + +
+
+
+

Variables

+ +
+
+ +
+ + + + + @context.ValorAlfabetico1 + + + + @context.ValorNumerico1 + + + +
+ + + +
+
+
+
+
+
+ +@code { + + public List listadoVariables { get; set; } = new List(); + public List listadoVariablesAux { get; set; } = new List(); + + [SupplyParameterFromForm] + private enumeraciones itemSeleccionado { get; set; } = new enumeraciones(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + public string Filter { get; set; } = ""; + + private bool nuevoElemento; + + private string descripcionItem = ""; + private double? valorNumericoItem = 0; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + public tsHerramientasCACOA bd; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listadoVariables = bd.enumeraciones.Where(x=>x.Codigo.Contains("VARCASA.") && !x.Codigo.Contains("CONCOL")).ToList(); + listadoVariablesAux = listadoVariables; + } + + private void AplicarFiltros() + { + // Filtra la lista en función de los criterios ingresados + listadoVariables = new List(); + foreach (bdHerramientaCACOA.db.enumeraciones item in listadoVariablesAux) + { + if (IsVisible(item) == true) + { + listadoVariables.Add(item); + } + } + } + + public bool IsVisible(bdHerramientaCACOA.db.enumeraciones listado) + { + if (string.IsNullOrEmpty(Filter)) + { + return true; + } + + if (listado.ValorAlfabetico1.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (listado.ValorNumerico1.ToString().Contains(Filter, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + return false; + } + + + private async Task abrirPopupGestionDatos(enumeraciones objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (!nuevoElemento) + { + tituloPopup = "Modificar variable"; + descripcionItem = objeto.Descripcion; + valorNumericoItem = objeto.ValorNumerico1; + } + + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(descripcionItem): + if (!string.IsNullOrEmpty(value)) + { + + descripcionItem = value; + } + else + { + descripcionItem = ""; + } + break; + + case nameof(valorNumericoItem): + + if (!string.IsNullOrEmpty(value)) + { + string parseado = value.Replace(",", "."); + valorNumericoItem = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(descripcionItem) && descripcionItem == "") + { + messageStore?.Add(field, "La descripción no puede estar vacía."); + } + + if (fieldName == nameof(valorNumericoItem) && valorNumericoItem == null) + { + messageStore?.Add(field, "El valor numérico no puede estar vacío."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem)); + ValidarYActualizar(new ChangeEventArgs { Value = valorNumericoItem }, nameof(valorNumericoItem)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + private void guardar() + { + var variableObtenida = bd.enumeraciones.Where(x=> x.idEnumeracion == itemSeleccionado.idEnumeracion).First(); + + variableObtenida.ValorAlfabetico1 = descripcionItem; + variableObtenida.ValorNumerico1 = valorNumericoItem; + variableObtenida.Descripcion = descripcionItem.ToUpper(); + bd.enumeraciones.Update(variableObtenida); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + + bd.SaveChanges(); + + cerrarPopupGestionDatos(); + } + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + guardar(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(descripcionItem), nameof(valorNumericoItem) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/Error.razor b/HerramientaCASA/Components/Pages/Error.razor new file mode 100644 index 0000000..576cc2d --- /dev/null +++ b/HerramientaCASA/Components/Pages/Error.razor @@ -0,0 +1,36 @@ +@page "/Error" +@using System.Diagnostics + +Error + +

Error.

+

An error occurred while processing your request.

+ +@if (ShowRequestId) +{ +

+ Request ID: @RequestId +

+} + +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+ +@code{ + [CascadingParameter] + private HttpContext? HttpContext { get; set; } + + private string? RequestId { get; set; } + private bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + protected override void OnInitialized() => + RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier; +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASAS.razor b/HerramientaCASA/Components/Pages/HerramientaCASAS.razor new file mode 100644 index 0000000..e0b2d14 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASAS.razor @@ -0,0 +1,269 @@ +@page "/HerramientaCASAS" +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using System.Text.Json +@using System.Text +@using bdHerramientaCACOA.db +@using Newtonsoft.Json +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore +@rendermode InteractiveServer +@inject NavigationManager Navigation + + +

+ @TextoSuperior +

+@if (!actualizado) +{ +
+ Esta simulación utiliza valores desactualizados. ¿Quiere Realizar una copia actualizada? + +
+} + + +
+ + @if (TituloBoton == "Guardar") + { +

Se va a guardar esta nueva simulación podrá acceder a ella para consultarla y editarla desde el apartado Mis Simulaciones

+ } + else + { +

Se van a sobrescribir los datos de la simulación actual con los cambios realizados, esta opción no puede deshacerse.

¿Desea continuar?

+ } +
+
+ + + + +
+
+
+ + Nombre de la simulación: + +
+ + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+
+ + +@code { + [Parameter] + public string? idSimulador { get; set; } = ""; + + public string TextoSuperior = "Nueva simulación CASA de Edificación"; + public string TituloBoton = "Guardar"; + private Modal popupGuardar = default!; + + public bool actualizado = true; + string nombreOriginal = ""; + + public tsHerramientasCACOA bd; + public bdHerramientaCACOA.CASA casa = new CASA(); + List mensajes = new List(); + + private int idUser = 0; + + protected override async Task OnInitializedAsync() + { + try + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + + + if (string.IsNullOrEmpty(idSimulador)) + { + try + { + + // if (!string.IsNullOrEmpty(idClonado)) + // { + // string idDesencriptado = tsUtilidades.crypt.FEncS(idClonado, + // "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + // "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + // -875421649); + + // var byteFichero = bd.ficheros.Where(x => x.idFichero == int.Parse(idDesencriptado)).First().Fichero; + + // string CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + // var casaCopiada = System.Text.Json.JsonSerializer.Deserialize(CASAJson); + + // casa = new bdHerramientaCACOA.CASA(); + // casa.RellenarCamposExtra(bd); + // casa.DespachoProfesional = casaCopiada.DespachoProfesional; + // } + // else + // { + casa = new bdHerramientaCACOA.CASA(); + casa.RellenarCamposExtra(bd); + // } + + } + catch (Exception ex) + { + + var a = ex.Message; + } + } + else + { + + var fechaActVar = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD").Fecha1; + string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + -875421649); + + simulaciones simu = bd.simulaciones.Where(x => x.idSimulacion == int.Parse(idDesencriptado)).First(); + int idFicheroJSON = simu.idFicheroJSON; + idSimulador = idDesencriptado; + var byteFichero = bd.ficheros.Where(x => x.idFichero == idFicheroJSON).First().Fichero; + + string CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + casa = System.Text.Json.JsonSerializer.Deserialize(CASAJson); + + if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion==null && simu.FechaCreacion("idUsuario"); + idUser = obtenerID.Value; + } + catch (Exception ex) + { + Console.WriteLine($"Error durante la inicialización: {ex.Message}"); + } + } + private void guardarCasa() + { + int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.CASA)).idEnumeracion; + + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(casa); + + if (string.IsNullOrEmpty( idSimulador)) + { + if (bd.simulaciones.Any(x => x.Descripcion == casa.NombreSimulacion && x.idTipoSimulacion == idtipoSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + crearSimulacion(jsonObjeto); + } + } + else + { + var listadoSimulacionesExistentes = bd.simulaciones.Where(x => x.Descripcion != nombreOriginal && x.idTipoSimulacion == idtipoSimulacion).ToList(); + + if (listadoSimulacionesExistentes.Any(x => x.Descripcion == casa.NombreSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + actualizarSimulacion(jsonObjeto); + } + } + } + + private void crearSimulacion(string jsonObjeto) + { + int idSimulacionCreada = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.CASA, jsonObjeto, casa.NombreSimulacion, "casa.json", idUser); + string link = "/HerramientaCASAS?idSimulador=" + tsUtilidades.crypt.FEncS(idSimulacionCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Simulación creada correctamente.", + }); + + Navigation.NavigateTo(link, true); + } + private void actualizarSimulacion(string jsonObjeto) + { + UtilidadesCASA.actualziarObjeto(bd, jsonObjeto, casa.NombreSimulacion, idSimulador); + cerrarPopupGuardar(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Simulación actualizada correctamente.", + }); + } + + private void clonarCASA() + { + casa.RellenarCamposExtra(bd); + casa.CalcularFinales(); + casa.CalcularHorasTPE(); + casa.NombreSimulacion = casa.NombreSimulacion + " (Act:" + DateTime.Now + ")"; + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(casa); + var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.CASA, jsonObjeto, casa.NombreSimulacion, "casa.json", idUser); + + var link = "/HerramientaCASAS?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + + Navigation.NavigateTo(link, true); + } + + public void RefreshState() + { + this.StateHasChanged(); + } + + private async Task abrirPopupGuardar() + { + await popupGuardar.ShowAsync(); + } + private async Task cerrarPopupGuardar() + { + await popupGuardar.HideAsync(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccion.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccion.razor new file mode 100644 index 0000000..22a8947 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccion.razor @@ -0,0 +1,37 @@ +@page "/CostesProduccion" +
+
Euros/Hora
+ + + + +
+
Horas
+ + + + +
+
Euros
+ + + +
+ +@code { + + [Parameter] + public bdHerramientaCACOA.CASA objetoCASA { get; set; } = new bdHerramientaCACOA.CASA(); + + public tsHerramientasCACOA bd; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + } + public void RefreshState() + { + this.StateHasChanged(); + } + +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/CostesTrabajo.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/CostesTrabajo.razor new file mode 100644 index 0000000..4ff0028 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/CostesTrabajo.razor @@ -0,0 +1,118 @@ +@using System.Globalization +@using HerramientaCASA.Components.Pages.Comun + + +
+
+
+ Costes Asociados a los Servicios de Arquitectura +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Concepto

COSTES DE PRODUCCIÓN DEL TRABAJO PROFESIONAL

@objetoCASA.CostesProduccion.CostesProduccionTrabProf.MilesYDecimales() €

Beneficio (antes de impuestos)

+
+ % +
+
+ PRECIO DEL TRABAJO PROFESIONAL: @objetoCASA.CostesProduccion.PrecioTrabProf.MilesYDecimales() € +
+ +
+
+
+ + + + +
+ +
+ + + + + + + +
+ PRECIO DEL ENCARGO: @objetoCASA.CostesProduccion.PrecioDelEncargo.MilesYDecimales() € +
+
+
+
+ + +@code { + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + List listOtrosTrabajos = new List(); + private bool esCalcular = true; + private bool esPorcentajeCostes = false; + + private double porcentajeCostes; + private double sumaTotal; + private bool editarElemento; + + [SupplyParameterFromForm] + private CASA.OtrosTrabajos itemSeleccionado { get; set; } = new CASA.OtrosTrabajos(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + + private EditContext editContext; + + + List mensajes = new List(); + + [CascadingParameter] + public CostesProduccion _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listOtrosTrabajos = objetoCASA.CostesProduccion.OtrosTrabajos.ToList(); + } + + private async void BeneficioCambiado(double e) + { + objetoCASA.CostesProduccion.Beneficio = e; + objetoCASA.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + public void RefreshState() + { + this.StateHasChanged(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/CostesVariables.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/CostesVariables.razor new file mode 100644 index 0000000..8e1d825 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/CostesVariables.razor @@ -0,0 +1,530 @@ +@using System.Globalization + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+ + + @foreach (var grupoTipologia in objetoCASA.Enumerados.ListaCostesVariables) + { + + } + +
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idCoste))
+
+ +
+
+ +
+ € +
+
+
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.Coste))
+
+ + +
+ + + + +
+
+ +
+
+ Costes variables +
+
+ + + + + @if (esPorcentajeCostes) + { +

+ % +

+ } +
+
+ + @if (esCalcular) + { +
+ + + + + @context.Denominacion + + + @context.Coste.MilesYDecimales() € + + +
+ + + + + + +
+ +
+
+
+ + + + + + +
+ +
+
+ +
+
+ Total costes variables: @objetoCASA.CostesProduccion.TotalCostesVariables.MilesYDecimales() € +
+
+
+
+ } + +
+
+
+ Coste hora Despacho Profesional +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tipo de costesCoste/hora
Costes directos@objetoCASA.DespachoProfesional.CostesDirectos.MilesYDecimales() €/hora
Costes indirectos@objetoCASA.DespachoProfesional.TasaCostesIndirectos.MilesYDecimales() €/hora
Costes variables@objetoCASA.CostesProduccion.CostesVariables.MilesYDecimales() €/hora
+
+ Total Coste hora Despacho Profesional: @objetoCASA.CostesProduccion.TotalCostes.MilesYDecimales() €/hora +
+
+
+ +
+
+ +
+ Coste hora Externalización +
+
+ + + + + + + + + + + + + + + + + + +
ExternalizaciónPorcentaje
Incremento por externalización +
+ % +
+
+ Coste hora Externalización: @objetoCASA.CostesProduccion.CosteHoraExternalizacion.MilesYDecimales() €/hora +
+
+ +
+
+ + + + +@code { + + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + List listCostesVariables = new List(); + + private bool esCalcular = true; + private bool esPorcentajeCostes = false; + + private double porcentajeCostes; + private bool editarElemento; + + [SupplyParameterFromForm] + private CASA.CosteVariable itemSeleccionado { get; set; } = new CASA.CosteVariable(); + + private CASA.CosteVariable itemSeleccionadoTemporal { get; set; } = new CASA.CosteVariable(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + + private EditContext editContext; + + + List mensajes = new List(); + + [CascadingParameter] + public CostesProduccion _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + listCostesVariables = objetoCASA.CostesProduccion.ListaCostesVariables.ToList(); + + porcentajeCostes = objetoCASA.CostesProduccion.porcentaje; + esCalcular = objetoCASA.CostesProduccion.EsCalculado; + + if (!esCalcular) + { + esPorcentajeCostes = true; + } + } + + private void porcentajeCambiado(double porcentajeCostesCambiado) + { + porcentajeCostes = porcentajeCostesCambiado; + objetoCASA.CostesProduccion.porcentaje = porcentajeCostes; + esPorcentajeCostesChanged(true); + } + + private async void CosteExtCambiado(double e) + { + objetoCASA.CostesProduccion.CoeficienteCostesExternalizacion = e; + objetoCASA.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private async void esCalcularChanged(bool res) + { + esCalcular = res; + esPorcentajeCostes = !res; + objetoCASA.CostesProduccion.EsCalculado = res; + + objetoCASA.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + + } + private async void esPorcentajeCostesChanged(bool res) + { + esPorcentajeCostes = res; + esCalcular = !res; + objetoCASA.CostesProduccion.EsCalculado = !res; + + objetoCASA.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + + } + + private async void CosteVariableCambiado(double e, CASA.CosteVariable objeto) + { + objeto.Coste = (int)e; + objetoCASA.ActualizarCostesVariables(objeto); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + + + + private async Task GestionarDatos(string accion) + { + + switch (accion) + { + case "update": + rellenarItem(); + + itemSeleccionado.Denominacion = objetoCASA.Enumerados.ListaCostesVariables.First(x => x.idEnumeracion == itemSeleccionado.idCoste).ValorAlfabetico1; + objetoCASA.ActualizarCostesVariables(itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + rellenarItem(); + + itemSeleccionado.Denominacion = objetoCASA.Enumerados.ListaCostesVariables.First(x => x.idEnumeracion == itemSeleccionado.idCoste).ValorAlfabetico1; + objetoCASA.InsertarCostesVariables(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoCASA.EliminarCostesVariables(itemSeleccionado); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + listCostesVariables = objetoCASA.CostesProduccion.ListaCostesVariables.ToList(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + + private async Task abrirPopupGestionDatos(CASA.CosteVariable objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + itemSeleccionadoTemporal = new CASA.CosteVariable(); + } + else + { + nuevoElemento = false; + itemSeleccionadoTemporal = new CASA.CosteVariable() + { + Coste = objeto.Coste, + Denominacion = objeto.Denominacion, + idCoste = objeto.idCoste + }; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar Coste Variable"; + } + else + { + tituloPopup = "Nuevo Coste Variable"; + } + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionadoTemporal.Coste): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + itemSeleccionadoTemporal.Coste = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + case nameof(itemSeleccionadoTemporal.idCoste): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionadoTemporal.idCoste = int.Parse(value); + } + else + { + itemSeleccionadoTemporal.idCoste = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(itemSeleccionadoTemporal.Coste) && itemSeleccionadoTemporal.Coste <= 0) + { + messageStore?.Add(field, "El coste debe ser mayor que 0."); + } + + if (fieldName == nameof(itemSeleccionadoTemporal.idCoste) && itemSeleccionadoTemporal.idCoste == 0) + { + messageStore?.Add(field, "Seleccione un coste."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.Coste }, nameof(itemSeleccionadoTemporal.Coste)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idCoste }, nameof(itemSeleccionadoTemporal.idCoste)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(itemSeleccionadoTemporal.Coste), nameof(itemSeleccionadoTemporal.idCoste) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.CosteVariable).GetProperty(field)?.GetValue(itemSeleccionadoTemporal) }, field); + } + } + + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.CosteVariable objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + + + + private void rellenarItem() + { + itemSeleccionado.idCoste = itemSeleccionadoTemporal.idCoste; + itemSeleccionado.Coste = itemSeleccionadoTemporal.Coste; + itemSeleccionado.Denominacion = itemSeleccionadoTemporal.Denominacion; + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/HorasCostes.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/HorasCostes.razor new file mode 100644 index 0000000..646502a --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/CostesProduccionComponents/HorasCostes.razor @@ -0,0 +1,155 @@ +@using System.Globalization +
+
+ +
+ + + + + + @* @if (objetoCASA.CostesProduccion.IncrementoUrgencia > 0) + { + + + + } *@ + +
Plazo de presentación de la documentación: +
+ + +
+
+ Incremento por urgencia del @objetoCASA.CostesProduccion.IncrementoUrgencia% en el coste de producción de la documentación +
+
+ @if (objetoCASA.CostesProduccion.IncrementoUrgencia > 0) + { + + } +
+
+
+ +
+
+
+ Trabajo profesional +
+ @* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TrabajosHoras
Horas elaboración documentación@objetoCASA.TrabajoProfesional.HorasTPEDocumentacion.MilesYDecimales() h
HORAS ANUALES DE PRODUCCIÓN@objetoCASA.DespachoProfesional.HorasTotalesProduccion.MilesYDecimales() h
Nº Horas a completar mediante externalización@objetoCASA.CostesProduccion.NumHorasMinimoExt.MilesYDecimales() h
Horas de dirección de obra@objetoCASA.TrabajoProfesional.HorasTPEDireccion.MilesYDecimales() h
Horas de producción en este plazo@objetoCASA.CostesProduccion.HorasProduccionDespachoElabDocumentacion.MilesYDecimales() h
HORAS TRABAJO PROFESIONAL (fases encargadas)@objetoCASA.TrabajoProfesional.HorasTPE.MilesYDecimales() h
*@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TrabajosHoras
Horas elaboración documentación@objetoCASA.TrabajoProfesional.HorasTPEDocumentacion.MilesYDecimales() h
Horas de documentación en Despacho Profesional@objetoCASA.CostesProduccion.HorasProduccionDespachoElabDocumentacion.MilesYDecimales() h
Horas de documentación mediante externalización@objetoCASA.CostesProduccion.NumHorasMinimoExt.MilesYDecimales() h
Horas de dirección de obra@objetoCASA.TrabajoProfesional.HorasTPEDireccion.MilesYDecimales() h
HORAS TRABAJO PROFESIONAL@objetoCASA.TrabajoProfesional.HorasTPE.MilesYDecimales() h
+
+ +
+
+ +@code { + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + [CascadingParameter] + public CostesProduccion _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + + } + private async void PlazoPresentacionDocumentosCambiado(double e) + { + objetoCASA.CostesProduccion.PlazoPresentacionDocumentos = e; + + objetoCASA.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private void controlarMeses(string meses) + { + + + if (double.TryParse(meses, out var valor)) + { + string parseado = meses.ToString().Replace(",", "."); + objetoCASA.CostesProduccion.PlazoPresentacionDocumentos = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + PlazoPresentacionDocumentosCambiado(objetoCASA.CostesProduccion.PlazoPresentacionDocumentos); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesional.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesional.razor new file mode 100644 index 0000000..2f317fb --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesional.razor @@ -0,0 +1,121 @@ +@page "/DespachoProfesional" +@using HerramientaCASA.Components.Pages.Comun +@using HerramientaCASA.Components.Pages.HerramientaCASATabs.DespachoProfesionalComponents +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA +@using bdHerramientaCACOA.db +@inject NavigationManager Navigation +@inject UserState UserState + +
+ + + +
+ +
+
+
+
+ + + +
+
+
+ + + + + + + + + + + + + +
Coste/Hora Despacho profesional: + @objetoCASA.DespachoProfesional.CosteHoraDespachoProfesional.MilesYDecimales() €/h +
Costes directos + @objetoCASA.DespachoProfesional.CostesDirectos.MilesYDecimales() €/h +
Costes indirectos + @objetoCASA.DespachoProfesional.TasaCostesIndirectos.MilesYDecimales() €/h +
+
+
+ +
+
+ + + +
+
+
+ +@code { + [Parameter] + public bdHerramientaCACOA.CASA objetoCASA { get; set; } + + [Parameter] + public string? idSimulador { get; set; } = ""; + + private int idFicheroObtenido = 0; + + public tsHerramientasCACOA bd; + + public ClonarDespachoVM datosClonar = new ClonarDespachoVM(); + + protected override async Task OnInitializedAsync() + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + + string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + -875421649); + + datosClonar.despachoProf = objetoCASA.DespachoProfesional; + datosClonar.idSimulacion = !string.IsNullOrEmpty(idDesencriptado) ? int.Parse(idDesencriptado) : 0; + } + + public void RefreshState() + { + this.StateHasChanged(); + } + + public void hacerCalculos() + { + objetoCASA.CalcularFinales(); + StateHasChanged(); + } + + // private void clonarDespacho() + // { + // var byteFichero = bd.ficheros.First(x=> x.idFichero == idFicheroObtenido).Fichero; + + // string CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + // var casaCopiada = System.Text.Json.JsonSerializer.Deserialize(CASAJson); + + + // objetoCASA.DespachoProfesional = casaCopiada.DespachoProfesional; + // objetoCASA.CalcularFinales(); + + // StateHasChanged(); + // // Navigation.NavigateTo("/HerramientaCASAS?idClonado=" + tsUtilidades.crypt.FEncS(idFicheroObtenido.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649), true); + // } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/CosteIndirectoGrid.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/CosteIndirectoGrid.razor new file mode 100644 index 0000000..7d42698 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/CosteIndirectoGrid.razor @@ -0,0 +1,164 @@ +@using BlazorBootstrap +@using bdHerramientaCACOA.db + + + +
+
Costes Indirectos Anuales
+ +
+
+ + + + + @context.Concepto + + +
+ € +
+
+ + @* @if (context != itemSeleccionado) + { + @listadoPeriodos.FirstOrDefault(p => p.idEnumeracion == context.idPeriodicidad)?.ValorAlfabetico1 + } + else + { *@ + + @foreach (var periodo in listadoPeriodos) + { + + } + + @* } *@ + + + @context.coste.ToString("C", new System.Globalization.CultureInfo("es-ES")) + +
+
+ + + + + + +
+ Total Costes Indirectos: + @objetoCASA.DespachoProfesional.TotalCostesIndirectos.MilesYDecimales() € + +
+
+@code { + [Parameter] + public CASA objetoCASA { get; set; } + + public List costesIndirectos { get; set; } = new List(); + private CASA.CosteIndirecto itemSeleccionado = new CASA.CosteIndirecto(); + + Grid grid = default!; + + private List listadoPeriodos = new List(); + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + + private bool editarElemento; + public tsHerramientasCACOA bd; + + List mensajes = new List(); + + + [CascadingParameter] + public DespachoProfesional _Parent { get; set; } + + [CascadingParameter] + public HerramientaCASA.Components.Pages.HerramientaURBANTabs.DespachoProfesionalURBAN _OtroParent { get; set; } + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + listadoPeriodos = objetoCASA.Enumerados.Periodos.ToList(); + //costesIndirectos = objetoCASA.DespachoProfesional.CostesIndirectos.ToList(); + + } + + protected override void OnParametersSet() + { + costesIndirectos = objetoCASA.DespachoProfesional.CostesIndirectos.ToList(); + + StateHasChanged(); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + private async void valorCambiado(double e,CASA.CosteIndirecto objeto) + { + + if (objeto.idPeriodicidad != 0) + { + objeto.importe = (double)e; + objetoCASA.ActualizarCosteIndirecto(objeto); + + await InvokeAsync(StateHasChanged); + refrescarPadre(); + + + } + } + private async void valorCICambiado(int e, CASA.CosteIndirecto objeto) + { + objeto.idPeriodicidad = (int)e; + objetoCASA.ActualizarCosteIndirecto(objeto); + + await InvokeAsync(StateHasChanged); + refrescarPadre(); + + } + + private async void guardar(CASA.CosteIndirecto objeto) + { + objetoCASA.ActualizarCosteIndirecto(objeto); + + // mensajes.Add(new ToastMessage + // { + // Type = ToastType.Primary, + // Message = $"Guardado correctamente.", + // }); + + costesIndirectos = objetoCASA.DespachoProfesional.CostesIndirectos.ToList(); + await InvokeAsync(StateHasChanged); + refrescarPadre(); + } + + private void limpiarDatos(CASA.CosteIndirecto objeto) + { + objetoCASA.LimpiarCosteIndirecto(objeto); + } + + + private void refrescarPadre() + { + if (_Parent != null) + { + _Parent.RefreshState(); + } + else if (_OtroParent != null) + { + _OtroParent.RefreshState(); + } + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/CostesPersonalGrid.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/CostesPersonalGrid.razor new file mode 100644 index 0000000..d5ef07d --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/CostesPersonalGrid.razor @@ -0,0 +1,318 @@ +@using BlazorBootstrap + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + +
+
+ + + +
+
+ + + @foreach (var puesTrab in objetoCASA.Enumerados.ListaPuestosTrabajo) + { + + } + +
@GetExternalValidationMessage(nameof(itemSeleccionado.idCategoriaProfesional))
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + + + +
+
+
+
Calcular Costes de Personal del Despacho Profesional
+ +
+ + + + + + @context.DenominacionGrupo + + + @objetoCASA.Enumerados.ListaPuestosTrabajo?.FirstOrDefault(x => x.idEnumeracion == context.idCategoriaProfesional)?.ValorAlfabetico1 + + + @context.TotalDevengado + + + @context.Complementos + + + @context.segSocialEmpresa + + + @context.numPagasAnuales + + + @context.HorasJornadaLaboral + + + @context.CosteAnualIndividual + + + @context.HorasAnuales + + + @context.PorcentajeProduccion + + + @context.PorcentajeAdministración + + + @context.HorasProduccion + + + + + + + + + + + + +@code { + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + public List GrupoTrab { get; set; } = new List(); + private CASA.GrupoTrabajador itemSeleccionado = new CASA.GrupoTrabajador(); + private bool nuevoElemento; + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + GrupoTrab = objetoCASA.DespachoProfesional.CostesPersonal.GrupoTrabajadores; + } + + private async Task GestionarDatos(string accion) + { + switch (accion) + { + case "update": + objetoCASA.ActualizarGrupoTrabajador(itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + break; + + case "create": + objetoCASA.InsertarGrupoTrabajador(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoCASA.EliminarGrupoTrabajo(itemSeleccionado); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + GrupoTrab = objetoCASA.DespachoProfesional.CostesPersonal.GrupoTrabajadores.ToList(); + await InvokeAsync(StateHasChanged); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + + private async Task abrirPopupGestionDatos(CASA.GrupoTrabajador objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + } + else + { + nuevoElemento = false; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar Grupo"; + } + else + { + tituloPopup = "Nuevo Grupo"; + objeto.DenominacionGrupo = "Arquitecto"; + objeto.numPagasAnuales = 14; + objeto.HorasJornadaLaboral = 40; + objeto.PorcentajeProduccion = 80; + } + StateHasChanged(); + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.GrupoTrabajador objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionado.idCategoriaProfesional): + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.idCategoriaProfesional = int.Parse(value); + } + else + { + itemSeleccionado.idCategoriaProfesional = 0; + } + break; + } + + messageStore?.Clear(field); + + if (fieldName == nameof(itemSeleccionado.idCategoriaProfesional) && itemSeleccionado.idCategoriaProfesional == null || itemSeleccionado.idCategoriaProfesional == 0) + { + messageStore?.Add(field, "Seleccione una categoría."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.idCategoriaProfesional }, nameof(itemSeleccionado.idCategoriaProfesional)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionado, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(itemSeleccionado.idCategoriaProfesional)}) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.UsosTipologia).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/TrabajadorGrid.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/TrabajadorGrid.razor new file mode 100644 index 0000000..82a3e33 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/DespachoProfesionalComponents/TrabajadorGrid.razor @@ -0,0 +1,332 @@ +@using BlazorBootstrap +@using System.Text.RegularExpressions + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + +
+
+ + + + + @foreach (var grupo in grupos) + { + +
+
+
+
+ +
+ € +
+
+ +
+ +
+ h/sem +
+
+
+
+ +
+ +
+ + % +
+
+ +
+ + + +
+
+
+ + + @if (!nuevoElemento) + { + + } + else + { + + } + +
+ +
+
Costes Directos Anuales del Personal
+
+
+ + + + + @context.Nombre + + + @context.CosteAnual.MilesYDecimales() € + + + @context.JornadaLaboral.MilesYDecimales() h + + + @context.PorcentajeProduccion % + + + @context.NumTrabajadores + + + @context.CosteAnualTotal.MilesYDecimales() € + + + @context.HorasProduccion.MilesYDecimales() h + + +
+ + + + + + +
+ +
+
+
+ + + + + + +
+
+
+ +
+
+ Total Coste Anual: @objetoCASA.DespachoProfesional.CostesDirectosAnuales.MilesYDecimales() €
+ Total Horas Producción: @objetoCASA.DespachoProfesional.HorasTotalesProduccion.MilesYDecimales() h +
+
+ +
+
+ +@code { + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + public List Trabajadores { get; set; } = new List(); + + private CASA.Trabajador itemSeleccionado = new CASA.Trabajador(); + private CASA.Trabajador itemSeleccionadoTemporal = new CASA.Trabajador(); + + private List grupos = new() +{ + "Arquitecto/a", + "Arquitecto/a técnico/a", + "Delineante", + "Administrativo/a" +}; + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private string tituloInfo = ""; + + private bool nuevoElemento; + + List mensajes = new List(); + + [CascadingParameter] + public DespachoProfesional _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + tituloInfo = "Es el porcentaje de tiempo que el empleado destina a la producción del trabajo profesional concreto, dedicando el resto del tiempo a otras tareas del despacho."; + } + + protected override void OnParametersSet() + { + + Trabajadores = objetoCASA.DespachoProfesional.Trabajadores; + + StateHasChanged(); + } + + private void EvitarDecimalesPorcentaje(ChangeEventArgs e) + { + var input = e?.Value?.ToString(); + + if (double.TryParse(input, out var valor)) + { + itemSeleccionadoTemporal.PorcentajeProduccion = Math.Round(valor, 0, MidpointRounding.AwayFromZero); + } + } + + private void EvitarDecimalesTrabajores(ChangeEventArgs e) + { + var input = e?.Value?.ToString(); + + if (double.TryParse(input, out var valor)) + { + itemSeleccionadoTemporal.NumTrabajadores = Math.Round(valor, 0, MidpointRounding.AwayFromZero); + } + } + + private async Task GestionarDatos(string accion) + { + rellenarItem(); + + switch (accion) + { + case "update": + objetoCASA.ActualizarTrabajador(itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + objetoCASA.InsertarTrabajador(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoCASA.EliminarTrabajador(itemSeleccionado); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + Trabajadores = objetoCASA.DespachoProfesional.Trabajadores.ToList(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + + private async Task abrirPopupGestionDatos(CASA.Trabajador objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + } + else + { + nuevoElemento = false; + itemSeleccionadoTemporal = new CASA.Trabajador() + + { + CosteAnual = objeto.CosteAnual, + CosteAnualTotal = objeto.CosteAnualTotal, + HorasProduccion = objeto.HorasProduccion, + IdTrabajador = objeto.IdTrabajador, + JornadaLaboral = objeto.JornadaLaboral, + Nombre = objeto.Nombre, + NumTrabajadores = objeto.NumTrabajadores, + PorcentajeProduccion = objeto.PorcentajeProduccion + }; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar grupo de trabajadores"; + } + else + { + itemSeleccionadoTemporal = new CASA.Trabajador(); + tituloPopup = "Nuevo grupo de trabajadores"; + itemSeleccionadoTemporal.Nombre = "Arquitecto"; + itemSeleccionadoTemporal.JornadaLaboral = 40; + itemSeleccionadoTemporal.PorcentajeProduccion = 80; + itemSeleccionadoTemporal.NumTrabajadores = 1; + } + + StateHasChanged(); + await popupGestionDatos.ShowAsync(); + } + + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.Trabajador objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + private void rellenarItem() + { + itemSeleccionado.CosteAnual = itemSeleccionadoTemporal.CosteAnual; + itemSeleccionado.CosteAnualTotal = itemSeleccionadoTemporal.CosteAnualTotal; + itemSeleccionado.HorasProduccion = itemSeleccionadoTemporal.HorasProduccion; + itemSeleccionado.IdTrabajador = itemSeleccionadoTemporal.IdTrabajador; + itemSeleccionado.JornadaLaboral = itemSeleccionadoTemporal.JornadaLaboral; + itemSeleccionado.Nombre = itemSeleccionadoTemporal.Nombre; + itemSeleccionado.NumTrabajadores = itemSeleccionadoTemporal.NumTrabajadores; + itemSeleccionado.PorcentajeProduccion = itemSeleccionadoTemporal.PorcentajeProduccion; + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesional.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesional.razor new file mode 100644 index 0000000..2267b46 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesional.razor @@ -0,0 +1,134 @@ +@page "/TrabajoProfesional" +@rendermode InteractiveServer +@inject NavigationManager Navigation +@using HerramientaCASA.Components.Pages.HerramientaCASATabs.TrabajoProfesionalComponents +@using Microsoft.AspNetCore.WebUtilities + +
+
+ + +
+ @if (modificarTabla) + { +
+ + + +
+
+ + + + + + + +
+
+
+ + + + + @* + + *@ +
+
+ } + @if (modificarHoras) + { +
+ + + + + + + +
+ + } +
+ + + +@code { + [Parameter] + public bdHerramientaCACOA.CASA objetoCASA { get; set; } = new CASA(); + + public bool modificarTabla = true; + public bool modificarHoras = false; + public tsHerramientasCACOA bd; + public double horasTPEOriginal = 0; + + public double ultimaHoraDocumentacion = 0; + public double ultimaHoraObra = 0; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + modificarTabla = objetoCASA.TrabajoProfesional.EsPorUsos; + + if (!modificarTabla) + { + modificarHorasChanged(true); + } + } + public void RefreshState() + { + this.StateHasChanged(); + } + + public async void calcularModificarHora() + { + ultimaHoraDocumentacion = objetoCASA.TrabajoProfesional.HorasTPEDocumentacion; + ultimaHoraObra = objetoCASA.TrabajoProfesional.HorasTPEDireccion; + + objetoCASA.CalcularHorasTPEManual(objetoCASA.TrabajoProfesional.HorasTPEDocumentacion, objetoCASA.TrabajoProfesional.HorasTPEDireccion); + horasTPEOriginal = objetoCASA.TrabajoProfesional.HorasTPE; + RefreshState(); + } + + + public void restablecerHoras() + { + objetoCASA.TrabajoProfesional.HorasTPEDocumentacion= ultimaHoraDocumentacion; + objetoCASA.TrabajoProfesional.HorasTPEDireccion = ultimaHoraObra; + + objetoCASA.CalcularHorasTPEManual(objetoCASA.TrabajoProfesional.HorasTPEDocumentacion, objetoCASA.TrabajoProfesional.HorasTPEDireccion); + horasTPEOriginal = objetoCASA.TrabajoProfesional.HorasTPE; + RefreshState(); + } + + private async void modificarTablaChanged(bool res) + { + objetoCASA.TrabajoProfesional.HorasTPE = 0; + objetoCASA.TrabajoProfesional.HorasTPEDocumentacion = 0; + objetoCASA.TrabajoProfesional.HorasTPEDireccion = 0; + + if (objetoCASA.TrabajoProfesional.Usos.ToList().Count() != 0) + { + objetoCASA.CalcularHorasTPE(); + } + + modificarTabla = res; + modificarHoras = !res; + objetoCASA.TrabajoProfesional.EsPorUsos = true; + await InvokeAsync(StateHasChanged); + } + private async void modificarHorasChanged(bool res) + { + horasTPEOriginal = objetoCASA.TrabajoProfesional.HorasTPE; + ultimaHoraDocumentacion = objetoCASA.TrabajoProfesional.HorasTPEDocumentacion; + ultimaHoraObra = objetoCASA.TrabajoProfesional.HorasTPEDireccion; + + + modificarHoras = res; + modificarTabla = !res; + objetoCASA.TrabajoProfesional.EsPorUsos = false; + await InvokeAsync(StateHasChanged); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/CoeficientesCorrectoresGrid.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/CoeficientesCorrectoresGrid.razor new file mode 100644 index 0000000..3ef6315 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/CoeficientesCorrectoresGrid.razor @@ -0,0 +1,127 @@ +@using BlazorBootstrap +@using bdHerramientaCACOA.db + + + + + +
+
+
+
Coeficientes correctores por Complejidad
+
+ + + + + @context.Nombre + + + + @foreach (var factor in objetoCASA.Enumerados.FactoresCorreccionPorGrupo(@context.idTipoFactor)) + { + + } + + + + + + +
+ +
+
+
Coeficientes correctores por Rendimiento
+
+ + + + + @context.Nombre + + + + @foreach (var factor in objetoCASA.Enumerados.FactoresCorreccionPorGrupo(@context.idTipoFactor)) + { + + } + + + + +
+
+ + +@code { + [CascadingParameter] + public TrabajoProfesional _Parent { get; set; } + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + private bool desactivarSelects; + + public List listadoFactoresComplejidad { get; set; } = new List(); + public List listadoFactoresRendimiento { get; set; } = new List(); + + private List listFactoresComplejidad = new List(); + private List listFactoresRendimiento = new List(); + + private CASA.CoeficientesCorrectores itemSeleccionado = new CASA.CoeficientesCorrectores(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + List mensajes = new List(); + + protected override async Task OnInitializedAsync() + { + + listadoFactoresComplejidad = objetoCASA.TrabajoProfesional.FactoresComplejidad; + listadoFactoresRendimiento = objetoCASA.TrabajoProfesional.FactoresRendimiento; + } + + private async Task GestionarDatos(string accion) + { + await InvokeAsync(StateHasChanged); + } + + private async void valorFCCambiado(int e, CASA.CoeficientesCorrectores objeto) + { + objeto.idCorrecion = (int)e; + objetoCASA.ActualizarFactorComplejidad(objeto); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private async void valorFRCambiado(int e, CASA.CoeficientesCorrectores objeto) + { + objeto.idCorrecion = (int)e; + objetoCASA.ActualizarFactorRendimiento(objeto); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/FasesTrabajoProfesionalGrid.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/FasesTrabajoProfesionalGrid.razor new file mode 100644 index 0000000..365354f --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/FasesTrabajoProfesionalGrid.razor @@ -0,0 +1,178 @@ +@using BlazorBootstrap +@using bdHerramientaCACOA.db + + + +
+
Fases
+
+ +
+
+
+ + + + + @context.Denominacion + + +
+ % +
+ +
+
+
+ + + + + + +
+ +
+
+ +
+
+ @if (totalPorcentaje != 100) + { +
+ Trabajo en misión parcial: @totalPorcentaje % +
+ } + else + { +
+ Total: @totalPorcentaje % +
+ } +
+
+ +
+
+ +@code { + [CascadingParameter] + public TrabajoProfesional _Parent { get; set; } + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + private double totalPorcentaje = 0; + + + public List listadoFases { get; set; } = new List(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private CASA.FasesTrabajo itemSeleccionado = new CASA.FasesTrabajo(); + + + List mensajes = new List(); + + protected override async Task OnInitializedAsync() + { + listadoFases = objetoCASA.TrabajoProfesional.FasesTrabajo.ToList(); + + totalPorcentaje = objetoCASA.TrabajoProfesional.FasesTrabajo.Sum(x => x.Porcentaje); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + private async void porcentajeCambiado(double e, CASA.FasesTrabajo objeto) + { + + double porcentajeTotal = calcularPorcentaje(e, objeto); + + if (porcentajeTotal <= 100) + { + objeto.Porcentaje = (double)e; + + if (objetoCASA.TrabajoProfesional.EsPorUsos) + { + objetoCASA.ActualizarFase(objeto); + } + else + { + objetoCASA.ActualizarFaseCalculo(_Parent.horasTPEOriginal); + } + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + else + { + + objeto.Porcentaje = 0; + objetoCASA.ActualizarFase(objeto); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"La suma de los porcentajes no puede ser mayor de 100.", + }); + } + totalPorcentaje = objetoCASA.TrabajoProfesional.FasesTrabajo.Sum(x => x.Porcentaje); + } + + private double calcularPorcentaje(double e, CASA.FasesTrabajo objeto) + { + double porcentajeTotal = 0; + objeto.Porcentaje = e; + + int indice = objetoCASA.TrabajoProfesional.FasesTrabajo + .FindIndex(x => x.idFase == objeto.idFase); + + if (indice >= 0) + { + objetoCASA.TrabajoProfesional.FasesTrabajo[indice] = objeto; + } + + porcentajeTotal = objetoCASA.TrabajoProfesional.FasesTrabajo.Sum(x => x.Porcentaje); + + return porcentajeTotal; + } + + private async void restablecerValores() + { + for (int i = 0; i < objetoCASA.Enumerados.FasesTrabajoOriginal.ToList().Count; i++) + { + objetoCASA.TrabajoProfesional.FasesTrabajo[i].Porcentaje = objetoCASA.Enumerados.FasesTrabajoOriginal.ToList()[i].Porcentaje; + } + if(objetoCASA.TrabajoProfesional.EsPorUsos){ + // if (objetoCASA.TrabajoProfesional.HorasTPE != 0 && objetoCASA.TrabajoProfesional.HorasTPEDocumentacion != 0 && objetoCASA.TrabajoProfesional.HorasTPEDireccion != 0) + // { + // objetoCASA.CalcularHorasTPE(); + // } + objetoCASA.CalcularHorasTPE(); + } + else + { + // if (objetoCASA.TrabajoProfesional.HorasTPE != 0 && objetoCASA.TrabajoProfesional.HorasTPEDocumentacion != 0 && objetoCASA.TrabajoProfesional.HorasTPEDireccion != 0) + // { + // } + _Parent.restablecerHoras(); + } + + totalPorcentaje = objetoCASA.CalcularTotalFases(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/TablaHorasGrid.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/TablaHorasGrid.razor new file mode 100644 index 0000000..0822f1f --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/TablaHorasGrid.razor @@ -0,0 +1,71 @@ +
+
+ + + + + + + + + + + + + + +
Horas Trabajo Profesional Edificación: + @if (!_Parent.modificarHoras) + { + + @objetoCASA.TrabajoProfesional.TotalHorasTPE.MilesYDecimales() h + + } + else + { + + @objetoCASA.TrabajoProfesional.HorasTPE.MilesYDecimales() h + + } +
Horas TPE Documentacion + + @if (!_Parent.modificarHoras) + { + + @objetoCASA.TrabajoProfesional.HorasTPEDocumentacion.MilesYDecimales() h + + } + else + { +
+ h +
+ } +
Horas TPE Dirección de obra + + @if (!_Parent.modificarHoras) + { + + @objetoCASA.TrabajoProfesional.HorasTPEDireccion.MilesYDecimales() h + + } + else + { +
+ h +
+ } +
+
+
+ + +@code { + [CascadingParameter] + public TrabajoProfesional _Parent { get; set; } + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + // private string estiloTabla => _Parent.modificarHoras == true ? "" : ""; + +} diff --git a/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/UsosTipologiaGrid.razor b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/UsosTipologiaGrid.razor new file mode 100644 index 0000000..4e8d093 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaCASATabs/TrabajoProfesionalComponents/UsosTipologiaGrid.razor @@ -0,0 +1,443 @@ +@using System.Globalization + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + +
+
+ + + +
+
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.superficie))
+
+ +
+ + + @foreach (var grupoTipologia in objetoCASA.Enumerados.GruposTipologias) + { + + } + +
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idGrupoTipologia))
+
+ +
+ + + @foreach (var tipologia in tipologiasAux) + { + + } + +
+ +
+ + + @foreach (var intervencion in intervencionesAux) + { + + } + +
+
+ + + + +
+
+ + +
+
Usos/Tipología
+
+ +
+ + + + + + + @context.superficie.MilesYDecimales() + + + + + @objetoCASA.Enumerados.GruposTipologias?.FirstOrDefault(x => x.idEnumeracion == context.idGrupoTipologia)?.ValorAlfabetico1 + + + + @objetoCASA.Enumerados.Tipologias?.FirstOrDefault(x => x.idTipologia == context.idTipologia)?.Descripcion + + + + @objetoCASA.Enumerados.Intervenciones?.FirstOrDefault(x => x.idEnumeracion == context.idTipoIntervencion)?.ValorAlfabetico1 + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + +
+ +
+
+ +
+
+ Total superficie: + @UsosTipologias.Sum(x => x.superficie).MilesYDecimales() + +
+
+
+
+ +@code { + [CascadingParameter] + public TrabajoProfesional _Parent { get; set; } + [Parameter] + public CASA objetoCASA { get; set; } = new CASA(); + + public List UsosTipologias { get; set; } = new List(); + private List tipologiasAux = new List(); + private List intervencionesAux = new List(); + + + [SupplyParameterFromForm] + private CASA.UsosTipologia itemSeleccionado { get; set; } = new CASA.UsosTipologia(); + + private CASA.UsosTipologia itemSeleccionadoTemporal { get; set; } = new CASA.UsosTipologia(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + + private EditContext editContext; + + + List mensajes = new List(); + + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + UsosTipologias = objetoCASA.TrabajoProfesional.Usos.ToList(); + //tipologiasAux = objetoCASA.Enumerados.Tipologias.ToList(); + } + + private async Task GestionarDatos(string accion) + { + try{ + rellenarItem(); + switch (accion) + { + case "update": + objetoCASA.ActualizarUso(itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + objetoCASA.InsertarUso(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoCASA.EliminarUso(itemSeleccionado); + + + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + UsosTipologias = objetoCASA.TrabajoProfesional.Usos.ToList(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + catch (Exception ex) + { + var a = ex; + } + + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + + private async Task abrirPopupGestionDatos(CASA.UsosTipologia objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + itemSeleccionadoTemporal = new CASA.UsosTipologia(); + + nuevoElemento = true; + } + else + { + + + itemSeleccionadoTemporal = new CASA.UsosTipologia() + { + CoefIntervencion = objeto.CoefIntervencion, + CoefTipologia = objeto.CoefTipologia, + idGrupoTipologia = objeto.idGrupoTipologia, + idTipoIntervencion = objeto.idTipoIntervencion, + idTipologia = objeto.idTipologia, + superficie = objeto.superficie, + SuperficieCoefIntervencion = objeto.SuperficieCoefIntervencion, + SuperficieCoefTipologia = objeto.SuperficieCoefTipologia + }; + + await cambiarTipologia(); + nuevoElemento = false; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar uso"; + } + else + { + tituloPopup = "Nuevo uso"; + } + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private async Task cambiarTipologia() + { + tipologiasAux = objetoCASA.Enumerados.TipologiasPorGrupo(itemSeleccionadoTemporal.idGrupoTipologia).ToList(); + + + if (itemSeleccionadoTemporal.idTipologia == 0) + { + itemSeleccionadoTemporal.idTipologia = tipologiasAux.First().idTipologia; + } + else + { + if (tipologiasAux.Any(x => x.idTipologia == itemSeleccionadoTemporal.idTipologia)) + { + itemSeleccionadoTemporal.idTipologia = itemSeleccionadoTemporal.idTipologia; + } + else + { + itemSeleccionadoTemporal.idTipologia = tipologiasAux.First().idTipologia; + } + } + + intervencionesAux = objetoCASA.Enumerados.Intervenciones.ToList(); + itemSeleccionadoTemporal.idTipoIntervencion = itemSeleccionadoTemporal.idTipoIntervencion == 0 ? intervencionesAux.First().idEnumeracion : itemSeleccionadoTemporal.idTipoIntervencion; + + await InvokeAsync(StateHasChanged); + } + + + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.UsosTipologia objeto) + { + itemSeleccionadoTemporal = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionadoTemporal.superficie): + + if (!string.IsNullOrEmpty(value)) + { + string parseado = value.Replace(",", "."); + itemSeleccionadoTemporal.superficie = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + case nameof(itemSeleccionadoTemporal.idGrupoTipologia): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionadoTemporal.idGrupoTipologia = int.Parse(value); + cambiarTipologia(); + } + else + { + itemSeleccionadoTemporal.idGrupoTipologia = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(itemSeleccionadoTemporal.superficie) && itemSeleccionadoTemporal.superficie <= 0) + { + messageStore?.Add(field, "La superficie debe ser mayor que 0."); + } + + if (fieldName == nameof(itemSeleccionadoTemporal.idGrupoTipologia) && itemSeleccionadoTemporal.idGrupoTipologia == 0) + { + messageStore?.Add(field, "Seleccione un tipo de uso."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.superficie }, nameof(itemSeleccionadoTemporal.superficie)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idGrupoTipologia }, nameof(itemSeleccionadoTemporal.idGrupoTipologia)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(itemSeleccionado.superficie), nameof(itemSeleccionado.idGrupoTipologia) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.UsosTipologia).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + + + + private void rellenarItem() + { + itemSeleccionado.CoefIntervencion = itemSeleccionadoTemporal.CoefIntervencion; + itemSeleccionado.CoefTipologia = itemSeleccionadoTemporal.CoefTipologia; + itemSeleccionado.idGrupoTipologia = itemSeleccionadoTemporal.idGrupoTipologia; + itemSeleccionado.idTipoIntervencion = itemSeleccionadoTemporal.idTipoIntervencion; + itemSeleccionado.idTipologia = itemSeleccionadoTemporal.idTipologia; + itemSeleccionado.superficie = itemSeleccionadoTemporal.superficie; + itemSeleccionado.SuperficieCoefIntervencion = itemSeleccionadoTemporal.SuperficieCoefIntervencion; + itemSeleccionado.SuperficieCoefTipologia = itemSeleccionadoTemporal.SuperficieCoefTipologia; + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBAN.razor new file mode 100644 index 0000000..512bea6 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBAN.razor @@ -0,0 +1,250 @@ +@page "/HerramientaURBAN" +@using System.Text +@using System.Text.Json +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using Newtonsoft.Json +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore +@rendermode InteractiveServer +@inject NavigationManager Navigation + + +

+ @TextoSuperior +

+@if (!actualizado) +{ +
+ Esta simulación utiliza valores desactualizados. ¿Quiere Realizar una copia actualizada? + +
+ } + + +
+ + @if (TituloBoton == "Guardar") + { +

Se va a guardar esta nueva simulación podrá acceder a ella para consultarla y editarla desde el apartado Mis Simulaciones

+ } + else + { +

Se van a sobrescribir los datos de la simulación actual con los cambios realizados, esta opción no puede deshacerse.

¿Desea continuar?

+ } +
+
+ + + + +
+ +
+
+ + Nombre de la simulación: + +
+ + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+
+ +@code { + [Parameter] + public string? idSimulador { get; set; } = ""; + public string TextoSuperior = "Nueva simulación CASA de Urbanismo"; + public string TituloBoton = "Guardar"; + private Modal popupGuardar = default!; + + public bool actualizado = true; + + public tsHerramientasCACOA bd; + private static URBAN urban; + List mensajes = new List(); + + string nombreOriginal = ""; + + private int idUser = 0; + + protected override async Task OnInitializedAsync() + { + try + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + if (string.IsNullOrEmpty(idSimulador)) + { + try + { + urban = new URBAN(); + urban.RellenarCamposExtra(bd, false); + } + catch (Exception ex) + { + var a = ex.Message; + } + } + else + { + + var fechaActVar = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD").Fecha1; + string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + -875421649); + + simulaciones simu = bd.simulaciones.Where(x => x.idSimulacion == int.Parse(idDesencriptado)).First(); + int idFicheroJSON = simu.idFicheroJSON; + idSimulador = idDesencriptado; + var byteFichero = bd.ficheros.Where(x => x.idFichero == idFicheroJSON).First().Fichero; + + string CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + urban = System.Text.Json.JsonSerializer.Deserialize(CASAJson); + + if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion == null && simu.FechaCreacion < fechaActVar)) + { + actualizado = false; + } + TextoSuperior = "Modificando simulación \"" + simu.Descripcion + "\""; + TituloBoton = "Modificar"; + + nombreOriginal = urban.NombreSimulacion; + + } + + var obtenerID = await ProtectedSessionStore.GetAsync("idUsuario"); + idUser = obtenerID.Value; + } + catch (Exception ex) + { + Console.WriteLine($"Error durante la inicialización: {ex.Message}"); + } + } + + private void guardarUrban() + { + //HACER + // para evitar loops + int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBAN)).idEnumeracion; + + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(urban); + + if (string.IsNullOrEmpty(idSimulador)) + { + if (bd.simulaciones.Any(x => x.Descripcion == urban.NombreSimulacion && x.idTipoSimulacion == idtipoSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + crearSimulacion(jsonObjeto); + } + } + else + { + var listadoSimulacionesExistentes = bd.simulaciones.Where(x => x.Descripcion != nombreOriginal && x.idTipoSimulacion == idtipoSimulacion).ToList(); + + if (listadoSimulacionesExistentes.Any(x => x.Descripcion == urban.NombreSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + actualizarSimulacion(jsonObjeto); + } + } + } + private void crearSimulacion(string jsonObjeto) + { + int idSimulacionCreada = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBAN, jsonObjeto, urban.NombreSimulacion, "urban.json", idUser); + string link = "/HerramientaURBAN?idSimulador=" + tsUtilidades.crypt.FEncS(idSimulacionCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Simulación creada correctamente.", + }); + + Navigation.NavigateTo(link, true); + } + private void actualizarSimulacion(string jsonObjeto) + { + UtilidadesCASA.actualziarObjeto(bd, jsonObjeto, urban.NombreSimulacion, idSimulador); + cerrarPopupGuardar(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Simulación actualizada correctamente.", + }); + } + + private void clonarUrban() + { + urban.RellenarCamposExtra(bd, true); + urban.CalcularFinales(); + urban.NombreSimulacion = urban.NombreSimulacion + " (Act:" + DateTime.Now + ")"; + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(urban); + var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBAN, jsonObjeto, urban.NombreSimulacion, "urban.json", idUser); + + var link = "/HerramientaURBAN?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + + Navigation.NavigateTo(link, true); + } + + + public void RefreshState() + { + this.StateHasChanged(); + } + + private async Task abrirPopupGuardar() + { + await popupGuardar.ShowAsync(); + } + private async Task cerrarPopupGuardar() + { + await popupGuardar.HideAsync(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/CosteVariableUrban.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/CosteVariableUrban.razor new file mode 100644 index 0000000..136325c --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/CosteVariableUrban.razor @@ -0,0 +1,528 @@ +@using System.Globalization +@using bdHerramientaCACOA.HerramientaURBAN + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + + +
+ + + @foreach (var grupoTipologia in objetoURBAN.Enumerados.ListaCostesVariables) + { + + } + +
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idCoste))
+
+ +
+
+ +
+ € +
+
+
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.Coste))
+
+ + +
+ + + + +
+
+ +
+
+ Costes variables +
+
+ + + + + + + @if (esPorcentajeCostes) + { +

+ % +

+ } +
+
+ + @if (esCalcular) + { +
+ + + + + @context.Denominacion + + + @context.Coste.MilesYDecimales() € + + +
+ + + + + + +
+ +
+
+
+ + + + + + +
+ +
+
+ +
+
+ Total costes variables: @objetoURBAN.CostesProduccion.TotalCostesVariables.MilesYDecimales() € +
+
+
+
+ } + +
+
+
+ Coste hora Despacho Profesional +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tipo de costesCoste/hora
Costes directos@objetoURBAN.DespachoProfesional.CostesDirectos.MilesYDecimales() €/hora
Costes indirectos@objetoURBAN.DespachoProfesional.TasaCostesIndirectos.MilesYDecimales() €/hora
Costes variables@objetoURBAN.CostesProduccion.CostesVariables.MilesYDecimales() €/hora
+ Total Coste hora Despacho Profesional: @objetoURBAN.CostesProduccion.TotalCostes.MilesYDecimales() €/hora +
+
+ +
+
+ +
+ Coste hora Externalización +
+
+ + + + + + + + + + + + + + + + + + +
ExternalizaciónPorcentaje
Incremento por externalización +
+ % +
+
+ Coste hora Externalización: @objetoURBAN.CostesProduccion.CosteHoraExternalizacion.MilesYDecimales() €/hora +
+
+ +
+
+ + + + +@code { + + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + List listCostesVariables = new List(); + + private bool esCalcular = true; + private bool esPorcentajeCostes = false; + + private double porcentajeCostes; + private bool editarElemento; + + [SupplyParameterFromForm] + private CASA.CosteVariable itemSeleccionado { get; set; } = new CASA.CosteVariable(); + + private CASA.CosteVariable itemSeleccionadoTemporal { get; set; } = new CASA.CosteVariable(); + + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + + private EditContext editContext; + + + List mensajes = new List(); + + [CascadingParameter] + public CostesProduccionURBAN _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + listCostesVariables = objetoURBAN.CostesProduccion.ListaCostesVariables.ToList(); + + porcentajeCostes = objetoURBAN.CostesProduccion.porcentaje; + esCalcular = objetoURBAN.CostesProduccion.EsCalculado; + + if (!esCalcular) + { + esPorcentajeCostes = true; + } + } + + private void porcentajeCambiado(double porcentajeCostesCambiado) + { + porcentajeCostes = porcentajeCostesCambiado; + objetoURBAN.CostesProduccion.porcentaje = porcentajeCostes; + esPorcentajeCostesChanged(true); + } + + private async void CosteExtCambiado(double e) + { + objetoURBAN.CostesProduccion.CoeficienteCostesExternalizacion = e; + objetoURBAN.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private async void esCalcularChanged(bool res) + { + esCalcular = res; + esPorcentajeCostes = !res; + objetoURBAN.CostesProduccion.EsCalculado = res; + + objetoURBAN.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + + } + private async void esPorcentajeCostesChanged(bool res) + { + esPorcentajeCostes = res; + esCalcular = !res; + objetoURBAN.CostesProduccion.EsCalculado = !res; + + objetoURBAN.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + + } + + private async void CosteVariableCambiado(double e, CASA.CosteVariable objeto) + { + objeto.Coste = (int)e; + objetoURBAN.ActualizarCostesVariables(objeto); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + + + + private async Task GestionarDatos(string accion) + { + switch (accion) + { + case "update": + rellenarItem(); + + itemSeleccionado.Denominacion = objetoURBAN.Enumerados.ListaCostesVariables.First(x => x.idEnumeracion == itemSeleccionado.idCoste).ValorAlfabetico1; + objetoURBAN.ActualizarCostesVariables(itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + rellenarItem(); + + itemSeleccionado.Denominacion = objetoURBAN.Enumerados.ListaCostesVariables.First(x => x.idEnumeracion == itemSeleccionado.idCoste).ValorAlfabetico1; + objetoURBAN.InsertarCostesVariables(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoURBAN.EliminarCostesVariables(itemSeleccionado); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + listCostesVariables = objetoURBAN.CostesProduccion.ListaCostesVariables.ToList(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + + private async Task abrirPopupGestionDatos(CASA.CosteVariable objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + itemSeleccionadoTemporal = new CASA.CosteVariable(); + } + else + { + nuevoElemento = false; + itemSeleccionadoTemporal = new CASA.CosteVariable() + { + Coste = objeto.Coste, + Denominacion = objeto.Denominacion, + idCoste = objeto.idCoste + }; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar Coste Variable"; + } + else + { + tituloPopup = "Nuevo Coste Variable"; + } + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionadoTemporal.Coste): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + itemSeleccionadoTemporal.Coste = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + case nameof(itemSeleccionadoTemporal.idCoste): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionadoTemporal.idCoste = int.Parse(value); + } + else + { + itemSeleccionadoTemporal.idCoste = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(itemSeleccionadoTemporal.Coste) && itemSeleccionadoTemporal.Coste <= 0) + { + messageStore?.Add(field, "El coste debe ser mayor que 0."); + } + + if (fieldName == nameof(itemSeleccionadoTemporal.idCoste) && itemSeleccionadoTemporal.idCoste == 0) + { + messageStore?.Add(field, "Seleccione un coste."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.Coste }, nameof(itemSeleccionadoTemporal.Coste)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idCoste }, nameof(itemSeleccionadoTemporal.idCoste)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(itemSeleccionadoTemporal.Coste), nameof(itemSeleccionadoTemporal.idCoste) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.CosteVariable).GetProperty(field)?.GetValue(itemSeleccionadoTemporal) }, field); + } + } + + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.CosteVariable objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + private void rellenarItem() + { + itemSeleccionado.idCoste = itemSeleccionadoTemporal.idCoste; + itemSeleccionado.Coste = itemSeleccionadoTemporal.Coste; + itemSeleccionado.Denominacion = itemSeleccionadoTemporal.Denominacion; + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/EurosUrban.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/EurosUrban.razor new file mode 100644 index 0000000..4318717 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/EurosUrban.razor @@ -0,0 +1,83 @@ +@using System.Globalization +@using HerramientaCASA.Components.Pages.Comun +@using bdHerramientaCACOA.HerramientaURBAN + + +
+
+
+ @* Costes Asociados a los Servicios de Arquitectura *@ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Concepto
COSTES DE PRODUCCIÓN DEL TRABAJO PROFESIONAL @objetoURBAN.CostesProduccion.CostesProduccionTrabProf.MilesYDecimales() €

Beneficio (antes de impuestos)

+
+ % +
+
+ PRECIO DEL TRABAJO PROFESIONAL: @objetoURBAN.CostesProduccion.PrecioTrabajoProfesional.MilesYDecimales() € +
+ +
+
+ + +@code { + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + private double porcentajeCostes; + private double sumaTotal; + private bool editarElemento; + + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + + [CascadingParameter] + public CostesProduccionURBAN _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + } + + private async void BeneficioCambiado(double e) + { + objetoURBAN.CostesProduccion.Beneficio = e; + objetoURBAN.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + public void RefreshState() + { + this.StateHasChanged(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/HorasCostesURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/HorasCostesURBAN.razor new file mode 100644 index 0000000..363ff10 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProducURBAN/HorasCostesURBAN.razor @@ -0,0 +1,107 @@ +@using System.Globalization +@using bdHerramientaCACOA.HerramientaURBAN +
+
+ +
+ + + + + +
Plazo de presentación de la documentación: +
+ @* meses *@ + meses +
+
+ +
+
+ +
+
+
+ Trabajo profesional +
+ + + + + + + + + + + + + + + + + + + @* + + + *@ + + + + + + +
TrabajosHoras
Horas en despacho profesional@objetoURBAN.CostesProduccion.HorasEnPlazo.MilesYDecimales() h
Horas mediante externalización@objetoURBAN.CostesProduccion.NumHorasMinimoExt.MilesYDecimales() h
Horas de producción en este plazo@objetoURBAN.CostesProduccion.HorasEnPlazo.MilesYDecimales() h
+ Total horas del trabajo profesional: @objetoURBAN.CostesProduccion.HorasTrabajoProfesional.MilesYDecimales() h +
+
+ + @*
+

Horas Trabajo profesional: @objetoURBAN.CostesProduccion.HorasTrabajoProfesional

+

Horas Anuales de produccion del desapacho profesional: @objetoURBAN.DespachoProfesional.HorasTotalesProduccion

+

Horas de produccion del despacho en ese plazo: @objetoURBAN.CostesProduccion.HorasEnPlazo

+

nº horas mínimo de externalizacion: @objetoURBAN.CostesProduccion.NumHorasMinimoExt

+
*@ + + + +
+
+ +@code { + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + [CascadingParameter] + public CostesProduccionURBAN _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + + } + private async void PlazoPresentacionDocumentosCambiado(double e) + { + objetoURBAN.CostesProduccion.PlazoPresentacionDocumentos = e; + + objetoURBAN.CalcularCostesProduccion(); + + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private void controlarMeses(string meses) + { + if (double.TryParse(meses, out var valor)) + { + string parseado = meses.ToString().Replace(",", "."); + objetoURBAN.CostesProduccion.PlazoPresentacionDocumentos = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + PlazoPresentacionDocumentosCambiado(objetoURBAN.CostesProduccion.PlazoPresentacionDocumentos); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProduccionURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProduccionURBAN.razor new file mode 100644 index 0000000..878608c --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/CostesProduccionURBAN.razor @@ -0,0 +1,37 @@ +@page "/CostesProduccionUrban" +
+
Euros/Hora
+ + + + +
+
Horas
+ + + + +
+
Euros
+ + + +
+ +@code { + + [Parameter] + public bdHerramientaCACOA.HerramientaURBAN.URBAN objetoURBAN { get; set; } = new bdHerramientaCACOA.HerramientaURBAN.URBAN(); + + public tsHerramientasCACOA bd; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + } + public void RefreshState() + { + this.StateHasChanged(); + } + +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfURBAN/CosteIndirectoGridURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfURBAN/CosteIndirectoGridURBAN.razor new file mode 100644 index 0000000..d4f2ed0 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfURBAN/CosteIndirectoGridURBAN.razor @@ -0,0 +1,165 @@ +@using BlazorBootstrap +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db + + + +
+
Costes Indirectos Anuales
+ +
+
+ + + + + @context.Concepto + + +
+ € +
+
+ + @* @if (context != itemSeleccionado) + { + @listadoPeriodos.FirstOrDefault(p => p.idEnumeracion == context.idPeriodicidad)?.ValorAlfabetico1 + } + else + { *@ + + @foreach (var periodo in listadoPeriodos) + { + + } + + @* } *@ + + + @context.coste.ToString("C", new System.Globalization.CultureInfo("es-ES")) + +
+
+ + + + + + +
+ Total Costes Indirectos: + @objetoURBAN.DespachoProfesional.TotalCostesIndirectos.MilesYDecimales() € + +
+
+@code { + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + public List costesIndirectos { get; set; } = new List(); + private CASA.CosteIndirecto itemSeleccionado = new CASA.CosteIndirecto(); + + Grid grid = default!; + + private List listadoPeriodos = new List(); + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + + private bool editarElemento; + public tsHerramientasCACOA bd; + + List mensajes = new List(); + + + [CascadingParameter] + public DespachoProfesionalURBAN _Parent { get; set; } + + // CAMBIAR POR LA OTRA PAGINA QUE LLAMA A CLONAR DESPACHO Y CAMBIAR ABAJO EN LA FUNCION + [CascadingParameter] + public HerramientaCASA.Components.Pages.HerramientaURBANTabs.DespachoProfesionalURBAN _OtroParent { get; set; } + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + listadoPeriodos = objetoURBAN.Enumerados.Periodos.ToList(); + //costesIndirectos = objetoCASA.DespachoProfesional.CostesIndirectos.ToList(); + + } + + protected override void OnParametersSet() + { + costesIndirectos = objetoURBAN.DespachoProfesional.CostesIndirectos.ToList(); + + StateHasChanged(); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + private async void valorCambiado(double e, CASA.CosteIndirecto objeto) + { + + if (objeto.idPeriodicidad != 0) + { + objeto.importe = (double)e; + objetoURBAN.ActualizarCosteIndirecto(objeto); + + await InvokeAsync(StateHasChanged); + refrescarPadre(); + + + } + } + private async void valorCICambiado(int e, CASA.CosteIndirecto objeto) + { + objeto.idPeriodicidad = (int)e; + objetoURBAN.ActualizarCosteIndirecto(objeto); + + await InvokeAsync(StateHasChanged); + refrescarPadre(); + + } + + private async void guardar(CASA.CosteIndirecto objeto) + { + objetoURBAN.ActualizarCosteIndirecto(objeto); + + // mensajes.Add(new ToastMessage + // { + // Type = ToastType.Primary, + // Message = $"Guardado correctamente.", + // }); + + costesIndirectos = objetoURBAN.DespachoProfesional.CostesIndirectos.ToList(); + await InvokeAsync(StateHasChanged); + refrescarPadre(); + } + + private void limpiarDatos(CASA.CosteIndirecto objeto) + { + objetoURBAN.LimpiarCosteIndirecto(objeto); + } + + + private void refrescarPadre() + { + if (_Parent != null) + { + _Parent.RefreshState(); + } + else if (_OtroParent != null) + { + _OtroParent.RefreshState(); + } + } +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfURBAN/TrabajadorGridURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfURBAN/TrabajadorGridURBAN.razor new file mode 100644 index 0000000..d036008 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfURBAN/TrabajadorGridURBAN.razor @@ -0,0 +1,336 @@ +@using BlazorBootstrap +@using System.Text.RegularExpressions +@using bdHerramientaCACOA.HerramientaURBAN + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + +
+
+ + + + + @foreach (var grupo in grupos) + { + +
+
+
+
+ +
+ € +
+
+ +
+ +
+ h/sem +
+
+
+
+ +
+ +
+ + % +
+
+ +
+ + + +
+
+
+ + + @if (!nuevoElemento) + { + + } + else + { + + } + +
+ +
+
Costes Directos Anuales del Personal
+
+
+ + + + + @context.Nombre + + + @context.CosteAnual.MilesYDecimales() € + + + @context.JornadaLaboral.MilesYDecimales() h + + + @context.PorcentajeProduccion % + + + @context.NumTrabajadores + + + @context.CosteAnualTotal.MilesYDecimales() € + + + @context.HorasProduccion.MilesYDecimales() h + + +
+ + + + + + +
+ +
+
+
+ + + + + + +
+
+
+ +
+
+ Total Coste Anual: @objetoURBAN.DespachoProfesional.CostesDirectosAnuales.MilesYDecimales() €
+ Total Horas Producción: @objetoURBAN.DespachoProfesional.HorasTotalesProduccion.MilesYDecimales() h +
+
+ +
+
+ +@code { + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + public List Trabajadores { get; set; } = new List(); + + private CASA.Trabajador itemSeleccionado = new CASA.Trabajador(); + private CASA.Trabajador itemSeleccionadoTemporal = new CASA.Trabajador(); + + + private List grupos = new() +{ + "Arquitecto/a", + "Arquitecto/a técnico/a", + "Delineante", + "Administrativo/a" +}; + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private string tituloInfo = ""; + + private bool nuevoElemento; + + List mensajes = new List(); + + [CascadingParameter] + public DespachoProfesionalURBAN _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + tituloInfo = "Es el porcentaje de tiempo que el empleado destina a la producción del trabajo profesional concreto, dedicando el resto del tiempo a otras tareas del despacho."; + } + + protected override void OnParametersSet() + { + + Trabajadores = objetoURBAN.DespachoProfesional.Trabajadores; + + StateHasChanged(); + } + + private void EvitarDecimalesPorcentaje(ChangeEventArgs e) + { + var input = e?.Value?.ToString(); + + if (double.TryParse(input, out var valor)) + { + itemSeleccionadoTemporal.PorcentajeProduccion = Math.Round(valor, 0, MidpointRounding.AwayFromZero); + } + } + + private void EvitarDecimalesTrabajores(ChangeEventArgs e) + { + var input = e?.Value?.ToString(); + + if (double.TryParse(input, out var valor)) + { + itemSeleccionadoTemporal.NumTrabajadores = Math.Round(valor, 0, MidpointRounding.AwayFromZero); + } + } + + private async Task GestionarDatos(string accion) + { + rellenarItem(); + + switch (accion) + { + case "update": + objetoURBAN.ActualizarTrabajador(itemSeleccionado); + + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + objetoURBAN.InsertarTrabajador(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoURBAN.EliminarTrabajador(itemSeleccionado); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + Trabajadores = objetoURBAN.DespachoProfesional.Trabajadores.ToList(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + + private async Task abrirPopupGestionDatos(CASA.Trabajador objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + } + else + { + nuevoElemento = false; + itemSeleccionadoTemporal = new CASA.Trabajador() + + { + CosteAnual = objeto.CosteAnual, + CosteAnualTotal = objeto.CosteAnualTotal, + HorasProduccion = objeto.HorasProduccion, + IdTrabajador = objeto.IdTrabajador, + JornadaLaboral = objeto.JornadaLaboral, + Nombre = objeto.Nombre, + NumTrabajadores = objeto.NumTrabajadores, + PorcentajeProduccion = objeto.PorcentajeProduccion + }; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar grupo de trabajadores"; + } + else + { + itemSeleccionadoTemporal = new CASA.Trabajador(); + tituloPopup = "Nuevo grupo de trabajadores"; + itemSeleccionadoTemporal.Nombre = "Arquitecto"; + itemSeleccionadoTemporal.JornadaLaboral = 40; + itemSeleccionadoTemporal.PorcentajeProduccion = 80; + itemSeleccionadoTemporal.NumTrabajadores = 1; + } + + StateHasChanged(); + await popupGestionDatos.ShowAsync(); + } + + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.Trabajador objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + + + private void rellenarItem() + { + itemSeleccionado.CosteAnual = itemSeleccionadoTemporal.CosteAnual; + itemSeleccionado.CosteAnualTotal = itemSeleccionadoTemporal.CosteAnualTotal; + itemSeleccionado.HorasProduccion = itemSeleccionadoTemporal.HorasProduccion; + itemSeleccionado.IdTrabajador = itemSeleccionadoTemporal.IdTrabajador; + itemSeleccionado.JornadaLaboral = itemSeleccionadoTemporal.JornadaLaboral; + itemSeleccionado.Nombre = itemSeleccionadoTemporal.Nombre; + itemSeleccionado.NumTrabajadores = itemSeleccionadoTemporal.NumTrabajadores; + itemSeleccionado.PorcentajeProduccion = itemSeleccionadoTemporal.PorcentajeProduccion; + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfesionalURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfesionalURBAN.razor new file mode 100644 index 0000000..1d5d8bd --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/DespachoProfesionalURBAN.razor @@ -0,0 +1,106 @@ +@page "/DespachoProfesionalUrban" +@using HerramientaCASA.Components.Pages.Comun +@using HerramientaCASA.Components.Pages.HerramientaCASATabs.DespachoProfesionalComponents +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db +@inject NavigationManager Navigation +@inject UserState UserState + +
+ + + +
+ +
+
+
+
+ + + +
+
+
+ + + + + + + + + + + + + +
Coste/Hora Despacho profesional: + @objetoURBAN.DespachoProfesional.CosteHoraDespachoProfesional.MilesYDecimales() €/h +
Costes directos + @objetoURBAN.DespachoProfesional.CostesDirectos.MilesYDecimales() €/h +
Costes indirectos + @objetoURBAN.DespachoProfesional.TasaCostesIndirectos.MilesYDecimales() €/h +
+
+
+ +
+
+ + + +
+
+
+ +@code { + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + [Parameter] + public string? idSimulador { get; set; } = ""; + + private int idFicheroObtenido = 0; + + public tsHerramientasCACOA bd; + + public ClonarDespachoVM datosClonar = new ClonarDespachoVM(); + + protected override async Task OnInitializedAsync() + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + + string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + -875421649); + + datosClonar.despachoProf = objetoURBAN.DespachoProfesional; + datosClonar.idSimulacion = !string.IsNullOrEmpty(idDesencriptado) ? int.Parse(idDesencriptado) : 0; + } + + public void RefreshState() + { + this.StateHasChanged(); + } + + public void hacerCalculos() + { + objetoURBAN.CalcularFinales(); + StateHasChanged(); + } +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabProfUrban.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabProfUrban.razor new file mode 100644 index 0000000..50a92a9 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabProfUrban.razor @@ -0,0 +1,42 @@ +@page "/TrabProfUrban" +@rendermode InteractiveServer +@inject NavigationManager Navigation +@using HerramientaCASA.Components.Pages.HerramientaURBANTabs.TrabajoProfURBAN +@using bdHerramientaCACOA.HerramientaURBAN + +
+
+ + + +
+
+ +
+
+ + + +
+
+ + + +
+
+ +@code { + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + public tsHerramientasCACOA bd; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + } + public void RefreshState() + { + this.StateHasChanged(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/DocumentosURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/DocumentosURBAN.razor new file mode 100644 index 0000000..97166d0 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/DocumentosURBAN.razor @@ -0,0 +1,262 @@ +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.HerramientaUrban +@using bdHerramientaCACOA.db +@using static bdHerramientaCACOA.HerramientaURBAN.URBAN + + + + +
+
+ + + @foreach (var grupoTipologia in objetoURBAN.Enumerados.TiposDeDocumentos) + { + + } + +
+
+ + + @foreach (var tipoProy in tipoProyectoAux) + { + + } + +
+
+
+
+ + + + + + @context.Descripcion + + + +
+
+ + + + + + @context.Descripcion + + +
+ +
+
+
+ +
+
+
+ + + + + @context.Descripcion + + + @if (context.esCheckbox) + { +
+ +
+ } + else + { +
+ +
+ } +
+
+
+
+
+ + + +@code { + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + private List tipoProyectoAux = new List(); + + + private URBANTrabajoProfesional itemSeleccionado = new URBANTrabajoProfesional(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private string tituloInfo = ""; + + private bool nuevoElemento; + + + List mensajes = new List(); + + [CascadingParameter] + public TrabProfUrban _Parent { get; set; } + + + protected override async Task OnInitializedAsync() + { + if (objetoURBAN.TrabajoProfesional.idTipoDocumentacion != 0) + { + itemSeleccionado.idTipoProyecto = objetoURBAN.TrabajoProfesional.idTipoProyecto; + itemSeleccionado.idTipoDocumentacion = objetoURBAN.TrabajoProfesional.idTipoDocumentacion; + cambiarSelectDocumentos(); + + // cambiarListasDocumentacion(); + objetoURBAN.ObtenerHoraTipoDocumento(); + itemSeleccionado.idInstrumento = objetoURBAN.TrabajoProfesional.idInstrumento; + } + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionado.idTipoDocumentacion): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.idTipoDocumentacion = int.Parse(value); + objetoURBAN.TrabajoProfesional.idTipoDocumentacion = itemSeleccionado.idTipoDocumentacion; + cambiarSelectDocumentos(); + cambiarListasDocumentacion(); + + calcularHoraTrabajo(); + } + else + { + itemSeleccionado.idTipoDocumentacion = 0; + objetoURBAN.TrabajoProfesional.idTipoDocumentacion = itemSeleccionado.idTipoDocumentacion; + } + + break; + case nameof(itemSeleccionado.idTipoProyecto): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.idTipoProyecto = int.Parse(value); + objetoURBAN.TrabajoProfesional.idTipoProyecto = itemSeleccionado.idTipoProyecto; + cambiarListasDocumentacion(); + calcularHoraTrabajo(); + } + else + { + itemSeleccionado.idTipoProyecto = 0; + objetoURBAN.TrabajoProfesional.idTipoProyecto = itemSeleccionado.idTipoProyecto; + } + + break; + } + + } + + + private void calcularHoraTrabajo() + { + + foreach (var datos in objetoURBAN.TrabajoProfesional.DatosNecesarios.ToList()) + { + objetoURBAN.ActualizarDatoNecesario(datos); + } + + _Parent.RefreshState(); + } + + private async Task cambiarSelectDocumentos() + { + tipoProyectoAux = objetoURBAN.Enumerados.ProyectosPorTipo(itemSeleccionado.idTipoDocumentacion); + + if (itemSeleccionado.idTipoProyecto == 0) + { + objetoURBAN.TrabajoProfesional.idTipoProyecto = tipoProyectoAux.First().idtipoproyectos; + } + else + { + if (tipoProyectoAux.Any(x => x.idtipoproyectos == itemSeleccionado.idTipoProyecto)) + { + objetoURBAN.TrabajoProfesional.idTipoProyecto = itemSeleccionado.idTipoProyecto; + } + else + { + objetoURBAN.TrabajoProfesional.idTipoProyecto = tipoProyectoAux.First().idtipoproyectos; + } + } + + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async Task cambiarListasDocumentacion() + { + objetoURBAN.TrabajoProfesional.DocumentacionMinima = objetoURBAN.DocumentacionMinima(objetoURBAN.TrabajoProfesional.idTipoProyecto); + objetoURBAN.TrabajoProfesional.DocumentacionOpcional = objetoURBAN.DocumentacionOpcional(objetoURBAN.TrabajoProfesional.idTipoProyecto); + objetoURBAN.TrabajoProfesional.DatosNecesarios = objetoURBAN.DatosNecesarios(objetoURBAN.TrabajoProfesional.idTipoProyecto); + objetoURBAN.ObtenerHoraTipoDocumento(); + //await InvokeAsync(StateHasChanged); + } + + private async void opcionalCambiado(bool e, URBAN.DocumentacionURBAN objeto) + { + + objeto.Checkeada = e; + objetoURBAN.ActualizarDocumentacionOpcional(objeto); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async void DatoNecesarioCheckeado(bool e, URBAN.DocumentacionURBAN objeto) + { + objeto.Checkeada = e; + objetoURBAN.ActualizarDatoNecesario(objeto); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async void DatoNecesarioCambiado(double e, URBAN.DocumentacionURBAN objeto) + { + objeto.ValorNecesario = (double)e; + objetoURBAN.ActualizarDatoNecesario(objeto); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/FasesURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/FasesURBAN.razor new file mode 100644 index 0000000..0f7fd79 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/FasesURBAN.razor @@ -0,0 +1,157 @@ +@using BlazorBootstrap +@using System.Text.Json +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db + + + +
+
Fases
+
+ +
+ + + + + @context.Denominacion + + +
+ % +
+ +
+
+
+ + + + + + +
+ +
+
+ +
+
+ @if (totalPorcentaje != 100) + { +
+ Trabajo en misión parcial: @totalPorcentaje % +
+ } + else + { +
+ Total: @totalPorcentaje % +
+ } +
+
+ +
+
+ +@code { + [CascadingParameter] + public TrabProfUrban _Parent { get; set; } + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + private double totalPorcentaje = 0; + + + public List listadoFases { get; set; } = new List(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private CASA.FasesTrabajo itemSeleccionado = new CASA.FasesTrabajo(); + + + List mensajes = new List(); + + protected override async Task OnInitializedAsync() + { + listadoFases = objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional.ToList(); + + totalPorcentaje = objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + private async void porcentajeCambiado(double e, URBAN.FasesURBAN objeto) + { + + double porcentajeTotal = calcularPorcentaje(e, objeto); + + if (porcentajeTotal <= 100) + { + objeto.Porcentaje = (double)e; + objetoURBAN.ActualizarFase(objeto); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + else + { + + objeto.Porcentaje = 0; + objetoURBAN.ActualizarFase(objeto); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"La suma de los porcentajes no puede ser mayor de 100.", + }); + } + totalPorcentaje = objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + } + + private double calcularPorcentaje(double e, URBAN.FasesURBAN objeto) + { + double porcentajeTotal = 0; + objeto.Porcentaje = e; + + int indice = objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional + .FindIndex(x => x.idFase == objeto.idFase); + + if (indice >= 0) + { + objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional[indice] = objeto; + } + + porcentajeTotal = objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + + return porcentajeTotal; + } + + private async void restablecerValores() + { + var lista = JsonSerializer.Deserialize>(JsonSerializer.Serialize(objetoURBAN.Enumerados.FasesTrabajo)); + objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional = lista; + + listadoFases = objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional.ToList(); + + totalPorcentaje = objetoURBAN.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + + objetoURBAN.CalcularHorasTrabajoProfesional(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } +} diff --git a/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/InstrumentosURBAN.razor b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/InstrumentosURBAN.razor new file mode 100644 index 0000000..cd86c07 --- /dev/null +++ b/HerramientaCASA/Components/Pages/HerramientaURBANTabs/TrabajoProfURBAN/InstrumentosURBAN.razor @@ -0,0 +1,134 @@ +@using BlazorBootstrap +@using System.Text.Json +@using Microsoft.AspNetCore.WebUtilities +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db +@using static bdHerramientaCACOA.CASA +@inject NavigationManager Navigation + + + +
+
Innovacion de los instrumentos
+

+ @* @if (!nuevaRedaccion) + { *@ + % + @* } + else + { + + } *@ + +

+ + @foreach (var enu in listadoInstrumentos) + { +
+ + + +
+ } + + + + + +
Horas Trabajo Profesional @objetoURBAN.TrabajoProfesional.horasTrabProfesional.MilesYDecimales() h
+ +
+ +
+
+
+ +
+ +@code { + [CascadingParameter] + public TrabProfUrban _Parent { get; set; } + [Parameter] + public URBAN objetoURBAN { get; set; } = new URBAN(); + + private bool nuevaRedaccion = false; + private enumeracionesCASA itemSeleccinado; + + public List listadoInstrumentos { get; set; } = new List(); + + private CASA.FasesTrabajo itemSeleccionado = new CASA.FasesTrabajo(); + + List mensajes = new List(); + + [Parameter] + public string? idSimulador { get; set; } = ""; + + protected override async Task OnInitializedAsync() + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + + listadoInstrumentos = objetoURBAN.Enumerados.ListaInstrumentos.ToList(); + + + if (string.IsNullOrEmpty(idSimulador)) + { + Seleccionar(listadoInstrumentos.First()); + } + else + { + Seleccionar(listadoInstrumentos.FirstOrDefault(x => x.Seleccionado == true)); + } + } + + private async void ValorModificado(double valor) + { + objetoURBAN.TrabajoProfesional.valorInstrumentos = Convert.ToDouble(valor); + objetoURBAN.TrabajoProfesional.idInstrumento = itemSeleccinado.idEnumeracion; + itemSeleccinado.ValorNumerico1 = Convert.ToDouble(valor); + + objetoURBAN.CalcularHorasTrabajoProfesional(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private async void Seleccionar(enumeracionesCASA item) + { + if (item != null) + { + if (item.Codigo.Contains("NUEVARED")) + { + nuevaRedaccion = true; + } + else + { + nuevaRedaccion = false; + } + + itemSeleccinado = item; + itemSeleccinado.Seleccionado = true; + + + + foreach (var intru in listadoInstrumentos.Where(x => x.idEnumeracion != item.idEnumeracion)) + { + intru.Seleccionado = false; + } + + objetoURBAN.TrabajoProfesional.valorInstrumentos = Convert.ToDouble(item.ValorNumerico1); + objetoURBAN.TrabajoProfesional.idInstrumento = item.idEnumeracion; + objetoURBAN.CalcularHorasTrabajoProfesional(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + } +} diff --git a/HerramientaCASA/Components/Pages/Home.razor b/HerramientaCASA/Components/Pages/Home.razor new file mode 100644 index 0000000..b158766 --- /dev/null +++ b/HerramientaCASA/Components/Pages/Home.razor @@ -0,0 +1,5 @@ +@page "/a" + +Home + +

En desarrollo

diff --git a/HerramientaCASA/Components/Pages/LicitacionUrban/CostesLicitacionUrban.razor b/HerramientaCASA/Components/Pages/LicitacionUrban/CostesLicitacionUrban.razor new file mode 100644 index 0000000..9d19168 --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionUrban/CostesLicitacionUrban.razor @@ -0,0 +1,91 @@ +@using System.Globalization +
+ +
+
+ Costes Asociados Urban +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Concepto
Plazo de presentación de la documentación: +
+ @* meses *@ + meses +
+
Coste de producción del Trabajo Profesional @objetoLicitaciones.CostesProduccionTrabProf.MilesYDecimales() €
+ G.G. + B.I.
+ (40/19 Junta Consultiva de Contratación Pública del Estado) +
+
+ @objetoLicitaciones.Beneficio % +
+
+ Precio del Trabajo objeto de la Licitación: @objetoLicitaciones.PrecioTrabProf.MilesYDecimales() € +
+ +
+ +
+ + +@code { + [Parameter] + public LICITACIONES objetoLicitaciones { get; set; } = new LICITACIONES(); + + [CascadingParameter] + public HerramientaCASA.Components.Pages.LicitacionesURBAN _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + } + + private async void PlazoPresentacionDocumentosCambiado(double e) + { + objetoLicitaciones.PlazoPresentacionDocumentos = e; + objetoLicitaciones.CalcularHorasSuperficie(); + objetoLicitaciones.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private void controlarMeses(string meses) + { + if (double.TryParse(meses, out var valor)) + { + string parseado = meses.ToString().Replace(",", "."); + objetoLicitaciones.PlazoPresentacionDocumentos = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + PlazoPresentacionDocumentosCambiado(objetoLicitaciones.PlazoPresentacionDocumentos); + } +} diff --git a/HerramientaCASA/Components/Pages/LicitacionUrban/DocumentosLicitacion.razor b/HerramientaCASA/Components/Pages/LicitacionUrban/DocumentosLicitacion.razor new file mode 100644 index 0000000..5526927 --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionUrban/DocumentosLicitacion.razor @@ -0,0 +1,291 @@ +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.HerramientaUrban +@using bdHerramientaCACOA.db +@using static bdHerramientaCACOA.HerramientaURBAN.URBAN + + + +
+
+ + + @foreach (var grupoTipologia in objetoLicitacionUrban.Enumerados.TiposDeDocumentos) + { + + } + +
+
+ + + @foreach (var tipoProy in tipoProyectoAux) + { + + } + +
+
+
+
+ + + + + + @context.Descripcion + + + +
+
+ + + + + + @context.Descripcion + + +
+ +
+
+
+ +
+
+
+ + + + + @context.Descripcion + + + @if (context.esCheckbox) + { +
+ +
+ } + else + { +
+ + @* *@ +
+ } +
+
+
+ + @* *@ + + + +
+ +
+ + + +@code { + [Parameter] + public bdHerramientaCACOA.LicitacionesURBAN objetoLicitacionUrban { get; set; } = new LicitacionesURBAN(); + private List tipoProyectoAux = new List(); + + private InstrumentosLicitacionesUrban componenteInstrumentos; + + private URBANTrabajoProfesional itemSeleccionado = new URBANTrabajoProfesional(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private string tituloInfo = ""; + + private bool nuevoElemento; + + + List mensajes = new List(); + + [CascadingParameter] + public HerramientaCASA.Components.Pages.LicitacionesURBAN _Parent { get; set; } + + + protected override async Task OnInitializedAsync() + { + if (objetoLicitacionUrban.TrabajoProfesional.idTipoDocumentacion != 0) + { + itemSeleccionado.idTipoProyecto = objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto; + itemSeleccionado.idTipoDocumentacion = objetoLicitacionUrban.TrabajoProfesional.idTipoDocumentacion; + cambiarSelectDocumentos(); + + cambiarListasDocumentacion(); + itemSeleccionado.idInstrumento = objetoLicitacionUrban.TrabajoProfesional.idInstrumento; + await InvokeAsync(StateHasChanged); + RefreshState(); + + } + } + + + private async void cambiarNumero() + { + componenteInstrumentos?.Recargar(); + await InvokeAsync(StateHasChanged); + RefreshState(); + } + private async void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionado, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionado.idTipoDocumentacion): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.idTipoDocumentacion = int.Parse(value); + objetoLicitacionUrban.TrabajoProfesional.idTipoDocumentacion = itemSeleccionado.idTipoDocumentacion; + cambiarSelectDocumentos(); + calcularHoraTrabajo(); + } + else + { + itemSeleccionado.idTipoDocumentacion = 0; + objetoLicitacionUrban.TrabajoProfesional.idTipoDocumentacion = itemSeleccionado.idTipoDocumentacion; + } + + break; + case nameof(itemSeleccionado.idTipoProyecto): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionado.idTipoProyecto = int.Parse(value); + objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto = itemSeleccionado.idTipoProyecto; + cambiarListasDocumentacion(); + calcularHoraTrabajo(); + } + else + { + itemSeleccionado.idTipoProyecto = 0; + objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto = itemSeleccionado.idTipoProyecto; + } + + break; + } + await InvokeAsync(StateHasChanged); + RefreshState(); + + } + + + private async void calcularHoraTrabajo() + { + foreach (var datos in objetoLicitacionUrban.TrabajoProfesional.DatosNecesarios.ToList()) + { + objetoLicitacionUrban.ActualizarDatoNecesario(datos); + } + + await InvokeAsync(StateHasChanged); + RefreshState(); + } + + private async Task cambiarSelectDocumentos() + { + tipoProyectoAux = objetoLicitacionUrban.Enumerados.ProyectosPorTipo(itemSeleccionado.idTipoDocumentacion); + + if (itemSeleccionado.idTipoProyecto == 0) + { + objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto = tipoProyectoAux.First().idtipoproyectos; + } + else + { + if (tipoProyectoAux.Any(x => x.idtipoproyectos == itemSeleccionado.idTipoProyecto)) + { + objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto = itemSeleccionado.idTipoProyecto; + } + else + { + objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto = tipoProyectoAux.First().idtipoproyectos; + } + } + + cambiarListasDocumentacion(); + + await InvokeAsync(StateHasChanged); + RefreshState(); + + } + private async Task cambiarListasDocumentacion() + { + objetoLicitacionUrban.TrabajoProfesional.DocumentacionMinima = objetoLicitacionUrban.DocumentacionMinima(objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto); + objetoLicitacionUrban.TrabajoProfesional.DocumentacionOpcional = objetoLicitacionUrban.DocumentacionOpcional(objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto); + objetoLicitacionUrban.TrabajoProfesional.DatosNecesarios = objetoLicitacionUrban.DatosNecesarios(objetoLicitacionUrban.TrabajoProfesional.idTipoProyecto); + objetoLicitacionUrban.ObtenerHoraTipoDocumento(); + await InvokeAsync(StateHasChanged); + RefreshState(); + } + + private async void opcionalCambiado(bool e, URBAN.DocumentacionURBAN objeto) + { + objeto.Checkeada = e; + objetoLicitacionUrban.ActualizarDocumentacionOpcional(objeto); + await InvokeAsync(StateHasChanged); + await InvokeAsync(StateHasChanged); + RefreshState(); + + } + private async void DatoNecesarioCheckeado(bool e, URBAN.DocumentacionURBAN objeto) + { + objeto.Checkeada = e; + objetoLicitacionUrban.ActualizarDatoNecesario(objeto); + await InvokeAsync(StateHasChanged); + await InvokeAsync(StateHasChanged); + RefreshState(); + } + private async void DatoNecesarioCambiado(double e, URBAN.DocumentacionURBAN objeto) + { + objeto.ValorNecesario = (double)e; + objetoLicitacionUrban.ActualizarDatoNecesario(objeto); + + await InvokeAsync(StateHasChanged); + await InvokeAsync(StateHasChanged); + RefreshState(); + } + + + public void RefreshState() + { + _Parent.RefreshState(); + this.StateHasChanged(); + } +} diff --git a/HerramientaCASA/Components/Pages/LicitacionUrban/FasesLicitacionesUrban.razor b/HerramientaCASA/Components/Pages/LicitacionUrban/FasesLicitacionesUrban.razor new file mode 100644 index 0000000..46eb67e --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionUrban/FasesLicitacionesUrban.razor @@ -0,0 +1,159 @@ +@using BlazorBootstrap +@using System.Text.Json +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db + + + +
+
Fases
+
+ +
+ + + + + @context.Denominacion + + +
+ % +
+ +
+
+
+ + + + + + +
+ +
+
+ +
+
+ @if (totalPorcentaje != 100) + { +
+ Trabajo en misión parcial: @totalPorcentaje % +
+ } + else + { +
+ Total: @totalPorcentaje % +
+ } +
+
+ +
+
+ +@code { + [CascadingParameter] + public HerramientaCASA.Components.Pages.LicitacionesURBAN _Parent { get; set; } + [Parameter] + public bdHerramientaCACOA.LicitacionesURBAN objetoLicitacionUrban { get; set; } = new bdHerramientaCACOA.LicitacionesURBAN(); + + private double totalPorcentaje = 0; + + + public List listadoFases { get; set; } = new List(); + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private CASA.FasesTrabajo itemSeleccionado = new CASA.FasesTrabajo(); + + + List mensajes = new List(); + + protected override async Task OnInitializedAsync() + { + listadoFases = objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional.ToList(); + + totalPorcentaje = objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + private async void porcentajeCambiado(double e, URBAN.FasesURBAN objeto) + { + + double porcentajeTotal = calcularPorcentaje(e, objeto); + + if (porcentajeTotal <= 100) + { + objeto.Porcentaje = (double)e; + objetoLicitacionUrban.ActualizarFase(objeto); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + else + { + + objeto.Porcentaje = 0; + objetoLicitacionUrban.ActualizarFase(objeto); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"La suma de los porcentajes no puede ser mayor de 100.", + }); + } + totalPorcentaje = objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + } + + private double calcularPorcentaje(double e, URBAN.FasesURBAN objeto) + { + double porcentajeTotal = 0; + objeto.Porcentaje = e; + + int indice = objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional + .FindIndex(x => x.idFase == objeto.idFase); + + if (indice >= 0) + { + objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional[indice] = objeto; + } + + porcentajeTotal = objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + + return porcentajeTotal; + } + + private async void restablecerValores() + { + var lista = JsonSerializer.Deserialize>(JsonSerializer.Serialize(objetoLicitacionUrban.Enumerados.FasesTrabajo)); + objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional = lista; + + listadoFases = objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional.ToList(); + + totalPorcentaje = objetoLicitacionUrban.TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje); + + + objetoLicitacionUrban.CalcularHorasTrabajoProfesional(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } +} diff --git a/HerramientaCASA/Components/Pages/LicitacionUrban/InstrumentosLicitacionesUrban.razor b/HerramientaCASA/Components/Pages/LicitacionUrban/InstrumentosLicitacionesUrban.razor new file mode 100644 index 0000000..cd4e80c --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionUrban/InstrumentosLicitacionesUrban.razor @@ -0,0 +1,140 @@ +@using BlazorBootstrap +@using System.Text.Json +@using Microsoft.AspNetCore.WebUtilities +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db +@using static bdHerramientaCACOA.CASA +@inject NavigationManager Navigation + + + +
+
+
Innovacion de los instrumentos
+

+ @* @if (!nuevaRedaccion) + { *@ + % + @* } + else + { + + } *@ + +

+ @foreach (var enu in listadoInstrumentos) + { +
+ + + +
+ } + +
+
+ + + + + +
Horas Trabajo Profesional @objetoLicitacionUrban.TrabajoProfesional.horasTrabProfesional.MilesYDecimales() h
+
+
+ +@code { + [CascadingParameter] + public HerramientaCASA.Components.Pages.LicitacionUrban.DocumentosLicitacion _Parent { get; set; } + [Parameter] + public bdHerramientaCACOA.LicitacionesURBAN objetoLicitacionUrban { get; set; } = new bdHerramientaCACOA.LicitacionesURBAN(); + + private bool nuevaRedaccion = false; + private enumeracionesCASA itemSeleccinado; + + public List listadoInstrumentos { get; set; } = new List(); + + private CASA.FasesTrabajo itemSeleccionado = new CASA.FasesTrabajo(); + + + List mensajes = new List(); + + [Parameter] + public string? idSimulador { get; set; } = ""; + + + public void Recargar() + { + // Vuelve a cargar los instrumentos y selecciona el actual + listadoInstrumentos = objetoLicitacionUrban.Enumerados.ListaInstrumentos.ToList(); + var seleccionado = listadoInstrumentos.FirstOrDefault(x => x.idEnumeracion == objetoLicitacionUrban.TrabajoProfesional.idInstrumento); + Seleccionar(seleccionado ?? listadoInstrumentos.First()); + objetoLicitacionUrban.CalcularHorasTrabajoProfesional(); + StateHasChanged(); + } + + + protected override async Task OnInitializedAsync() + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + listadoInstrumentos = objetoLicitacionUrban.Enumerados.ListaInstrumentos.ToList(); + + if (string.IsNullOrEmpty(idSimulador)) + { + Seleccionar(listadoInstrumentos.First()); + } + else + { + Seleccionar(listadoInstrumentos.First(x => x.Seleccionado == true)); + } + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private async void ValorModificado(double valor) + { + objetoLicitacionUrban.TrabajoProfesional.valorInstrumentos = Convert.ToDouble(valor); + objetoLicitacionUrban.TrabajoProfesional.idInstrumento = itemSeleccinado.idEnumeracion; + itemSeleccinado.ValorNumerico1 = Convert.ToDouble(valor); + + objetoLicitacionUrban.CalcularHorasTrabajoProfesional(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private async void Seleccionar(enumeracionesCASA item) + { + + if (item.Codigo.Contains("NUEVARED")) + { + nuevaRedaccion = true; + } + else + { + nuevaRedaccion = false; + } + + itemSeleccinado = item; + itemSeleccinado.Seleccionado = true; + + foreach (var intru in listadoInstrumentos.Where(x=>x.idEnumeracion != item.idEnumeracion)) + { + intru.Seleccionado = false; + } + + objetoLicitacionUrban.TrabajoProfesional.valorInstrumentos = Convert.ToDouble(item.ValorNumerico1); + objetoLicitacionUrban.TrabajoProfesional.idInstrumento = item.idEnumeracion; + objetoLicitacionUrban.CalcularHorasTrabajoProfesional(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } +} diff --git a/HerramientaCASA/Components/Pages/LicitacionUrban/TablaTrabajadoresUrban.razor b/HerramientaCASA/Components/Pages/LicitacionUrban/TablaTrabajadoresUrban.razor new file mode 100644 index 0000000..a88c2a9 --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionUrban/TablaTrabajadoresUrban.razor @@ -0,0 +1,410 @@ +@using BlazorBootstrap +@using System.Text.Json +@using Microsoft.AspNetCore.WebUtilities +@using System.Globalization +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db +@using static bdHerramientaCACOA.CASA + + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(itemSeleccionado.Descripcion))
+
+
+
+ +
+ +
+
+
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.Cantidad))
+
+
+ + + @foreach (var grupoTipologia in objetoLicitacionUrban.Enumerados.ListaGrupoTrabajadores) + { + + } + +
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idConvenioColectivo))
+
+ + +
+ + + + +
+
+ +
+
+
+
Solvencia técnica
+
+ + + + + @context.Descripcion + + + @context.Cantidad + + + @context.TipoConvenio + + +
+ + + + + + +
+
+
+
+ + + + + + +
+
+
+ +
+
+ Total trabajadores: + @objetoLicitacionUrban.ListaSolvenciaTecnica.Sum(x => x.Cantidad) +
+
+ +
+ @* + + + + + + + + + + + + + + + + + +
Equipo de trabajo mínimo

Titulado grado superior

+
+ +
+

Titulado grado medio

+
+ +
+
*@ +
+
+ + +@code { + [CascadingParameter] + public HerramientaCASA.Components.Pages.LicitacionesURBAN _Parent { get; set; } + + [Parameter] + public bdHerramientaCACOA.LicitacionesURBAN objetoLicitacionUrban { get; set; } = new bdHerramientaCACOA.LicitacionesURBAN(); + + private bool nuevaRedaccion = false; + + public List listadoInstrumentos { get; set; } = new List(); + + private LicitacionesURBAN.SolvenciaTecnica itemSeleccionado = new LicitacionesURBAN.SolvenciaTecnica(); + private LicitacionesURBAN.SolvenciaTecnica itemSeleccionadoTemporal { get; set; } = new LicitacionesURBAN.SolvenciaTecnica(); + + + List mensajes = new List(); + + [Parameter] + public string? idSimulador { get; set; } = ""; + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private EditContext editContext; + + private bool nuevoElemento; + private ValidationMessageStore? messageStore; + List listaSolvenciaTecnica; + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + + listaSolvenciaTecnica = objetoLicitacionUrban.ListaSolvenciaTecnica.ToList(); + } + + private async Task abrirPopupGestionDatos(LicitacionesURBAN.SolvenciaTecnica objeto, bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + nuevoElemento = true; + itemSeleccionadoTemporal = new LicitacionesURBAN.SolvenciaTecnica(); + + } + else + { + nuevoElemento = false; + itemSeleccionadoTemporal = new LicitacionesURBAN.SolvenciaTecnica() + { + idConvenioColectivo = objeto.idConvenioColectivo, + Cantidad = objeto.Cantidad, + Descripcion = objeto.Descripcion + }; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar Trabajo"; + } + else + { + tituloPopup = "Añadir Trabajo"; + } + await popupGestionDatos.ShowAsync(); + } + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.Descripcion }, nameof(itemSeleccionadoTemporal.Descripcion)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.Cantidad }, nameof(itemSeleccionadoTemporal.Cantidad)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idConvenioColectivo }, nameof(itemSeleccionadoTemporal.idConvenioColectivo)); + } + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + GestionarDatos(accion); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + private async Task GestionarDatos(string accion) + { + + switch (accion) + { + case "update": + rellenarItem(); + objetoLicitacionUrban.ActualizarSolvenciaTecnica(itemSeleccionado); + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + rellenarItem(); + objetoLicitacionUrban.InsertarSolvenciaTecnica(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoLicitacionUrban.EliminarSolvenciaTecnica(itemSeleccionado); + + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + listaSolvenciaTecnica = objetoLicitacionUrban.ListaSolvenciaTecnica.ToList(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + private void MostrarErrores() + { + // messageStore?.Clear(); + // foreach (var field in new[] { nameof(itemSeleccionadoTemporal.Coste), nameof(itemSeleccionadoTemporal.idTrabajo) }) + // { + // ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.OtrosTrabajos).GetProperty(field)?.GetValue(itemSeleccionadoTemporal) }, field); + // } + } + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionadoTemporal.Descripcion): + itemSeleccionadoTemporal.Descripcion = value; + break; + case nameof(itemSeleccionadoTemporal.Cantidad): + if (value == "") + { + value = "0"; + } + string parseado = value;//.Replace(",", "."); + itemSeleccionadoTemporal.Cantidad = int.Parse(parseado, CultureInfo.InvariantCulture); + break; + case nameof(itemSeleccionadoTemporal.idConvenioColectivo): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionadoTemporal.idConvenioColectivo = int.Parse(value); + } + else + { + itemSeleccionadoTemporal.idConvenioColectivo = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(itemSeleccionadoTemporal.Descripcion) && itemSeleccionadoTemporal.Descripcion == "") + { + messageStore?.Add(field, "Rellene este campo"); + } + if (fieldName == nameof(itemSeleccionadoTemporal.Cantidad) && itemSeleccionadoTemporal.Cantidad <= 0) + { + messageStore?.Add(field, "El Nº Trabajadores debe ser mayor que 0."); + } + + if (fieldName == nameof(itemSeleccionadoTemporal.idConvenioColectivo) && itemSeleccionadoTemporal.idConvenioColectivo == 0) + { + messageStore?.Add(field, "Seleccione uno."); + } + + editContext?.NotifyValidationStateChanged(); + } + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(LicitacionesURBAN.SolvenciaTecnica objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + private void rellenarItem() + { + itemSeleccionado.idConvenioColectivo = itemSeleccionadoTemporal.idConvenioColectivo; + itemSeleccionado.Cantidad = itemSeleccionadoTemporal.Cantidad; + itemSeleccionado.Descripcion = itemSeleccionadoTemporal.Descripcion; + itemSeleccionado.TipoConvenio = objetoLicitacionUrban.Enumerados.ListaGrupoTrabajadores.First(x => x.idEnumeracion == itemSeleccionado.idConvenioColectivo).ValorAlfabetico1; + + } + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + /* + private async Task MinimoSupCambiado(int valor) + { + if (valor < 1) + { + objetoLicitacionUrban.minimoGradoSuperior = 1; + } + else + { + objetoLicitacionUrban.minimoGradoSuperior = valor; + } + await _Parent.CalcularTabla(objetoLicitacionUrban.idProvincia); + _Parent.RefreshState(); + } + private async Task MinimoMedCambiado(int valor) + { + + objetoLicitacionUrban.minimoGradoMedio = valor; + await _Parent.CalcularTabla(objetoLicitacionUrban.idProvincia); + }*/ +} diff --git a/HerramientaCASA/Components/Pages/Licitaciones.razor b/HerramientaCASA/Components/Pages/Licitaciones.razor new file mode 100644 index 0000000..0393842 --- /dev/null +++ b/HerramientaCASA/Components/Pages/Licitaciones.razor @@ -0,0 +1,377 @@ +@using HerramientaCASA.Components.Pages.Comun +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db +@using HerramientaCASA.Components.Pages.LicitacionesGrids +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore +@page "/LicitacionCASA" +@page "/LicitacionCASA/{idSimulador}" + +@inject NavigationManager Navigation + + + +

+ @TextoSuperior +

+@if (!actualizado) +{ +
+ Esta simulación utiliza valores desactualizados. ¿Quiere Realizar una copia actualizada? + +
+} + + +
+ + @if (TituloBoton == "Guardar") + { +

Se va a guardar esta nueva simulación podrá acceder a ella para consultarla y editarla desde el apartado Mis Simulaciones

+ } + else + { +

Se van a sobrescribir los datos de la simulación actual con los cambios realizados, esta opción no puede deshacerse.

¿Desea continuar?

+ } +
+
+ + + + +
+
+ +
+ + Nombre de la simulación: + +
+ +
+
+
Convenio Colectivo:
+ + + + + + + + + + +
+ +
+ + + +
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+ + + + +
+ + + + + + + +
+ PRECIO LICITACIÓN / CONCURSO: @objetoLicitaciones.PrecioDelEncargo.MilesYDecimales() € +
+
+
+
+ @*
+
+ + + + + +
PRECIO LICITACIÓN / CONCURSO: @objetoLicitaciones.PrecioDelEncargo.MilesYDecimales() €
+
+
*@ +
+

Datos configuración para revisión de datos

+ superficie @objetoLicitaciones.superficie;
+ Coef sup total @objetoLicitaciones.coefSupTotal; (sin redondeo:@objetoLicitaciones.coefsinredondeo)
+ coef tip @objetoLicitaciones.coefTipoTotal;
+ @* coef tip total @objetoLicitaciones.totalCoefiTipologia;
*@ + @* int total @objetoLicitaciones.totalCoefIntervencion;
*@ + coef int total @objetoLicitaciones.coefIntervencionTotal;
+ fases encargadas @objetoLicitaciones.fasesEncargadas;
+ horas prod @objetoLicitaciones.horasProduccion;
+ @* horas porcentaje @objetoLicitaciones.horasPorcentaje;
*@ + horas docu @objetoLicitaciones.horasDocumentacion;
+ plazo medio @objetoLicitaciones.plazoMedio;
+ coef plazos @objetoLicitaciones.coefPlazos;
+ horas anuales minimas @objetoLicitaciones.horasAnualesMinimas;
+ CD @objetoLicitaciones.CD;
+ CI @objetoLicitaciones.CI;
+ CosteCDCI @objetoLicitaciones.CosteCDCI;
+ tasa costes var @objetoLicitaciones.tasaCostesVariables;
+ coste hora prod @objetoLicitaciones.costeHoraProduccion; +
+
+ Tabla CD+CI para visualizacion de datos, se quitara cuando se vea que los calculos son correctos
+ IPC Coste Indirecto:@objetoLicitaciones.Variables.IPCCosteIndirecto;
+ + + + @context.NumeroTrabajadores + + + @context.HorasProduccionAnuales + + + @context.CosteMinimoPersonal + + + + @context.CosteMaximoPersonal + + + @context.CosteMedioPersonal + + + @context.CostesDirectos + + + @context.CostesIndirectos + + + @context.CostesVariables + + + @context.TotalDespachoProfesional + + + +
+
+ + +@code { + [Parameter] + public string? idSimulador { get; set; } = ""; + public bool actualizado = true; + + public string TextoSuperior = "Nueva Licitación de Edificación"; + public string TituloBoton = "Guardar"; + private Modal popupGuardar = default!; + + List mensajes = new List(); + public tsHerramientasCACOA bd; + + private string nombreOriginal = ""; + + private bdHerramientaCACOA.LICITACIONES objetoLicitaciones; + + private int idUser = 0; + + public Licitaciones() + { + } + + protected override async Task OnInitializedAsync() + { + try + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + + if (string.IsNullOrEmpty(idSimulador)) + { + try + { + objetoLicitaciones = new bdHerramientaCACOA.LICITACIONES(); + objetoLicitaciones.Inicializar(bd); + } + catch (Exception ex) + { + + var a = ex.Message; + } + } + else + { + var fechaActVar = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD").Fecha1; + string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + -875421649); + + simulaciones simu = bd.simulaciones.Where(x => x.idSimulacion == int.Parse(idDesencriptado)).First(); + int idFicheroJSON = simu.idFicheroJSON; + idSimulador = idDesencriptado; + var byteFichero = bd.ficheros.Where(x => x.idFichero == idFicheroJSON).First().Fichero; + + string LicitacionesJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + objetoLicitaciones = System.Text.Json.JsonSerializer.Deserialize(LicitacionesJson); + + if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion == null && simu.FechaCreacion < fechaActVar)) + { + actualizado = false; + } + + TextoSuperior = "Modificando Licitación \"" + simu.Descripcion + "\""; + TituloBoton = "Modificar"; + + nombreOriginal = objetoLicitaciones.Descripcion; + + } + var obtenerID = await ProtectedSessionStore.GetAsync("idUsuario"); + idUser = obtenerID.Value; + } + catch (Exception ex) + { + Console.WriteLine($"Error durante la inicialización: {ex.Message}"); + } + } + private void guardarLicitacion() + { + + // para evitar loops + var settings = new Newtonsoft.Json.JsonSerializerSettings + { + ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore + }; + + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoLicitaciones, settings); + int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.LICITACIONCASA)).idEnumeracion; + + if (string.IsNullOrEmpty(idSimulador)) + { + + if (bd.simulaciones.Any(x => x.Descripcion == objetoLicitaciones.Descripcion && x.idTipoSimulacion == idtipoSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + crearLicitacion(jsonObjeto); + } + } + else + { + var listadoSimulacionesExistentes = bd.simulaciones.Where(x => x.Descripcion != nombreOriginal && x.idTipoSimulacion == idtipoSimulacion).ToList(); + + if (listadoSimulacionesExistentes.Any(x => x.Descripcion == objetoLicitaciones.Descripcion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + actualizarLicitacion(jsonObjeto); + } + } + } + + private void crearLicitacion(string jsonObjeto) + { + int idLicitacionCreada = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.LICITACIONCASA, jsonObjeto, objetoLicitaciones.Descripcion, "licitaciones.json", idUser); + + string link = "/LicitacionCASA?idSimulador=" + tsUtilidades.crypt.FEncS(idLicitacionCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Licitación creada correctamente.", + }); + Navigation.NavigateTo(link, true); + } + private void actualizarLicitacion(string jsonObjeto) + { + UtilidadesCASA.actualziarObjeto(bd, jsonObjeto, objetoLicitaciones.Descripcion, idSimulador); + cerrarPopupGuardar(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Licitación actualizada correctamente.", + }); + } + + private void clonarLicitacion() + { + objetoLicitaciones.Inicializar(bd); + objetoLicitaciones.CalcularHorasSuperficie(); + objetoLicitaciones.CalcularCostesProduccion(); + objetoLicitaciones.Descripcion = objetoLicitaciones.Descripcion + " (Act:" + DateTime.Now + ")"; + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoLicitaciones); + var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.LICITACIONCASA, jsonObjeto, objetoLicitaciones.Descripcion, "licitaciones.json", idUser); + + var link = "/LicitacionCASA?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + + Navigation.NavigateTo(link, true); + } + + public void RefreshState() + { + this.StateHasChanged(); + } + + private async Task CalcularTabla(string idProvincia) + { + + objetoLicitaciones.idProvincia = idProvincia; + objetoLicitaciones.Enumerados.ListaCDCI= objetoLicitaciones.CalcularTabla(idProvincia); + objetoLicitaciones.CalcularHorasSuperficie(); + RefreshState(); + } + private async Task abrirPopupGuardar() + { + await popupGuardar.ShowAsync(); + } + private async Task cerrarPopupGuardar() + { + await popupGuardar.HideAsync(); + } +} diff --git a/HerramientaCASA/Components/Pages/LicitacionesGrids/CostesProLicitaciones.razor b/HerramientaCASA/Components/Pages/LicitacionesGrids/CostesProLicitaciones.razor new file mode 100644 index 0000000..fae5e23 --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionesGrids/CostesProLicitaciones.razor @@ -0,0 +1,112 @@ +@using System.Globalization +
+ +
+
+ Costes Asociados a los Servicios de Arquitectura +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Concepto
Plazo de presentación de la documentación: +
+ @* meses *@ + meses +
+
Coste hora de producción @objetoLicitaciones.costeHoraProduccion.MilesYDecimales() €
Horas Trabajo profesional @objetoLicitaciones.horasProduccion.MilesYDecimales() €
Coste de producción del Trabajo Profesional @objetoLicitaciones.CostesProduccionTrabProf.MilesYDecimales() €
+ G.G. + B.I.
+ (40/19 Junta Consultiva de Contratación Pública del Estado) +
+
+ @objetoLicitaciones.Beneficio % +
+
COSTE DEL TRABAJO PROFESIONAL @objetoLicitaciones.PrecioTrabProf.MilesYDecimales() €
+ COSTES DE PRODUCCIÓN DEL TRABAJO PROFESIONAL: @objetoLicitaciones.PrecioTrabProf.MilesYDecimales() € +
+ +
+ +
+ + +@code { + [Parameter] + public LICITACIONES objetoLicitaciones { get; set; } = new LICITACIONES(); + + List listOtrosTrabajos = new List(); + + [CascadingParameter] + public Licitaciones _Parent { get; set; } + + protected override async Task OnInitializedAsync() + { + listOtrosTrabajos = objetoLicitaciones.OtrosTrabajos.ToList(); + } + + private async void PlazoPresentacionDocumentosCambiado(double e) + { + objetoLicitaciones.PlazoPresentacionDocumentos = e; + objetoLicitaciones.CalcularHorasSuperficie(); + objetoLicitaciones.CalcularCostesProduccion(); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + + private void controlarMeses(string meses) + { + + if (double.TryParse(meses, out var valor)) + { + string parseado = meses.ToString().Replace(",", "."); + objetoLicitaciones.PlazoPresentacionDocumentos = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + PlazoPresentacionDocumentosCambiado(objetoLicitaciones.PlazoPresentacionDocumentos); + } +} diff --git a/HerramientaCASA/Components/Pages/LicitacionesGrids/FasesTrabajoLicitaciones.razor b/HerramientaCASA/Components/Pages/LicitacionesGrids/FasesTrabajoLicitaciones.razor new file mode 100644 index 0000000..ea0ac9a --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionesGrids/FasesTrabajoLicitaciones.razor @@ -0,0 +1,195 @@ +@using BlazorBootstrap +@using bdHerramientaCACOA.db + + + + +
+
Fases
+
+ +
+
+ + + + + @context.Denominacion + + +
+ @context.Porcentaje.ToString() % + +
+ +
+
+
+ @*

TOTAL: @totalPorcentaje %

*@ + + + + + + +
+
+ @*
+ +
*@ +
+ @if (totalPorcentaje != 100) + { +
+ Trabajo en misión parcial: @totalPorcentaje % +
+ } + else + { +
+ Total: @totalPorcentaje % +
+ } +
+
+
+
+
+ +@code { + [CascadingParameter] + public Licitaciones _Parent { get; set; } + + private double totalPorcentaje = 0; + private bool isChecked; + [Parameter] + public LICITACIONES objetoLicitaciones { get; set; } = new LICITACIONES(); + + public List listadoFases { get; set; } = new List(); + public List listadoFasesAux { get; set; } = new List(); + + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private CASA.FasesTrabajo itemSeleccionado = new CASA.FasesTrabajo(); + + + List mensajes = new List(); + + protected override async Task OnInitializedAsync() + { + listadoFases = objetoLicitaciones.FasesTrabajo.ToList(); + + foreach (var fase in listadoFases) + { + listadoFasesAux.Add(new CASA.FasesTrabajo + { + Codigo = fase.Codigo, + Denominacion = fase.Denominacion, + idFase = fase.idFase, + Porcentaje = fase.Porcentaje + }); + } + + totalPorcentaje = listadoFases + .Where(f => f.Seleccionado) + .Sum(f => f.Porcentaje); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + private void PorcentajeCambiado(bool value, CASA.FasesTrabajo item) + { + item.Seleccionado = value; + RecalcularTotal(item); + + } + private async void RecalcularTotal(CASA.FasesTrabajo item) + { + totalPorcentaje = listadoFases + .Where(f => f.Seleccionado) + .Sum(f => f.Porcentaje); + + if (totalPorcentaje <= 100) + { + objetoLicitaciones.ActualizarFase(item); + } + else + { + item.Porcentaje = 0; + objetoLicitaciones.ActualizarFase(item); + + + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"La suma de los porcentajes no puede ser mayor de 100.", + }); + } + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + + totalPorcentaje = listadoFases + .Where(f => f.Seleccionado) + .Sum(f => f.Porcentaje); + } + + // private async void porcentajeCambiado(double e, CASA.FasesTrabajo objeto) + // { + + // double porcentajeTotal = calcularPorcentaje(e, objeto); + + + + // totalPorcentaje = objetoLicitaciones.FasesTrabajo.Sum(x => x.Porcentaje); + // } + + // private double calcularPorcentaje(double e, CASA.FasesTrabajo objeto) + // { + // double porcentajeTotal = 0; + // objeto.Porcentaje = e; + + // int indice = objetoLicitaciones.FasesTrabajo.ToList().IndexOf(objeto); + // objetoLicitaciones.FasesTrabajo[indice] = objeto; + + // porcentajeTotal = objetoLicitaciones.FasesTrabajo.Sum(x => x.Porcentaje); + + // return porcentajeTotal; + // } + + + private async void restablecerValores() + { + for (int i = 0; i < listadoFasesAux.Count; i++) + { + objetoLicitaciones.FasesTrabajo[i].Porcentaje = listadoFasesAux[i].Porcentaje; + } + + objetoLicitaciones.CalcularHorasSuperficie(); + + //Comprobar si esta va aqui, porque sino no modifca el precio licitación/concurso + objetoLicitaciones.CalcularCostesProduccion(); + + totalPorcentaje = objetoLicitaciones.FasesTrabajo.Sum(x => x.Porcentaje); + + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } +} diff --git a/HerramientaCASA/Components/Pages/LicitacionesGrids/TrabajoProfLicitacionesGrid.razor b/HerramientaCASA/Components/Pages/LicitacionesGrids/TrabajoProfLicitacionesGrid.razor new file mode 100644 index 0000000..423a037 --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionesGrids/TrabajoProfLicitacionesGrid.razor @@ -0,0 +1,441 @@ +@using HerramientaCASA.Model +@using Microsoft.EntityFrameworkCore +@using System.Globalization +@using bdHerramientaCACOA.db +@inject UserState UserState + + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + + + +
+
+ + +
+
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.superficie))
+
+ +
+ + + @foreach (var grupoTipologia in objetoLicitaciones.Enumerados.GruposTipologias) + { + + } + +
@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idGrupoTipologia))
+
+ +
+ + + @foreach (var tipologia in tipologiasAux) + { + + } + +
+ +
+ + + @foreach (var intervencion in intervencionesAux) + { + + } + +
+
+ + + + +
+
+ + +
+
Usos/Tipología
+ @* *@ +
+ +
+ + + + + + + @context.superficie.MilesYDecimales() + + + + + @objetoLicitaciones.Enumerados.GruposTipologias?.FirstOrDefault(x => x.idEnumeracion == context.idGrupoTipologia)?.ValorAlfabetico1 + + + + @objetoLicitaciones.Enumerados.Tipologias?.FirstOrDefault(x => x.idTipologia == context.idTipologia)?.Descripcion + + + + @objetoLicitaciones.Enumerados.Intervenciones?.FirstOrDefault(x => x.idEnumeracion == context.idTipoIntervencion)?.ValorAlfabetico1 + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + +
+ +
+
+ +
+
+ Total superficie: + @UsosTipologias.Sum(x => x.superficie).MilesYDecimales() + +
+
+
+ +
+ +@code { + [CascadingParameter] + public Licitaciones _Parent { get; set; } + + [Parameter] + public LICITACIONES objetoLicitaciones { get; set; } = new LICITACIONES(); + + public List UsosTipologias { get; set; } = new List(); + private List tipologiasAux = new List(); + private List intervencionesAux = new List(); + + [SupplyParameterFromForm] + private CASA.UsosTipologia itemSeleccionado { get; set; } = new CASA.UsosTipologia(); + + private CASA.UsosTipologia itemSeleccionadoTemporal { get; set; } = new CASA.UsosTipologia(); + + + private string tituloPopup = ""; + private Modal popupGestionDatos = default!; + private Modal popupConfirmarBorrado = default!; + + private bool nuevoElemento; + + List mensajes = new List(); + + private EditContext? editContext; + private ValidationMessageStore? messageStore; + + protected override async Task OnInitializedAsync() + { + editContext = new EditContext(itemSeleccionado); + messageStore = new ValidationMessageStore(editContext); + UsosTipologias = objetoLicitaciones.Usos.ToList(); + + } + + private async Task GestionarDatos(string accion) + { + rellenarItem(); + + switch (accion) + { + case "update": + objetoLicitaciones.ActualizarUso(itemSeleccionado); + await cerrarPopupGestionDatos(); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Actualizado correctamente.", + }); + + break; + + case "create": + objetoLicitaciones.InsertarUso(itemSeleccionado); + await cerrarPopupGestionDatos(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + break; + + case "delete": + objetoLicitaciones.EliminarUso(itemSeleccionado); + await cerrarPopupConfirmarBorrado(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Eliminado correctamente.", + }); + break; + } + UsosTipologias = objetoLicitaciones.Usos.ToList(); + await InvokeAsync(StateHasChanged); + _Parent.RefreshState(); + } + private async Task BorrarItem() + { + await GestionarDatos("delete"); + } + + + private async Task abrirPopupGestionDatos(CASA.UsosTipologia objeto,bool esNuevo) + { + itemSeleccionado = objeto; + + if (esNuevo) + { + itemSeleccionadoTemporal = new CASA.UsosTipologia(); + nuevoElemento = true; + } + else + { + itemSeleccionadoTemporal = new CASA.UsosTipologia() + { + CoefIntervencion = objeto.CoefIntervencion, + CoefTipologia = objeto.CoefTipologia, + idGrupoTipologia = objeto.idGrupoTipologia, + idTipoIntervencion = objeto.idTipoIntervencion, + idTipologia = objeto.idTipologia, + superficie = objeto.superficie, + SuperficieCoefIntervencion = objeto.SuperficieCoefIntervencion, + SuperficieCoefTipologia = objeto.SuperficieCoefTipologia + }; + + await cambiarTipologia(); + nuevoElemento = false; + } + + if (!nuevoElemento) + { + tituloPopup = "Modificar uso"; + } + else + { + tituloPopup = "Nuevo uso"; + } + await popupGestionDatos.ShowAsync(); + } + private async Task cerrarPopupGestionDatos() + { + await popupGestionDatos.HideAsync(); + } + + private async Task cambiarTipologia() + { + tipologiasAux = objetoLicitaciones.Enumerados.TipologiasPorGrupo(itemSeleccionadoTemporal.idGrupoTipologia).ToList(); + + + + if (itemSeleccionadoTemporal.idTipologia == 0) + { + itemSeleccionadoTemporal.idTipologia = tipologiasAux.First().idTipologia; + } + else + { + if (tipologiasAux.Any(x => x.idTipologia == itemSeleccionadoTemporal.idTipologia)) + { + itemSeleccionadoTemporal.idTipologia = itemSeleccionadoTemporal.idTipologia; + } + else + { + itemSeleccionadoTemporal.idTipologia = tipologiasAux.First().idTipologia; + } + } + + intervencionesAux = objetoLicitaciones.Enumerados.Intervenciones.ToList(); + itemSeleccionadoTemporal.idTipoIntervencion = itemSeleccionadoTemporal.idTipoIntervencion == 0 ? intervencionesAux.First().idEnumeracion : itemSeleccionadoTemporal.idTipoIntervencion; + + await InvokeAsync(StateHasChanged); + } + + + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado(CASA.UsosTipologia objeto) + { + itemSeleccionadoTemporal = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } + + private async Task OnRowClick(GridRowEventArgs objeto) + { + itemSeleccionado = objeto.Item; + } + + private void ValidarYActualizar(ChangeEventArgs e, string fieldName) + { + var value = e.Value?.ToString(); + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + + switch (fieldName) + { + case nameof(itemSeleccionado.superficie): + + if (!string.IsNullOrEmpty(value)) + { + + string parseado = value.Replace(",", "."); + itemSeleccionadoTemporal.superficie = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + break; + + case nameof(itemSeleccionadoTemporal.idGrupoTipologia): + + if (!string.IsNullOrEmpty(value)) + { + + itemSeleccionadoTemporal.idGrupoTipologia = int.Parse(value); + cambiarTipologia(); + } + else + { + itemSeleccionadoTemporal.idGrupoTipologia = 0; + } + + break; + } + + messageStore?.Clear(field); + if (fieldName == nameof(itemSeleccionadoTemporal.superficie) && itemSeleccionadoTemporal.superficie <= 0) + { + messageStore?.Add(field, "La superficie debe ser mayor que 0."); + } + + if (fieldName == nameof(itemSeleccionadoTemporal.idGrupoTipologia) && itemSeleccionadoTemporal.idGrupoTipologia == 0) + { + messageStore?.Add(field, "Seleccione un tipo de uso."); + } + + editContext?.NotifyValidationStateChanged(); + } + + private void ValidarTodo() + { + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.superficie }, nameof(itemSeleccionadoTemporal.superficie)); + ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idGrupoTipologia }, nameof(itemSeleccionadoTemporal.idGrupoTipologia)); + } + + private string GetExternalValidationMessage(string fieldName) + { + var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName); + return messageStore?[field].FirstOrDefault() ?? string.Empty; + } + + + // GUARDAR + private async Task guardarFormulario() + { + try + { + ValidarTodo(); + + if (!editContext!.GetValidationMessages().Any()) + { + string accion = nuevoElemento ? "create" : "update"; + GestionarDatos(accion); + + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Guardado correctamente.", + }); + } + else + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Warning, + Message = $"Debe rellenar los campos obligatorios.", + }); + } + + } + catch (Exception) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Error al guardar.", + }); + } + + } + + private void MostrarErrores() + { + messageStore?.Clear(); + foreach (var field in new[] { nameof(itemSeleccionado.superficie), nameof(itemSeleccionado.idGrupoTipologia) }) + { + ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.UsosTipologia).GetProperty(field)?.GetValue(itemSeleccionado) }, field); + } + } + + + private void rellenarItem() + { + itemSeleccionado.CoefIntervencion = itemSeleccionadoTemporal.CoefIntervencion; + itemSeleccionado.CoefTipologia = itemSeleccionadoTemporal.CoefTipologia; + itemSeleccionado.idGrupoTipologia = itemSeleccionadoTemporal.idGrupoTipologia; + itemSeleccionado.idTipoIntervencion = itemSeleccionadoTemporal.idTipoIntervencion; + itemSeleccionado.idTipologia = itemSeleccionadoTemporal.idTipologia; + itemSeleccionado.superficie = itemSeleccionadoTemporal.superficie; + itemSeleccionado.SuperficieCoefIntervencion = itemSeleccionadoTemporal.SuperficieCoefIntervencion; + itemSeleccionado.SuperficieCoefTipologia = itemSeleccionadoTemporal.SuperficieCoefTipologia; + } + +} \ No newline at end of file diff --git a/HerramientaCASA/Components/Pages/LicitacionesURBAN.razor b/HerramientaCASA/Components/Pages/LicitacionesURBAN.razor new file mode 100644 index 0000000..1cb5b6a --- /dev/null +++ b/HerramientaCASA/Components/Pages/LicitacionesURBAN.razor @@ -0,0 +1,404 @@ + +@page "/LicitacionesUrban" +@rendermode InteractiveServer +@using HerramientaCASA.Components.Pages.LicitacionUrban +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using System.Globalization +@using bdHerramientaCACOA.HerramientaURBAN +@using bdHerramientaCACOA.db +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore +@inject NavigationManager Navigation + + + +

+ @TextoSuperior +

+@if (!actualizado) + { +
+ Esta simulación utiliza valores desactualizados. ¿Quiere Realizar una copia actualizada? + +
+ } + + +
+ + @if (TituloBoton == "Guardar") + { +

Se va a guardar esta nueva simulación podrá acceder a ella para consultarla y editarla desde el apartado Mis Simulaciones

+ } + else + { +

Se van a sobrescribir los datos de la simulación actual con los cambios realizados, esta opción no puede deshacerse.

¿Desea continuar?

+ } +
+
+ + + + +
+
+
+ + Nombre de la licitación: + +
+
+
+
Convenio Colectivo:
+ + + + + + + + + + +
+
+ + +
+
+ + + +
+
+ +
+
+ + + +
+ +
+ + + + + + @* + + *@ +
+
+
Costes Asociados a los Servicios de Arquitectura
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Concepto
Plazo de presentación de la documentación: +
+ @* meses *@ + meses +
+
Coste hora de producción @objetoLicitacionUrban.CosteHP.MilesYDecimales() €/hora
Coste de producción del Trabajo Profesional @objetoLicitacionUrban.CostesProduccionTrabProf.MilesYDecimales() €
+ G.G. + B.I.
+ (40/19 Junta Consultiva de Contratación Pública del Estado) +
+
+ @objetoLicitacionUrban.Beneficio % +
+
+ COSTES DE PRODUCCIÓN DEL TRABAJO PROFESIONAL: @objetoLicitacionUrban.PrecioDelTrabajo.MilesYDecimales() € +
+ +
+ +
+ Tabla CD+CI para visualizacion de datos, se quitara cuando se vea que los calculos son correctos
+ IPC Coste Indirecto:@objetoLicitacionUrban.Variables.IPCCosteIndirecto;
+ + + + @context.NumeroTrabajadores + + + @context.HorasProduccionAnuales + + + @context.CosteMinimoPersonal + + + + @context.CosteMaximoPersonal + + + @context.CosteMedioPersonal + + + @context.CostesDirectos + + + @context.CostesIndirectos + + + @context.CostesVariables + + + @context.TotalDespachoProfesional + + + +
+
+
+ + +@code { + [Parameter] + public string? idSimulador { get; set; } = ""; + public string TextoSuperior = "Nueva licitación de Urbanismo"; + public string TituloBoton = "Guardar"; + private Modal popupGuardar = default!; + public bool actualizado = true; + + public tsHerramientasCACOA bd; + private bdHerramientaCACOA.LicitacionesURBAN objetoLicitacionUrban; + List mensajes = new List(); + + private string nombreOriginal = ""; + + private int idUser = 0; + + protected override async Task OnInitializedAsync() + { + try + { + var url = Navigation.ToAbsoluteUri(Navigation.Uri); + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + + if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue)) + { + idSimulador = clValue; + } + + + + if (string.IsNullOrEmpty(idSimulador)) + { + try + { + + objetoLicitacionUrban = new bdHerramientaCACOA.LicitacionesURBAN(); + objetoLicitacionUrban.RellenarCamposExtra(bd); + } + catch (Exception ex) + { + + var a = ex.Message; + } + } + else + { + + var fechaActVar = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD").Fecha1; + string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", + -875421649); + + simulaciones simu = bd.simulaciones.Where(x => x.idSimulacion == int.Parse(idDesencriptado)).First(); + int idFicheroJSON = simu.idFicheroJSON; + idSimulador = idDesencriptado; + var byteFichero = bd.ficheros.Where(x => x.idFichero == idFicheroJSON).First().Fichero; + + string CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero); + + objetoLicitacionUrban = System.Text.Json.JsonSerializer.Deserialize(CASAJson); + + if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion == null && simu.FechaCreacion < fechaActVar)) + { + actualizado = false; + } + + TextoSuperior = "Modificando simulación \"" + simu.Descripcion + "\""; + TituloBoton = "Modificar"; + + nombreOriginal = objetoLicitacionUrban.NombreSimulacion; + + } + + var obtenerID = await ProtectedSessionStore.GetAsync("idUsuario"); + idUser = obtenerID.Value; + } + catch (Exception ex) + { + Console.WriteLine($"Error durante la inicialización: {ex.Message}"); + } + } + + private void guardarUrban() + { + //HACER + // para evitar loops + + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoLicitacionUrban); + int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBANDSIMP)).idEnumeracion; + + if (string.IsNullOrEmpty(idSimulador)) + { + if (bd.simulaciones.Any(x => x.Descripcion == objetoLicitacionUrban.NombreSimulacion && x.idTipoSimulacion == idtipoSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + crearSimulacion(jsonObjeto); + } + } + else + { + var listadoSimulacionesExistentes = bd.simulaciones.Where(x => x.Descripcion != nombreOriginal && x.idTipoSimulacion == idtipoSimulacion).ToList(); + + if (listadoSimulacionesExistentes.Any(x => x.Descripcion == objetoLicitacionUrban.NombreSimulacion)) + { + mensajes.Add(new ToastMessage + { + Type = ToastType.Danger, + Message = $"Ya existe una simulación con el mismo nombre.", + }); + cerrarPopupGuardar(); + } + else + { + actualizarSimulacion(jsonObjeto); + } + + } + } + private void crearSimulacion(string jsonObjeto) + { + int idSimulacionCreada = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBANDSIMP, jsonObjeto, objetoLicitacionUrban.NombreSimulacion, "licitacionesUrban.json", idUser); + string link = "/LicitacionesURBAN?idSimulador=" + tsUtilidades.crypt.FEncS(idSimulacionCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Licitación creada correctamente.", + }); + + Navigation.NavigateTo(link, true); + } + private void actualizarSimulacion(string jsonObjeto) + { + UtilidadesCASA.actualziarObjeto(bd, jsonObjeto, objetoLicitacionUrban.NombreSimulacion, idSimulador); + cerrarPopupGuardar(); + mensajes.Add(new ToastMessage + { + Type = ToastType.Primary, + Message = $"Licitación actualizada correctamente.", + }); + } + + private void clonarUrban() + { + objetoLicitacionUrban.RellenarCamposExtra(bd); + + objetoLicitacionUrban.NombreSimulacion = objetoLicitacionUrban.NombreSimulacion + " (Act:" + DateTime.Now + ")"; + string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoLicitacionUrban); + var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBANDSIMP, jsonObjeto, objetoLicitacionUrban.NombreSimulacion, "licitacionesUrban.json", idUser); + + var link = "/LicitacionesUrban?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + + Navigation.NavigateTo(link, true); + } + + public async Task CalcularTabla(string idProvincia) + { + objetoLicitacionUrban.idProvincia = idProvincia; + objetoLicitacionUrban.Enumerados.ListaCDCI = objetoLicitacionUrban.CalcularTabla(idProvincia); + objetoLicitacionUrban.CalcularLicitacion(); + RefreshState(); + } + + public void RefreshState() + { + this.StateHasChanged(); + } + + + private async void PlazoPresentacionDocumentosCambiado(double e) + { + objetoLicitacionUrban.PlazoPresentacionDocumentos = e; + + objetoLicitacionUrban.CalcularLicitacion(); + + await InvokeAsync(StateHasChanged); + } + + private void controlarMeses(string meses) + { + + if (double.TryParse(meses, out var valor)) + { + string parseado = meses.ToString().Replace(",", "."); + objetoLicitacionUrban.PlazoPresentacionDocumentos = double.Parse(parseado, CultureInfo.InvariantCulture); + } + + PlazoPresentacionDocumentosCambiado(objetoLicitacionUrban.PlazoPresentacionDocumentos); + } + + private async Task abrirPopupGuardar() + { + await popupGuardar.ShowAsync(); + } + private async Task cerrarPopupGuardar() + { + await popupGuardar.HideAsync(); + } +} + diff --git a/HerramientaCASA/Components/Pages/Login/ClaveGenerada.razor b/HerramientaCASA/Components/Pages/Login/ClaveGenerada.razor new file mode 100644 index 0000000..4654352 --- /dev/null +++ b/HerramientaCASA/Components/Pages/Login/ClaveGenerada.razor @@ -0,0 +1,48 @@ +@page "/ClaveGenerada" +@using HerramientaCASA.Components.Layout +@using bdHerramientaCACOA.db +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage + +@rendermode InteractiveServer +@layout LoginLayout +@inject NavigationManager Navigation +@inject ProtectedSessionStorage ProtectedSessionStore + + +
+
+
+ +

Clave Generada correctamente

+
+

Se ha generado su clave para utilizar la herramienta.Guarde su clave y contraseña en un lugar seguro. NO PUEDE RECUPERARSE

+
+

Clave:@claveUsuario

+ +
+
+
+
+ +@code { + private int? claveUsuario = 0; + public tsHerramientasCACOA bd; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + var obtenerId = await ProtectedSessionStore.GetAsync("idUsuario"); + claveUsuario = obtenerId.Value; + + if (claveUsuario == 0 || claveUsuario == null) + { + Navigation.NavigateTo("/", forceLoad: true); + } + } + + private async Task irPanelControl() + { + Navigation.NavigateTo("/PanelControl", forceLoad: true); + } +} diff --git a/HerramientaCASA/Components/Pages/Login/Login.razor b/HerramientaCASA/Components/Pages/Login/Login.razor new file mode 100644 index 0000000..4466192 --- /dev/null +++ b/HerramientaCASA/Components/Pages/Login/Login.razor @@ -0,0 +1,101 @@ +@page "/" +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore +@rendermode InteractiveServer +@layout LoginLayout +@inject IHttpContextAccessor HttpContextAccessor +@inject NavigationManager Navigation +@inject UserState UserState + + +
+
+
+
+ +

Acceso a la Herramienta

+
+ + + +
+ + + +
+
+ +
+ +
+ +
+
+ + +
+
+ Si es la primera vez que utiliza la herramienta, cree una nueva clave de acceso +
+ +
+

@mensajeError

+
+ +
+
+
+
+
+ +@code { + + public tsHerramientasCACOA bd; + private LoginVM login = new LoginVM(); + private string mensajeError = ""; + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + await ProtectedSessionStore.SetAsync("idUsuario", 0); + await ProtectedSessionStore.SetAsync("EsAdmin", false); + + // Limpiar almacenamiento local o sesión si se está utilizando + // if (HttpContextAccessor?.HttpContext?.Session != null) + // { + // HttpContextAccessor.HttpContext.Session.Clear(); + // } + } + + private async Task Acceder() + { + //if (login.codigo == -534610 && login.password == "sRg1406.") + if (login.codigo == -1 && login.password == "-1") + { + await ProtectedSessionStore.SetAsync("idUsuario", -1); + await ProtectedSessionStore.SetAsync("EsAdmin", true); + + Navigation.NavigateTo("/PanelControlConf", forceLoad: true); + } + else + { + var usuario = bd.usuarios.FirstOrDefault(x => x.Codigo == login.codigo && x.Contrasena == login.password); + + if (usuario == null) + { + mensajeError = "Usuario no encontrado en la base de datos."; + } + else + { + + await ProtectedSessionStore.SetAsync("idUsuario", usuario.idUsuario); + await ProtectedSessionStore.SetAsync("EsAdmin", false); + + + Navigation.NavigateTo("/PanelControl", forceLoad: true); + } + } + } +} diff --git a/HerramientaCASA/Components/Pages/Login/NuevoAcceso.razor b/HerramientaCASA/Components/Pages/Login/NuevoAcceso.razor new file mode 100644 index 0000000..c81d591 --- /dev/null +++ b/HerramientaCASA/Components/Pages/Login/NuevoAcceso.razor @@ -0,0 +1,70 @@ +@page "/NuevoAcceso" +@using HerramientaCASA.Components.Layout +@using bdHerramientaCACOA.db +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage + +@rendermode InteractiveServer +@layout LoginLayout +@inject NavigationManager Navigation +@inject ProtectedSessionStorage ProtectedSessionStore + + +
+
+
+ +

Crear Clave de acceso

+
+

Se va a generar una clave de acceso para acceder a la herramienta, tenga en cuenta que como no se almacena ningún dato de caracter personal le recomendamos que guarde la clave y contraseña para poder utilizarla.

+
+
+ + +
+

@mensajeError

+ +
+
+
+
+ +@code { + private string? nuevaPassword = ""; + public tsHerramientasCACOA bd; + private string mensajeError = ""; + + protected override void OnInitialized() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); + + + + } + + private async Task Generar() + { + if (string.IsNullOrEmpty(nuevaPassword)) + { + mensajeError = "Debe introducir una nueva contraseña."; + } + else + { + + var nuevoAcceso = new usuarios(); + nuevoAcceso.Contrasena = nuevaPassword; + nuevoAcceso.FechaCreacion = DateTime.Now; + nuevoAcceso.FechaUltimoAcceso = DateTime.Now; + + bd.usuarios.Add(nuevoAcceso); + bd.SaveChanges(); + + nuevoAcceso.Codigo = nuevoAcceso.idUsuario; + bd.SaveChanges(); + + await ProtectedSessionStore.SetAsync("idUsuario", nuevoAcceso.idUsuario); + + + Navigation.NavigateTo("/ClaveGenerada", forceLoad: true); + } + } +} diff --git a/HerramientaCASA/Components/Pages/MisSimulaciones.razor b/HerramientaCASA/Components/Pages/MisSimulaciones.razor new file mode 100644 index 0000000..e3afb4e --- /dev/null +++ b/HerramientaCASA/Components/Pages/MisSimulaciones.razor @@ -0,0 +1,55 @@ +@using HerramientaCASA.Model +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db + +@page "/MisSimulaciones" + +
+ + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + +
+ +
+
+
+
+ +
+ + +@code { + protected override void OnInitialized() + { + + } +} diff --git a/HerramientaCASA/Components/Pages/PanelControl.razor b/HerramientaCASA/Components/Pages/PanelControl.razor new file mode 100644 index 0000000..8d6e17c --- /dev/null +++ b/HerramientaCASA/Components/Pages/PanelControl.razor @@ -0,0 +1,67 @@ +@page "/PanelControl" +@inject NavigationManager Navigation + + + + + + +@code { + +} diff --git a/HerramientaCASA/Components/Pages/Simulaciones/SimulacionesTabs.razor b/HerramientaCASA/Components/Pages/Simulaciones/SimulacionesTabs.razor new file mode 100644 index 0000000..a381774 --- /dev/null +++ b/HerramientaCASA/Components/Pages/Simulaciones/SimulacionesTabs.razor @@ -0,0 +1,134 @@ +@using HerramientaCASA.Model +@using Microsoft.EntityFrameworkCore +@using bdHerramientaCACOA.db +@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage +@inject ProtectedSessionStorage ProtectedSessionStore + +@inject UserState UserState + + + +
+ ¿Estás seguro que desea eliminarlo? +
+
+ + + + +
+ + +
+ + + + + @context.Descripcion + + @* + @context.idTipoSimulacionNavigation.Descripcion + + *@ + + @context.FechaCreacion @* .ToString("dd-MM-yyyy") *@ + + + @context.FechaModificacion + + + + + + + + + + +
+ +@code { + [Parameter] + public string TipoSimulacion { get; set; } = ""; + private Modal popupConfirmarBorrado = default!; + public tsHerramientasCACOA bd; + private string mensajeError = ""; + List listadoSimulaciones = new List(); + private simulaciones itemSeleccionado { get; set; } = new simulaciones(); + + private int idUser = 0; + + + protected override async Task OnInitializedAsync() + { + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: true); + + var obtenerID = await ProtectedSessionStore.GetAsync("idUsuario"); + idUser = obtenerID.Value; + + listadoSimulaciones = bd.simulaciones.Include(x => x.idTipoSimulacionNavigation).Include(x => x.idFicheroJSONNavigation).Where(x => x.idCodigo == idUser && x.idTipoSimulacionNavigation.Codigo == "TIPOHERRAMIENTA." + TipoSimulacion).ToList(); + } + + private string Redirigir(int id, int idTipoSimulacion) + { + string link = ""; + + switch (obtenerTipoSimulacion(idTipoSimulacion)) + { + case "CASA": + link = "/HerramientaCASAS?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + break; + case "BAJAS": + link = "/Bajas?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + break; + case "LICITACION CASA": + link = "/LicitacionCASA?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + break; + case "URBAND": + link = "/HerramientaURBAN?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + break; + case "URBAND SIMPLIFICADA": + link = "/LicitacionesURBAN?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649); + break; + } + return link; + } + + private string obtenerTipoSimulacion(int idTipoSimulacion) + { + string tipo = bd.enumeraciones.First(x => x.idEnumeracion == idTipoSimulacion).Descripcion; + return tipo; + } + + + private async Task BorrarItem() + { + bd.simulaciones.Remove(itemSeleccionado); + bd.SaveChanges(); + // Se tiene que crear otro contexto para que no falle + bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: true); + listadoSimulaciones = bd.simulaciones.Include(x => x.idTipoSimulacionNavigation).Include(x => x.idFicheroJSONNavigation).Where(x => x.idCodigo == idUser && x.idTipoSimulacionNavigation.Codigo == "TIPOHERRAMIENTA." + TipoSimulacion).ToList(); + StateHasChanged(); + cerrarPopupConfirmarBorrado(); + } + + + //////// PopUp eliminar registro + private async Task abrirPopupConfirmarBorrado( simulaciones objeto) + { + itemSeleccionado = objeto; + await popupConfirmarBorrado.ShowAsync(); + } + private async Task cerrarPopupConfirmarBorrado() + { + await popupConfirmarBorrado.HideAsync(); + } +} diff --git a/HerramientaCASA/Components/Pages/TablasSimulaciones/BajasSimulaciones.razor b/HerramientaCASA/Components/Pages/TablasSimulaciones/BajasSimulaciones.razor new file mode 100644 index 0000000..55e1ce2 --- /dev/null +++ b/HerramientaCASA/Components/Pages/TablasSimulaciones/BajasSimulaciones.razor @@ -0,0 +1,41 @@ +@page "/BajasSimulaciones" +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using System.Text.Json +@using System.Text +@using bdHerramientaCACOA.db +@using Newtonsoft.Json +@rendermode InteractiveServer +@inject NavigationManager Navigation + + + +
+
+
+
+
+ +
+ Simulaciones bajas guardadas +
+
+ +
+
+
+ +
+ +@code { + + protected override async Task OnInitializedAsync() + { + } + + private void irNuevaSimulacion() + { + Navigation.NavigateTo("/Bajas", true); + + } +} diff --git a/HerramientaCASA/Components/Pages/TablasSimulaciones/HerramURBANSimulacion.razor b/HerramientaCASA/Components/Pages/TablasSimulaciones/HerramURBANSimulacion.razor new file mode 100644 index 0000000..f08bf45 --- /dev/null +++ b/HerramientaCASA/Components/Pages/TablasSimulaciones/HerramURBANSimulacion.razor @@ -0,0 +1,42 @@ +@page "/HerramientaURBANSimulaciones" +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using System.Text.Json +@using System.Text +@using bdHerramientaCACOA.db +@using Newtonsoft.Json +@rendermode InteractiveServer +@inject NavigationManager Navigation +@inject UserState userState + + + +
+
+
+
+
+ +
+ Simulaciones URBAN guardadas +
+
+ +
+
+
+ +
+ +@code { + + protected override async Task OnInitializedAsync() + { + } + + private void irNuevaSimulacion() + { + Navigation.NavigateTo("/HerramientaURBAN", true); + + } +} diff --git a/HerramientaCASA/Components/Pages/TablasSimulaciones/HerramientaSimulacion.razor b/HerramientaCASA/Components/Pages/TablasSimulaciones/HerramientaSimulacion.razor new file mode 100644 index 0000000..b4b532d --- /dev/null +++ b/HerramientaCASA/Components/Pages/TablasSimulaciones/HerramientaSimulacion.razor @@ -0,0 +1,43 @@ +@page "/HerramientaCASASimulaciones" +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using System.Text.Json +@using System.Text +@using bdHerramientaCACOA.db +@using Newtonsoft.Json +@rendermode InteractiveServer +@inject NavigationManager Navigation +@inject UserState userState + + + +
+
+
+
+
+ +
+ + Ver simulaciones CASA guardadas +
+
+ +
+
+
+ +
+ +@code { + + protected override async Task OnInitializedAsync() + { + } + + private void irNuevaSimulacion() + { + Navigation.NavigateTo("/HerramientaCASAS", true); + + } +} diff --git a/HerramientaCASA/Components/Pages/TablasSimulaciones/LicitacionesSimulacion.razor b/HerramientaCASA/Components/Pages/TablasSimulaciones/LicitacionesSimulacion.razor new file mode 100644 index 0000000..a001ca6 --- /dev/null +++ b/HerramientaCASA/Components/Pages/TablasSimulaciones/LicitacionesSimulacion.razor @@ -0,0 +1,42 @@ +@page "/LicitacionCASASimulaciones" +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using System.Text.Json +@using System.Text +@using bdHerramientaCACOA.db +@using Newtonsoft.Json +@rendermode InteractiveServer +@inject NavigationManager Navigation +@inject UserState userState + + + +
+
+
+
+
+ +
+ Licitaciones CASA guardadas +
+
+ +
+
+
+ +
+ +@code { + + protected override async Task OnInitializedAsync() + { + } + + private void irNuevaSimulacion() + { + Navigation.NavigateTo("/LicitacionCASA", true); + + } +} diff --git a/HerramientaCASA/Components/Pages/TablasSimulaciones/LicitacionesUrbanSimulacion.razor b/HerramientaCASA/Components/Pages/TablasSimulaciones/LicitacionesUrbanSimulacion.razor new file mode 100644 index 0000000..861b2c9 --- /dev/null +++ b/HerramientaCASA/Components/Pages/TablasSimulaciones/LicitacionesUrbanSimulacion.razor @@ -0,0 +1,42 @@ +@page "/LicitacionUrbanSimulaciones" +@using HerramientaCASA.Model +@using Microsoft.AspNetCore.WebUtilities +@using System.Text.Json +@using System.Text +@using bdHerramientaCACOA.db +@using Newtonsoft.Json +@rendermode InteractiveServer +@inject NavigationManager Navigation +@inject UserState userState + + + +
+
+
+
+
+ +
+ Licitaciones URBAN guardadas +
+
+ +
+
+
+ +
+ +@code { + + protected override async Task OnInitializedAsync() + { + } + + private void irNuevaSimulacion() + { + Navigation.NavigateTo("/LicitacionesURBAN", true); + + } +} diff --git a/HerramientaCASA/Components/Routes.razor b/HerramientaCASA/Components/Routes.razor new file mode 100644 index 0000000..f756e19 --- /dev/null +++ b/HerramientaCASA/Components/Routes.razor @@ -0,0 +1,6 @@ + + + + + + diff --git a/HerramientaCASA/Components/_Imports.razor b/HerramientaCASA/Components/_Imports.razor new file mode 100644 index 0000000..7aa89d6 --- /dev/null +++ b/HerramientaCASA/Components/_Imports.razor @@ -0,0 +1,16 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using HerramientaCASA +@using HerramientaCASA.Components +@using BlazorBootstrap +@using HerramientaCASA.ViewModel +@using bdHerramientaCACOA +@using bdHerramientaCACOA.dbcontext +@using HerramientaCASA.Components.Layout +@using bdHerramientaCACOA.extensiones_string diff --git a/HerramientaCASA/HerramientaCASA.csproj b/HerramientaCASA/HerramientaCASA.csproj new file mode 100644 index 0000000..5403cd4 --- /dev/null +++ b/HerramientaCASA/HerramientaCASA.csproj @@ -0,0 +1,29 @@ + + + + SAK + SAK + SAK + SAK + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/HerramientaCASA/Model/UserState.cs b/HerramientaCASA/Model/UserState.cs new file mode 100644 index 0000000..c72449c --- /dev/null +++ b/HerramientaCASA/Model/UserState.cs @@ -0,0 +1,45 @@ +namespace HerramientaCASA.Model +{ + public class UserState + { + private readonly object _lock = new object(); + private int _idUser; + private bool _esAdmin; + public int idUser + { + get + { + lock (_lock) + { + return _idUser; + } + } + set + { + lock (_lock) + { + _idUser = value; + } + } + } + + public bool EsAdmin + { + get + { + lock (_lock) + { + return _esAdmin; + } + } + set + { + lock (_lock) + { + _esAdmin = value; + } + } + } + + } +} diff --git a/HerramientaCASA/Program.cs b/HerramientaCASA/Program.cs new file mode 100644 index 0000000..223b2fe --- /dev/null +++ b/HerramientaCASA/Program.cs @@ -0,0 +1,106 @@ +using bdHerramientaCACOA.dbcontext; +using HerramientaCASA.Components; +using HerramientaCASA.Model; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage; +using System.Globalization; +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); + +builder.Services.AddAuthentication(options => +{ + options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; +}); +CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("es-ES"); +CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("es-ES"); + +builder.Services.AddRazorPages() + .AddJsonOptions(options => + { + options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; + }); + +// Necesario para ver porqué está fallando ciertas cosas que dan el error Circuit +builder.Services.AddServerSideBlazor().AddCircuitOptions(option => { option.DetailedErrors = true; }); +builder.Services.AddHttpContextAccessor(); +builder.Services.AddDistributedMemoryCache(); + +builder.Services.AddSession(options => +{ + options.IdleTimeout = TimeSpan.FromHours(1); + options.Cookie.HttpOnly = true; + options.Cookie.IsEssential = true; +}); + +builder.Services.AddBlazorBootstrap(); +builder.Services.AddAntiforgery(); +builder.Services.AddSingleton(); +builder.Services.AddScoped(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error", createScopeForErrors: true); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +// Inicializar las cadenas de conexión +var connectionStrings = builder.Configuration.GetSection("ConnectionStrings"); +var writeConnectionString = connectionStrings["WriteConnection"]; +var readOnlyConnectionString = connectionStrings["ReadOnlyConnection"]; + +if (string.IsNullOrEmpty(writeConnectionString) || string.IsNullOrEmpty(readOnlyConnectionString)) +{ + throw new ArgumentNullException("Las cadenas de conexión no están configuradas correctamente."); +} + +tsHerramientasCACOA.EstableceCBD(writeConnectionString, readOnlyConnectionString); + +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.UseSession(); +app.UseRouting(); + +app.UseAuthentication(); +app.UseAuthorization(); +app.UseAntiforgery(); + +app.Use(async (context, next) => +{ + var userState = context.RequestServices.GetService(); + var path = context.Request.Path; + + if (path == "/" || + path.StartsWithSegments("/_blazor") || + path.StartsWithSegments("/Content") || + path.StartsWithSegments("/Scripts") || + path.StartsWithSegments("/favicon.ico") || + path.StartsWithSegments("/_framework")) + { + await next(); + return; + } + + //// Redirigir al home si no hay token y la ruta no es pública + //if (userState?.idUser == 0) + //{ + // Console.WriteLine($"Redirigiendo al home desde: {path}"); + // context.Response.Redirect("/"); + // return; + //} + + // Continuar con la solicitud + await next(); +}); + +app.MapRazorComponents() + .AddInteractiveServerRenderMode(); + +app.Run(); diff --git a/HerramientaCASA/Properties/launchSettings.json b/HerramientaCASA/Properties/launchSettings.json new file mode 100644 index 0000000..0ab948e --- /dev/null +++ b/HerramientaCASA/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:62617", + "sslPort": 44367 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5145", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7275;http://localhost:5145", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } + } diff --git a/HerramientaCASA/UtilidadesCASA.cs b/HerramientaCASA/UtilidadesCASA.cs new file mode 100644 index 0000000..3d20826 --- /dev/null +++ b/HerramientaCASA/UtilidadesCASA.cs @@ -0,0 +1,548 @@ +using bdHerramientaCACOA; +using bdHerramientaCACOA.db; +using bdHerramientaCACOA.dbcontext; +using BlazorBootstrap; +using HerramientaCASA.Model; +using HerramientaCASA.ViewModel; +using System.Text; +using static HerramientaCASA.Components.Pages.ConfiguracionPages.ConvenioColectivo; + +namespace HerramientaCASA +{ + public class UtilidadesCASA + { + public static int crearObjeto(tsHerramientasCACOA bd, TiposSimulaciones tipoSimulacion, string jsonObjeto, string descripcion, string nombreFichero, int idUsuario) + { + int idtipoFichero = bd.enumeraciones.First(x => x.Codigo == "TIPFIC.JSON").idEnumeracion; + int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == obtenerTipoSimulacion(tipoSimulacion)).idEnumeracion; + + bdHerramientaCACOA.db.ficheros ficheroCASA = new bdHerramientaCACOA.db.ficheros() + { + FechaCreacion = DateTime.Now, + idTipo = idtipoFichero, + Fichero = Encoding.UTF8.GetBytes(jsonObjeto), + NombreFichero = nombreFichero + }; + + bdHerramientaCACOA.db.simulaciones simulacion = new bdHerramientaCACOA.db.simulaciones() + { + + idCodigo = idUsuario, + idTipoSimulacion = idtipoSimulacion, + Descripcion = descripcion, + idFicheroJSONNavigation = ficheroCASA, + FechaCreacion = DateTime.Now + }; + + bd.simulaciones.Add(simulacion); + bd.SaveChanges(); + return simulacion.idSimulacion; + } + public static void actualziarObjeto(tsHerramientasCACOA bd, string jsonObjeto, string descripcion, string idSimulacion) + { + simulaciones simulacionObtenida = bd.simulaciones.First(x => x.idSimulacion == int.Parse(idSimulacion)); + + ficheros ficheroObtenido = bd.ficheros.First(x => x.idFichero == simulacionObtenida.idFicheroJSON); + + ficheroObtenido.Fichero = Encoding.UTF8.GetBytes(jsonObjeto); + + simulacionObtenida.FechaModificacion = DateTime.Now; + simulacionObtenida.Descripcion = descripcion; + + bd.ficheros.Update(ficheroObtenido); + bd.simulaciones.Update(simulacionObtenida); + + bd.SaveChanges(); + } + public static string obtenerTipoSimulacion(TiposSimulaciones simulacion) + { + string tipoSimulacion = ""; + + switch (simulacion) + { + case TiposSimulaciones.CASA: + tipoSimulacion = "TIPOHERRAMIENTA.CASA"; + break; + case TiposSimulaciones.BAJA: + tipoSimulacion = "TIPOHERRAMIENTA.BAJAS"; + break; + case TiposSimulaciones.LICITACIONCASA: + tipoSimulacion = "TIPOHERRAMIENTA.LICITACIONCASA"; + break; + case TiposSimulaciones.URBAN: + tipoSimulacion = "TIPOHERRAMIENTA.URBAND"; + break; + case TiposSimulaciones.URBANDSIMP: + tipoSimulacion = "TIPOHERRAMIENTA.URBANDSIMP"; + break; + } + ; + + return tipoSimulacion; + } + public static void guardarEnumeracion(tsHerramientasCACOA bd, enumeraciones nuevaEnumeracion, string codigo, bool nuevoElemento = true, enumeraciones enumeracionObtenida = null) + { + try + { + if (nuevoElemento) + { + + int grupoEnum = (int)bd.enumeraciones.First(x => x.Codigo.Contains(codigo)).idGrupoEnumeracion; + + nuevaEnumeracion.Descripcion = nuevaEnumeracion.ValorAlfabetico1.ToUpper(); + nuevaEnumeracion.Codigo = codigo + "." + nuevaEnumeracion.ValorAlfabetico1.ToUpper(); + nuevaEnumeracion.Codigo = nuevaEnumeracion.Codigo.Trim().Replace(" ", ""); + + nuevaEnumeracion.idGrupoEnumeracion = grupoEnum; + bd.enumeraciones.Add(nuevaEnumeracion); + } + else + { + enumeracionObtenida.ValorAlfabetico1 = nuevaEnumeracion.ValorAlfabetico1; + enumeracionObtenida.ValorNumerico1 = nuevaEnumeracion.ValorNumerico1; + enumeracionObtenida.ValorNumerico2 = nuevaEnumeracion.ValorNumerico2; + enumeracionObtenida.Descripcion = nuevaEnumeracion.ValorAlfabetico1.ToUpper(); + //enumeracionObtenida.Codigo = codigo + "." + nuevaEnumeracion.ValorAlfabetico1.ToUpper(); + //enumeracionObtenida.Codigo = nuevaEnumeracion.Codigo.Trim().Replace(" ", ""); + + bd.enumeraciones.Update(enumeracionObtenida); + } + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + + } + + public static void eliminarEnumeracion(tsHerramientasCACOA bd, enumeraciones enumeracionObtenida) + { + try + { + bd.enumeraciones.Remove(enumeracionObtenida); + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + + } + + public static void actualizarFactorCorrecion(tsHerramientasCACOA bd, factorescorreccion factorCorrecc, factorescorreccion facturaEdit) + { + try + { + factorCorrecc.Descripcion = facturaEdit.Descripcion; + factorCorrecc.Coeficiente = facturaEdit.Coeficiente; + + bd.factorescorreccion.Update(factorCorrecc); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + public static void crearFactorCorrecion(tsHerramientasCACOA bd, factorescorreccion factorCorrecc) + { + try + { + string descripcion = factorCorrecc.Descripcion; + factorCorrecc.Descripcion = descripcion; + + bd.factorescorreccion.Add(factorCorrecc); + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + public static void eliminarFactorCorrecion(tsHerramientasCACOA bd, factorescorreccion factorObtenido) + { + try + { + //Comprobamos si es el ultimo de su especie + var total = bd.factorescorreccion.Where(x => x.idEnumeracion == factorObtenido.idEnumeracion).Count(); + + var idenu = factorObtenido.idEnumeracion; + bd.factorescorreccion.Remove(factorObtenido); + bd.SaveChanges(); + if (total == 1) + { + var enu = bd.enumeraciones.First(x => x.idEnumeracion == idenu); + bd.enumeraciones.Remove(enu); + } + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + + } + + //public static void actualizarCosteDespachoProfesional(tsHerramientasCACOA bd, costedespachoprofesional coste, costedespachoprofesional costeEdit) + //{ + // try + // { + // coste.numTrabajadores = costeEdit.numTrabajadores; + // coste.HorasProduccionAnuales = costeEdit.HorasProduccionAnuales; + // coste.CosteMinimoPersonal = costeEdit.CosteMinimoPersonal; + // coste.CosteMaxPersonal = costeEdit.CosteMaxPersonal; + // coste.CosteDirectoMedio = costeEdit.CosteDirectoMedio; + // coste.CostesDirectos = costeEdit.CostesDirectos; + // coste.CostesIndirectos = costeEdit.CostesIndirectos; + // coste.TotalDespachoProfesional = costeEdit.TotalDespachoProfesional; + + // bd.costedespachoprofesional.Update(coste); + + // var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + // cambiarFecha.Fecha1 = DateTime.Now; + // bd.enumeraciones.Update(cambiarFecha); + // } + // catch (Exception ex) + // { + + // } + //} + //public static void crearCosteDespachoProfesional(tsHerramientasCACOA bd, costedespachoprofesional coste) + //{ + // try + // { + // //string descripcion = factorCorrecc.Descripcion; + // //factorCorrecc.Descripcion = descripcion; + + // bd.costedespachoprofesional.Add(coste); + + // var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + // cambiarFecha.Fecha1 = DateTime.Now; + // bd.enumeraciones.Update(cambiarFecha); + // } + // catch (Exception ex) + // { + + // } + //} + + //public static void eliminarCosteDespachoProfesional(tsHerramientasCACOA bd, costedespachoprofesional costeObtenido) + //{ + // try + // { + // bd.costedespachoprofesional.Remove(costeObtenido); + // var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + // cambiarFecha.Fecha1 = DateTime.Now; + // bd.enumeraciones.Update(cambiarFecha); + // } + // catch (Exception ex) + // { + + // } + + //} + + public static void actualizarTipologias(tsHerramientasCACOA bd, tipologias tipologiaObtenida, tipologias tipologiaEdit) + { + try + { + tipologiaObtenida.Descripcion = tipologiaEdit.Descripcion; + tipologiaObtenida.CoeficienteUso = tipologiaEdit.CoeficienteUso; + + bd.tipologias.Update(tipologiaObtenida); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + public static void crearTipologia(tsHerramientasCACOA bd, tipologias tipologiaObtenida) + { + try + { + string descripcion = tipologiaObtenida.Descripcion; + tipologiaObtenida.Descripcion = descripcion; + + bd.tipologias.Add(tipologiaObtenida); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + public static void actualizarConvenioColectivo(tsHerramientasCACOA bd, conveniocolectivo convcol, conveniocolectivo concolEdit) + { + try + { + convcol.CosteAnualTrabajador = concolEdit.CosteAnualTrabajador; + + bd.conveniocolectivo.Update(convcol); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + public static void actualizarConvenioColectivo(tsHerramientasCACOA bd, ConvenioProvincia concolEdit) + { + try + { + var gradSup = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idGradoSup); + gradSup.CosteAnualTrabajador = concolEdit.valorGradoSup; + var gradMed = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idGradoMedio); + gradSup.CosteAnualTrabajador = concolEdit.valorGradoMed; + var delin = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idDelinPro); + gradSup.CosteAnualTrabajador = concolEdit.valorDelinPro; + var admin = bd.conveniocolectivo.First(x => x.idConvenioColectivo == concolEdit.idAdmin); + gradSup.CosteAnualTrabajador = concolEdit.valorAdmin; + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + public static void eliminarTipologia(tsHerramientasCACOA bd, tipologias tipologiaObtenida) + { + try + { + bd.tipologias.Remove(tipologiaObtenida); + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + + } + + public static void actualizarTipoProyecto(tsHerramientasCACOA bd, tipoproyectos proyecto, tipoproyectos proyectoEdit) + { + try + { + proyecto.Descripcion = proyectoEdit.Descripcion; + proyecto.Abreviatura = proyectoEdit.Abreviatura; + proyecto.idTipoDocumento = proyectoEdit.idTipoDocumento; + + + bd.tipoproyectos.Update(proyecto); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + + public static void crearTipoProyecto(tsHerramientasCACOA bd, tipoproyectos proyecto) + { + try + { + bd.tipoproyectos.Add(proyecto); + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + public static void eliminarTipoProyecto(tsHerramientasCACOA bd, tipoproyectos proyecto) + { + try + { + //Comprobamos si es el ultimo de su especie + var total = bd.tipoproyectos.Where(x => x.idTipoDocumento == proyecto.idTipoDocumento).Count(); + + var idenu = proyecto.idTipoDocumento; + bd.tipoproyectos.Remove(proyecto); + bd.SaveChanges(); + if (total == 1) + { + var enu = bd.enumeraciones.First(x => x.idEnumeracion == idenu); + bd.enumeraciones.Remove(enu); + } + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + + } + + + public static void actualizarDocumentacion(tsHerramientasCACOA bd, documentacion docu, documentacion docuEdit) + { + try + { + docu.Descripcion = docuEdit.Descripcion; + docu.CoeficienteHoras = docuEdit.CoeficienteHoras; + docu.Checkeable = docuEdit.Checkeable; + + bd.documentacion.Update(docu); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + + public static void crearDocumentacion(tsHerramientasCACOA bd, documentacion docu) + { + try + { + bd.documentacion.Add(docu); + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + public static void eliminarDocumentacion(tsHerramientasCACOA bd, documentacion docu) + { + try + { + bd.documentacion.Remove(docu); + bd.SaveChanges(); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + + + public static void actualizarProyecto_Documentacion(tsHerramientasCACOA bd, tipoproyecto_documentacion docu, v_tipoproyecto_documentacion docuEdit) + { + try + { + docu.idtipoproyecto = docuEdit.idtipoproyecto; + docu.iddocumentacion = docuEdit.iddocumentacion; + docu.esMinima = docuEdit.esMinima; + docu.esOpcional = docuEdit.esOpcional; + docu.esNecesario = docuEdit.esNecesario; + docu.orden = docuEdit.orden; + + bd.tipoproyecto_documentacion.Update(docu); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + + public static void crearProyecto_Documentacion(tsHerramientasCACOA bd, v_tipoproyecto_documentacion docu) + { + try + { + tipoproyecto_documentacion proyeDocu = new tipoproyecto_documentacion() + { + idtipoproyecto = docu.idtipoproyecto, + iddocumentacion = docu.iddocumentacion, + esMinima = docu.esMinima, + esOpcional = docu.esOpcional, + esNecesario = docu.esNecesario, + orden = docu.orden, + }; + + bd.tipoproyecto_documentacion.Add(proyeDocu); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + public static void eliminarProyecto_Documentacion(tsHerramientasCACOA bd, tipoproyecto_documentacion docu) + { + try + { + bd.tipoproyecto_documentacion.Remove(docu); + bd.SaveChanges(); + + var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD"); + cambiarFecha.Fecha1 = DateTime.Now; + bd.enumeraciones.Update(cambiarFecha); + } + catch (Exception ex) + { + + } + } + public static List devolverListadoOrdenadoEnumeracion(tsHerramientasCACOA bd, string codigoEnumeracion) + { + return bd.enumeraciones.Where(x => x.Codigo.Contains(codigoEnumeracion + ".")).OrderBy(x => x.Orden).ToList(); + } + public enum TiposSimulaciones + { + CASA, + BAJA, + LICITACIONCASA, + URBAN, + URBANDSIMP + } + } +} diff --git a/HerramientaCASA/ViewModel/ClonarDespachoVM.cs b/HerramientaCASA/ViewModel/ClonarDespachoVM.cs new file mode 100644 index 0000000..4e2ef2f --- /dev/null +++ b/HerramientaCASA/ViewModel/ClonarDespachoVM.cs @@ -0,0 +1,11 @@ +using bdHerramientaCACOA; +using bdHerramientaCACOA.HerramientaURBAN; + +namespace HerramientaCASA.ViewModel +{ + public class ClonarDespachoVM + { + public int idSimulacion { get; set; } + public CASA.CASADespachoProfesional despachoProf { get; set; } = new CASA.CASADespachoProfesional(); + } +} diff --git a/HerramientaCASA/ViewModel/ConvenioProvincia.cs b/HerramientaCASA/ViewModel/ConvenioProvincia.cs new file mode 100644 index 0000000..2b817b6 --- /dev/null +++ b/HerramientaCASA/ViewModel/ConvenioProvincia.cs @@ -0,0 +1,23 @@ +namespace HerramientaCASA.ViewModel +{ + public class ConvenioProvincia + { + public int id { get; set; } = 0; + + public string? idProvincia { get; set; } = ""; + public string? NombreProvincia { get; set; } = ""; + + public int idGradoSup { get; set; } = 0; + public double valorGradoSup { get; set; } = 0; + + public int idGradoMedio { get; set; } = 0; + public double valorGradoMed { get; set; } = 0; + + public int idDelinPro { get; set; } = 0; + public double valorDelinPro { get; set; } = 0; + + public int idAdmin { get; set; } = 0; + public double valorAdmin { get; set; } = 0; + + } +} diff --git a/HerramientaCASA/ViewModel/LoginVM.cs b/HerramientaCASA/ViewModel/LoginVM.cs new file mode 100644 index 0000000..edacc42 --- /dev/null +++ b/HerramientaCASA/ViewModel/LoginVM.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace HerramientaCASA.ViewModel +{ + public class LoginVM + { + [Required(ErrorMessage = "El código es obligatorio.")] + public int? codigo { get; set; } + [Required(ErrorMessage = "La contraseña es obligatoria.")] + public string? password { get; set; } + } +} diff --git a/HerramientaCASA/appsettings.Development.json b/HerramientaCASA/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/HerramientaCASA/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/HerramientaCASA/appsettings.json b/HerramientaCASA/appsettings.json new file mode 100644 index 0000000..6a031a4 --- /dev/null +++ b/HerramientaCASA/appsettings.json @@ -0,0 +1,13 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ConnectionStrings": { + "WriteConnection": "Server=77.229.174.85;Port=22222;Database=herramientascacoa;User Id=cacoa;Password=cacoa2018-;", + "ReadOnlyConnection": "Server=77.229.174.85;Port=22222;Database=herramientascacoa;User Id=cacoa;Password=cacoa2018-;" + }, + "AllowedHosts": "*" +} diff --git a/HerramientaCASA/wwwroot/Content/Imagenes/CACOA-6.png b/HerramientaCASA/wwwroot/Content/Imagenes/CACOA-6.png new file mode 100644 index 0000000..01a28d8 Binary files /dev/null and b/HerramientaCASA/wwwroot/Content/Imagenes/CACOA-6.png differ diff --git a/HerramientaCASA/wwwroot/Content/Imagenes/logo_CACOA_alta.jpg b/HerramientaCASA/wwwroot/Content/Imagenes/logo_CACOA_alta.jpg new file mode 100644 index 0000000..e30c91c Binary files /dev/null and b/HerramientaCASA/wwwroot/Content/Imagenes/logo_CACOA_alta.jpg differ diff --git a/HerramientaCASA/wwwroot/Content/Site.css b/HerramientaCASA/wwwroot/Content/Site.css new file mode 100644 index 0000000..785fc3a --- /dev/null +++ b/HerramientaCASA/wwwroot/Content/Site.css @@ -0,0 +1,792 @@ + +body { + padding-top: 54px; + padding-bottom: 0px; +} + +.logoCacoa { + border-radius: 10px !important; +} +.navCACOA { + background-color: rgb(215 236 239) !important; + border-bottom: 1px solid #0098a6; +} + +.Fuente2 { + color: #79b6bc; +} + +.enlaceCACOA { + color: #004f58; + font-weight: bold +} + +.UpdateCacoa { + background-color: red; + color: white; + font-weight: bold; + padding: 5px; + padding-left:15px; +} + .UpdateCacoa span { + padding-top: 5px; + } + +.inputTabla { + padding: 0px; + font-size: 12px; + border: 1px solid gray; + width: 100%; + /* border-bottom: 1px solid; */ + border-radius: 5px; +} +.selectTabla { + width: 100%; + border-radius: 5px; + padding: 0px; +} +.tablaAlter { + +} + .tablaAlter tr td { + padding: 5px; + border: 1px solid black; + width: 280px; + } + +.tdAlter { + font-weight: bold; + background: #ffc107; + /*color: white;*/ +} + +.tdAlterSub { + background: #ffc107; + font-size:15px; + text-align:end; + /*color: white;*/ +} +.hrCasa { + color: #009fab; + height: 2px; +} + +.w4 { +width:40%; +} + +.separatorLine { + border-bottom: 2px solid lightgray; +} + +.TituloArea { + padding: 10px; + background-color: #a2ccd1 !important; + width: 100%; + left: 0; + top: 56px; + font-weight: bold; + color: white !important; + text-align: center; + position: sticky; + z-index: 900; +} + + .TituloArea a.navbar-brand { + color: white !important; + } + +.tituloZona { + font-weight: bold; + color: #007782; +} + +.tituloSubZona { + color: black; + font-weight: bold; +} + +.textoTotal { + color: #65b7c3 !important; + font-weight: bold; +} + +.Hide { + display: none !important; +} + +.fondoSuave { + background-color: #d7ecef; +} + +.comentario { + padding-top: 5px; +} + + .comentario b { + color: darkgray; + } + + .comentario i { + padding-left: 5px; + } + +.table-nowrap th, .table-nowrap td { + white-space: nowrap; +} + + .table-nowrap th:first-child { + position: sticky; + left: 0; + } + +.noSticky { + position: unset !important; +} + +.tHeadBlue { + background-color: #79b6bc !important; + color: white; +} + +.thLightBlue { + background-color: #a2ccd1 !important; + color: darkslategray; +} + +.darkgray { + color: darkgray; +} + +.btnBlue { + background-color: #057381 !important; + border-color: #3d959e !important; + border-radius: 5px; + color: #fff; + padding: 5px; + border: none; + padding-left: 10px; + padding-right: 10px; +} +.nomSim { + white-space: nowrap; + padding-top: 5px; +} + +.tabBorders { + border-left: 1px solid #dee2e6; + border-bottom: 1px solid #dee2e6; + border-right: 1px solid #dee2e6; +} + +.euros { + border: 1px solid #ced4da; + display: flex; + border-radius: 5px; + background-color: white; +} + + .euros:focus-within { + box-shadow: 0 0 0 0.25em rgb(13 110 253 / 25%) !important; + } + + .euros input { + border: 0; + width: calc(100% - 26px); + } + + .euros input:focus { + border: 0px !important; + box-shadow: 0 0 0 0 rgb(13 110 253 / 25%) !important; + } + + .euros i { + padding-top: 10px; + color: #899097; + } + +.filaInvisible { + display: none +} + +.euros-plaintext { + display: flex; +} + + .euros-plaintext:focus-within { + outline: -webkit-focus-ring-color auto 1px; + } + + .euros-plaintext input { + width: calc(100% - 26px); + } + + .euros-plaintext input:focus-visible { + outline: transparent !important; + } + + .euros-plaintext i { + padding-top: 10px; + color: #899097; + } + +#lblGuardado { + margin-right: 20px; + color: #034047; + opacity: 100; + -webkit-animation: fadeIn linear 5s forwards; + -moz-animation: fadeIn linear 5s forwards; + -o-animation: fadeIn linear 5s forwards; + -ms-animation: fadeIn linear 5s forwards; + animation: fadeIn linear 5s forwards; +} + +@keyframes fadeIn { + 0% { + opacity: 100; + } + + 100% { + opacity: 0; + } +} + +@-moz-keyframes fadeIn { + 0% { + opacity: 100; + } + + 100% { + opacity: 0; + } +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 100; + } + + 100% { + opacity: 0; + } +} + +@-o-keyframes fadeIn { + 0% { + opacity: 100; + } + + 100% { + opacity: 0; + } +} + +@-ms-keyframes fadeIn { + 0% { + opacity: 100; + } + + 100% { + opacity: 0; + } +} + +.colorA { + /*background-color: #a9d4db !important;*/ + background-color: white !important; +} + +.colorAMenu { + background-color: #a9d4db !important; +} + +.colorB { + /*background-color: #d8ebef !important;*/ + background-color: white !important; +} + +.colorBMenu { + background-color: #d8ebef !important; +} + +.colorC { + /*background-color: #65b7c3 !important;*/ + background-color: white !important; +} + +.colorCMenu { + background-color: #65b7c3 !important; +} + +.colorD { + background-color: #91c9d2 !important; +} + +.colorDMenu { + background-color: #91c9d2 !important; +} + +.colorE { + background-color: #4aafbb !important; +} + +.colorEMenu { + background-color: #4aafbb !important; +} + +.colorF { + background-color: #0098a6 !important; +} + +.colorFMenu { + background-color: #0098a6 !important; +} + +.colorFilasIntro { + /*background-color: #caf7f5 !important;*/ + background-color: white !important; +} + +.colorAMenu a, .colorBMenu a, .colorCMenu a, .colorDMenu a, .colorEMenu a, .colorFMenu a { + text-decoration: none; + color: black +} + +.colorAMenu:hover, .colorBMenu:hover, .colorCMenu:hover, .colorDMenu:hover, .colorEMenu:hover, .colorFMenu:hover { + background-color: #057381; +} + + .colorAMenu:hover a, .colorBMenu:hover a, .colorCMenu:hover a, .colorDMenu:hover a, .colorEMenu:hover a, .colorFMenu:hover a { + color: white; + } + +.navScroll { + display: inline-flex !important; + flex-wrap: nowrap !important; + width: 100% !important; + overflow-x: auto !important; + overflow-y: hidden !important; +} + +.tabScreenSize { + height: calc(100vh - 175px); + overflow: auto; +} + +.form-control + .input-group-addon:not(:first-child) { + border-left: 0; +} + +.input-group .form-control:not(:first-child), .input-group-addon:not(:first-child), .input-group-btn:not(:first-child) > .btn, .input-group-btn:not(:first-child) > .btn-group > .btn, .input-group-btn:not(:first-child) > .dropdown-toggle, .input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn, .input-group-btn:not(:last-child) > .btn:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-addon { + padding: .5rem .75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.25; + color: #495057; + text-align: center; + background-color: #79b6bc; + border: 1px solid rgba(0,0,0,.15); + border-left-color: rgba(0, 0, 0, 0.15); + border-left-style: solid; + border-left-width: 1px; + border-radius: .25rem; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + + .input-group-addon a { + color: white; + } + +.maxHeight { + height: calc(100vh - 40px) +} + +.btnGuardar { + background-color: #67abb2; + border-color: white; +} + +.paqueteEmpleado { + border: 2px solid #6c757d; + border-radius: 5px; + padding: 5px; +} + +.tituloEmpleados { + padding-left: 10px; + border-bottom: 1px solid; + padding-bottom: 5px; +} + +.trashbtn { + font-size: 15px; + padding: 0px; + padding-left: 5px; + padding-right: 5px; + background-color: transparent; + border: 0px; + color: #2a8a94; +} + +.fixHead { + position: relative; + padding: 5px; + top: 2px; +} + +/*Boostrap Tweaks*/ +td { + border-color: #737373 !important; +} +.headNav { + color: #65b7c3 !important; +} +.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link { + color: black; +} + + .nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { + font-weight: bold; + } + +.col-form-label { + font-weight: bold; +} + +.form-control-plaintext { + padding: 0.375rem 0.75rem !important; +} + +.textoPorcentaje { + text-align: right; + font-weight: bold; + color: gray; +} + +.close { + border: 0; + background-color: transparent; + color: #3d959e; +} + +.modal-title { + color: #3d959e; +} + +li.nav-item.active { + font-weight: bold; +} + +@media (max-width: 767px) { + .top-menu { + top: 6px; + right: 52px; + width: 100%; + } + + .top-menu > .navbar-nav > li { + float: none !important; + } +} + +@media (min-width: 768px) { + .top-menu { + margin-right: -15px; + } + + .top-auth-menu { + margin-left: auto; + } +} + +/*DevExpress stilos*/ +.btn-secondary { + color: #fff; + background-color: #2a8a94 !important; + border-color: #057381 !important; +} + +.dxbs-table { +} + + .dxbs-table th { + background-color: #67abb2 !important; + border-color: #057381 !important; + } + +.dxbs-fixed-header-content > a { + color: white; + text-decoration: none !important; +} + +.dxbs-icon { + color: #057381; +} + +a.nav-link:hover { + color: #078b98 !important; + /* font-weight: bold; */ +} + +.derecha { + text-align: end; + border-right: 1px solid #a2ccd1; + border-bottom: 1px solid #a2ccd1; +} + +.ulMenu li.nav-item { + /*border-right: 2px solid #afafb0;*/ + margin-left: 5px; +} + + .ulMenu li.nav-item a { + font-weight: bold; + } + +.ulMenu li.active a { + color: #018b98 !important; +} + +.ulMenu li.nav-item:last-child { + border-right: 0px solid #afafb0; +} + +@media (max-width: 992px) { + .ulMenu li.nav-item { + border-right: 0px solid #afafb0; + } +} + + +.dxbs-table tbody tr td a { + color: #004f58; + font-weight: bold; +} + +.page-item.active.page-number a { + background-color: #2a8a94; + border: 2px solid black; +} + +.page-link { + color: black; +} + +button.btn.btn-link.dxbs-button { + color: darkred; +} + +.disabled { + pointer-events: none; + background-color: #e9ecef; +} + +.back { + background: #057381; + width: 100%; + position: absolute; + top: 0; + bottom: 0; +} + +.div-center { + width: 400px; + height: 400px; + background-color: #fff; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; + max-width: 100%; + max-height: 100%; + overflow: auto; + padding: 1em 2em; + border-bottom: 2px solid #ccc; + display: table; +} + +div.content { + display: table-cell; + vertical-align: middle; +} + +.nav-link.active { + color: #078b98 !important; +} + +.formatoCampos { + flex-direction: column; + display: flex; +} + +.tituloLbl { + padding-bottom: 5px; + font-weight: bold; +} + +.inputForm { + padding: 0px !important; + padding-left:10px !important; + /*padding-right:10px;*/ +} + +.form-check-input:checked { + background-color: #018b98; + border-color: #0098a6; +} + + +.tablaCACOA { + /*margin-top: 50px;*/ + margin-top: 10px; + width: 100%; + border-collapse: collapse; + font-size: 12px; +} + +.tablaCACOA2 tr td { + padding:10px; +} + +.tablaCACOA thead tr th{ + text-align:center; +} + + .tablaCACOA th { + text-align: center; + background-color: #79b6bc !important; + color: white !important; + text-decoration: none !important; + /*padding: 20px;*/ + /*padding-inline: 30px;*/ + border-inline: solid 1px white; + } + + .tablaCACOA th .btn-link { + color: white; + } + + .tablaCACOA th a { + color: white !important; + text-decoration: none !important; + } + + .tablaCACOA th a:hover { + opacity: 0.6; + } + + .tablaCACOA td { +/* padding: 15px !important; + padding-inline: 30px !important;*/ + border: solid 1px black; + } + + +.tdAlineadoDerecha { + text-align: end; +} + +.formatoMoneda { + text-align: right; + padding-right: 5px !important; +} + +.CajaTab { + border: 1px solid #dee2e6; + border-top: 0px; +} + +.botonesTabla { + width: 80px; + text-align: center !important; +} + +.alturaTitulosTabla { + height: 35px; +} + +.btnTablasEspaciado { + display: flex; + justify-content: space-around; +} +.btnBorrarGuardar { + cursor: pointer; + font-size: 1.23em; +} + +/* Cambiar para ver como se ve el info */ +.tooltip .tooltip-inner { + background-color: #e0f0ff !important; + color: #000 !important; + font-style: italic; + font-size: 0.9rem; +} + +.columna3Ancho { + width: 3%; +} + +.columna10Ancho { + width: 10%; +} + +.columna20Ancho{ + width:20%; +} + +.columna30Ancho { + width: 30%; +} + +.columna40Ancho { + width: 40%; +} + +.columna50Ancho { + width: 50%; +} + + +.separadorMoneda { + margin-right: 8px; + gap:3px; +} + +/**Esto es para que el "no hay mas registros" no tenga margenes*/ +.my-5 { + margin-top:0px !important; + margin-bottom:0px !important; +} + +.form-check { + display: flex; + align-items: center; +} + +.checkTabla div { + min-height: 12px; +} +.checkGordo { + padding: 0; + width: 13px; + height: 13px; + border: 1px solid #057381 !important; +} + +.TituloVentana { + font-weight: bold; + background-color: #018b98; + color: white; + padding: 10px; + padding-left: 15px; + margin-bottom:0px; +} \ No newline at end of file diff --git a/HerramientaCASA/wwwroot/Content/all.min.css b/HerramientaCASA/wwwroot/Content/all.min.css new file mode 100644 index 0000000..be25496 --- /dev/null +++ b/HerramientaCASA/wwwroot/Content/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.4.0 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:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.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,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.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(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.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(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,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(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,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,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.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,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.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,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.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,.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-arrow-turn-right:before,.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(/Content/webfonts/fa-brands-400.woff2) format("woff2"),url(/Content/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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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(/Content/webfonts/fa-regular-400.woff2) format("woff2"),url(/Content/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(/Content/webfonts/fa-solid-900.woff2) format("woff2"),url(/Content/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(/Content/webfonts/fa-brands-400.woff2) format("woff2"),url(/Content/webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(/Content/webfonts/fa-solid-900.woff2) format("woff2"),url(/Content/webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(/Content/webfonts/fa-regular-400.woff2) format("woff2"),url(/Content/webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(/Content/webfonts/fa-solid-900.woff2) format("woff2"),url(/Content/webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(/Content/webfonts/fa-brands-400.woff2) format("woff2"),url(/Content/webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(/Content/webfonts/fa-regular-400.woff2) format("woff2"),url(/Content/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(/Content/webfonts/fa-v4compatibility.woff2) format("woff2"),url(/Content/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} \ No newline at end of file diff --git a/HerramientaCASA/wwwroot/Scripts/Util.js b/HerramientaCASA/wwwroot/Scripts/Util.js new file mode 100644 index 0000000..8454c2a --- /dev/null +++ b/HerramientaCASA/wwwroot/Scripts/Util.js @@ -0,0 +1,34 @@ +function pestanaActiva(pestana) { + var links = document.getElementsByClassName("navBarLink") + for (var i = 0; i < links.length; i++) { + if (links[i].classList.contains("linkNavActivo") == true) + links[i].classList.remove("linkNavActivo") + } + + if (document.getElementById(pestana).classList.contains("linkNavActivo") == false) { + document.getElementById(pestana).classList.add("linkNavActivo") + } +} + +function eliminarCookies(id, cut) { + var theCookies = document.cookie.split(';'); + for (var i = 0; i < theCookies.length; i++) { + if (theCookies[i].trim().indexOf(id) >= 0 && theCookies[i].trim().indexOf(cut) == -1) { + ASPxClientUtils.DeleteCookie(theCookies[i].trim().split("=")[0]) + } + } +} +function getUrlParameter(sParam) { + var sPageURL = window.location.search.substring(1), + sURLVariables = sPageURL.split('&'), + sParameterName, + i; + + for (i = 0; i < sURLVariables.length; i++) { + sParameterName = sURLVariables[i].split('='); + + if (sParameterName[0] === sParam) { + return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]); + } + } +}; \ No newline at end of file diff --git a/HerramientaCASA/wwwroot/Scripts/all.min.js b/HerramientaCASA/wwwroot/Scripts/all.min.js new file mode 100644 index 0000000..d354b44 --- /dev/null +++ b/HerramientaCASA/wwwroot/Scripts/all.min.js @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.4.0 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. + */ +!function(){"use strict";var c={},l={};try{"undefined"!=typeof window&&(c=window),"undefined"!=typeof document&&(l=document)}catch(c){}var s=(c.navigator||{}).userAgent,a=void 0===s?"":s,z=c,e=l;z.document,e.documentElement&&e.head&&"function"==typeof e.addEventListener&&e.createElement,~a.indexOf("MSIE")||a.indexOf("Trident/");function H(l,c){var s,a=Object.keys(l);return Object.getOwnPropertySymbols&&(s=Object.getOwnPropertySymbols(l),c&&(s=s.filter(function(c){return Object.getOwnPropertyDescriptor(l,c).enumerable})),a.push.apply(a,s)),a}function t(l){for(var c=1;cc.length)&&(l=c.length);for(var s=0,a=new Array(l);sc.length)&&(l=c.length);for(var s=0,a=new Array(l);sc.length)&&(l=c.length);for(var s=0,a=new Array(l);sc.length)&&(l=c.length);for(var s=0,a=new Array(l);s>>0;s--;)l[s]=c[s];return l}function a1(c){return c.classList?s1(c.classList):(c.getAttribute("class")||"").split(" ").filter(function(c){return c})}function z1(c){return"".concat(c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function e1(s){return Object.keys(s||{}).reduce(function(c,l){return c+"".concat(l,": ").concat(s[l].trim(),";")},"")}function H1(c){return c.size!==J.size||c.x!==J.x||c.y!==J.y||c.rotate!==J.rotate||c.flipX||c.flipY}function t1(){var c,l,s=b,a=Q.cssPrefix,z=Q.replacementClass,e=':host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Solid";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Regular";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Light";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Thin";--fa-font-duotone:normal 900 1em/1 "Font Awesome 6 Duotone";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-light:normal 300 1em/1 "Font Awesome 6 Sharp";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}svg:not(:host).svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible;box-sizing:content-box}.svg-inline--fa{display:var(--fa-display,inline-block);height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-2xs{vertical-align:.1em}.svg-inline--fa.fa-xs{vertical-align:0}.svg-inline--fa.fa-sm{vertical-align:-.0714285705em}.svg-inline--fa.fa-lg{vertical-align:-.2em}.svg-inline--fa.fa-xl{vertical-align:-.25em}.svg-inline--fa.fa-2xl{vertical-align:-.3125em}.svg-inline--fa.fa-pull-left{margin-right:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-pull-right{margin-left:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-li{width:var(--fa-li-width,2em);top:.25em}.svg-inline--fa.fa-fw{width:var(--fa-fw-width,1.25em)}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:var(--fa-counter-background-color,#ff253a);border-radius:var(--fa-counter-border-radius,1em);box-sizing:border-box;color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);max-width:var(--fa-counter-max-width,5em);min-width:var(--fa-counter-min-width,1.5em);overflow:hidden;padding:var(--fa-counter-padding,.25em .5em);right:var(--fa-right,0);text-overflow:ellipsis;top:var(--fa-top,0);-webkit-transform:scale(var(--fa-counter-scale,.25));transform:scale(var(--fa-counter-scale,.25));-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:var(--fa-bottom,0);right:var(--fa-right,0);top:auto;-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:var(--fa-bottom,0);left:var(--fa-left,0);right:auto;top:auto;-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{top:var(--fa-top,0);right:var(--fa-right,0);-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:var(--fa-left,0);right:auto;top:var(--fa-top,0);-webkit-transform:scale(var(--fa-layers-scale,.25));transform:scale(var(--fa-layers-scale,.25));-webkit-transform-origin:top left;transform-origin:top left}.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:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.0833333337em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.0714285718em;vertical-align:.0535714295em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.0416666682em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.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-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.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(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name: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);-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(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-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);-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(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,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-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,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{-webkit-animation-name:fa-spin;animation-name: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);-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,1) translateY(0);transform:scale(1,1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}100%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}100%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1,1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.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%,100%{opacity:var(--fa-beat-fade-opacity,.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)}24%,8%{-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)}100%,40%{-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}24%,8%{-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)}100%,40%{-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.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:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;vertical-align:middle;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;z-index:var(--fa-stack-z-index,auto)}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-sr-only,.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fa-sr-only-focusable:not(:focus),.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}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor);opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fa-duotone.fa-inverse,.fad.fa-inverse{color:var(--fa-inverse,#fff)}';return"fa"===a&&z===s||(c=new RegExp("\\.".concat("fa","\\-"),"g"),l=new RegExp("\\--".concat("fa","\\-"),"g"),s=new RegExp("\\.".concat(s),"g"),e=e.replace(c,".".concat(a,"-")).replace(l,"--".concat(a,"-")).replace(s,".".concat(z))),e}var V1=!1;function r1(){Q.autoAddCss&&!V1&&(function(c){if(c&&L){var l=C.createElement("style");l.setAttribute("type","text/css"),l.innerHTML=c;for(var s=C.head.childNodes,a=null,z=s.length-1;-1").concat(a.map(o1).join(""),"")}function f1(c,l,s){if(c&&c[l]&&c[l][s])return{prefix:l,iconName:s,icon:c[l][s]}}L&&((i1=(C.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(C.readyState))||C.addEventListener("DOMContentLoaded",M1));function v1(c,l,s,a){for(var z,e,H=Object.keys(c),t=H.length,V=void 0!==a?C1(l,a):l,r=void 0===s?(z=1,c[H[0]]):(z=0,s);z t.has(e) && t.get(e).get(i) || null, remove(e, i) { if (!t.has(e)) return; const n = t.get(e); n.delete(i), 0 === n.size && t.delete(e) } }, i = "transitionend", n = t => (t && window.CSS && window.CSS.escape && (t = t.replace(/#([^\s"#']+)/g, ((t, e) => `#${CSS.escape(e)}`))), t), s = t => { t.dispatchEvent(new Event(i)) }, o = t => !(!t || "object" != typeof t) && (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), r = t => o(t) ? t.jquery ? t[0] : t : "string" == typeof t && t.length > 0 ? document.querySelector(n(t)) : null, a = t => { if (!o(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 }, l = t => !t || t.nodeType !== Node.ELEMENT_NODE || !!t.classList.contains("disabled") || (void 0 !== t.disabled ? t.disabled : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")), c = 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 ? c(t.parentNode) : null }, h = () => { }, d = t => { t.offsetHeight }, u = () => window.jQuery && !document.body.hasAttribute("data-bs-no-jquery") ? window.jQuery : null, f = [], p = () => "rtl" === document.documentElement.dir, m = t => { var e; e = () => { const e = u(); if (e) { const i = t.NAME, n = e.fn[i]; e.fn[i] = t.jQueryInterface, e.fn[i].Constructor = t, e.fn[i].noConflict = () => (e.fn[i] = n, t.jQueryInterface) } }, "loading" === document.readyState ? (f.length || document.addEventListener("DOMContentLoaded", (() => { for (const t of f) t() })), f.push(e)) : e() }, g = (t, e = [], i = t) => "function" == typeof t ? t(...e) : i, _ = (t, e, n = !0) => { if (!n) return void g(t); const o = (t => { if (!t) return 0; let { transitionDuration: e, transitionDelay: i } = window.getComputedStyle(t); const n = Number.parseFloat(e), s = Number.parseFloat(i); return n || s ? (e = e.split(",")[0], i = i.split(",")[0], 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) : 0 })(e) + 5; let r = !1; const a = ({ target: n }) => { n === e && (r = !0, e.removeEventListener(i, a), g(t)) }; e.addEventListener(i, a), setTimeout((() => { r || s(e) }), o) }, b = (t, e, i, n) => { const s = t.length; let o = t.indexOf(e); return -1 === o ? !i && n ? t[s - 1] : t[0] : (o += i ? 1 : -1, n && (o = (o + s) % s), t[Math.max(0, Math.min(o, s - 1))]) }, v = /[^.]*(?=\..*)\.|.*/, y = /\..*/, w = /::\d+$/, A = {}; let E = 1; const T = { mouseenter: "mouseover", mouseleave: "mouseout" }, C = 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 O(t, e) { return e && `${e}::${E++}` || t.uidEvent || E++ } function x(t) { const e = O(t); return t.uidEvent = e, A[e] = A[e] || {}, A[e] } function k(t, e, i = null) { return Object.values(t).find((t => t.callable === e && t.delegationSelector === i)) } function L(t, e, i) { const n = "string" == typeof e, s = n ? i : e || i; let o = I(t); return C.has(o) || (o = t), [n, s, o] } function S(t, e, i, n, s) { if ("string" != typeof e || !t) return; let [o, r, a] = L(e, i, n); if (e in T) { 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 = x(t), c = l[a] || (l[a] = {}), h = k(c, r, o ? i : null); if (h) return void (h.oneOff = h.oneOff && s); const d = O(r, e.replace(v, "")), u = o ? function (t, e, i) { return function n(s) { const o = t.querySelectorAll(e); for (let { target: r } = s; r && r !== this; r = r.parentNode)for (const a of o) if (a === r) return P(s, { delegateTarget: r }), n.oneOff && N.off(t, s.type, e, i), i.apply(r, [s]) } }(t, i, r) : function (t, e) { return function i(n) { return P(n, { delegateTarget: t }), i.oneOff && N.off(t, n.type, e), e.apply(t, [n]) } }(t, r); u.delegationSelector = o ? i : null, u.callable = r, u.oneOff = s, u.uidEvent = d, c[d] = u, t.addEventListener(a, u, o) } function D(t, e, i, n, s) { const o = k(e[i], n, s); o && (t.removeEventListener(i, o, Boolean(s)), delete e[i][o.uidEvent]) } function $(t, e, i, n) { const s = e[i] || {}; for (const [o, r] of Object.entries(s)) o.includes(n) && D(t, e, i, r.callable, r.delegationSelector) } function I(t) { return t = t.replace(y, ""), T[t] || t } const N = { on(t, e, i, n) { S(t, e, i, n, !1) }, one(t, e, i, n) { S(t, e, i, n, !0) }, off(t, e, i, n) { if ("string" != typeof e || !t) return; const [s, o, r] = L(e, i, n), a = r !== e, l = x(t), c = l[r] || {}, h = e.startsWith("."); if (void 0 === o) { if (h) for (const i of Object.keys(l)) $(t, l, i, e.slice(1)); for (const [i, n] of Object.entries(c)) { const s = i.replace(w, ""); a && !e.includes(s) || D(t, l, r, n.callable, n.delegationSelector) } } else { if (!Object.keys(c).length) return; D(t, l, r, o, s ? i : null) } }, trigger(t, e, i) { if ("string" != typeof e || !t) return null; const n = u(); let s = null, o = !0, r = !0, a = !1; e !== I(e) && n && (s = n.Event(e, i), n(t).trigger(s), o = !s.isPropagationStopped(), r = !s.isImmediatePropagationStopped(), a = s.isDefaultPrevented()); const l = P(new Event(e, { bubbles: o, cancelable: !0 }), i); return a && l.preventDefault(), r && t.dispatchEvent(l), l.defaultPrevented && s && s.preventDefault(), l } }; function P(t, e = {}) { for (const [i, n] of Object.entries(e)) try { t[i] = n } catch (e) { Object.defineProperty(t, i, { configurable: !0, get: () => n }) } return t } function j(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 M(t) { return t.replace(/[A-Z]/g, (t => `-${t.toLowerCase()}`)) } const F = { setDataAttribute(t, e, i) { t.setAttribute(`data-bs-${M(e)}`, i) }, removeDataAttribute(t, e) { t.removeAttribute(`data-bs-${M(e)}`) }, getDataAttributes(t) { if (!t) return {}; const e = {}, i = Object.keys(t.dataset).filter((t => t.startsWith("bs") && !t.startsWith("bsConfig"))); for (const n of i) { let i = n.replace(/^bs/, ""); i = i.charAt(0).toLowerCase() + i.slice(1, i.length), e[i] = j(t.dataset[n]) } return e }, getDataAttribute: (t, e) => j(t.getAttribute(`data-bs-${M(e)}`)) }; class H { 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 = o(e) ? F.getDataAttribute(e, "config") : {}; return { ...this.constructor.Default, ..."object" == typeof i ? i : {}, ...o(e) ? F.getDataAttributes(e) : {}, ..."object" == typeof t ? t : {} } } _typeCheckConfig(t, e = this.constructor.DefaultType) { for (const [n, s] of Object.entries(e)) { const e = t[n], r = o(e) ? "element" : null == (i = e) ? `${i}` : Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase(); if (!new RegExp(s).test(r)) throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`) } var i } } class W extends H { constructor(t, i) { super(), (t = r(t)) && (this._element = t, this._config = this._getConfig(i), e.set(this._element, this.constructor.DATA_KEY, this)) } dispose() { e.remove(this._element, this.constructor.DATA_KEY), N.off(this._element, this.constructor.EVENT_KEY); for (const t of Object.getOwnPropertyNames(this)) this[t] = null } _queueCallback(t, e, i = !0) { _(t, e, i) } _getConfig(t) { return t = this._mergeConfigObj(t, this._element), t = this._configAfterMerge(t), this._typeCheckConfig(t), t } static getInstance(t) { return e.get(r(t), this.DATA_KEY) } static getOrCreateInstance(t, e = {}) { return this.getInstance(t) || new this(t, "object" == typeof e ? e : null) } static get VERSION() { return "5.3.3" } 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 B = t => { let e = t.getAttribute("data-bs-target"); if (!e || "#" === e) { let i = t.getAttribute("href"); if (!i || !i.includes("#") && !i.startsWith(".")) return null; i.includes("#") && !i.startsWith("#") && (i = `#${i.split("#")[1]}`), e = i && "#" !== i ? i.trim() : null } return e ? e.split(",").map((t => n(t))).join(",") : null }, z = { find: (t, e = document.documentElement) => [].concat(...Element.prototype.querySelectorAll.call(e, t)), findOne: (t, e = document.documentElement) => Element.prototype.querySelector.call(e, t), children: (t, e) => [].concat(...t.children).filter((t => t.matches(e))), parents(t, e) { const i = []; let n = t.parentNode.closest(e); for (; n;)i.push(n), n = n.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 => !l(t) && a(t))) }, getSelectorFromElement(t) { const e = B(t); return e && z.findOne(e) ? e : null }, getElementFromSelector(t) { const e = B(t); return e ? z.findOne(e) : null }, getMultipleElementsFromSelector(t) { const e = B(t); return e ? z.find(e) : [] } }, R = (t, e = "hide") => { const i = `click.dismiss${t.EVENT_KEY}`, n = t.NAME; N.on(document, i, `[data-bs-dismiss="${n}"]`, (function (i) { if (["A", "AREA"].includes(this.tagName) && i.preventDefault(), l(this)) return; const s = z.getElementFromSelector(this) || this.closest(`.${n}`); t.getOrCreateInstance(s)[e]() })) }, q = ".bs.alert", V = `close${q}`, K = `closed${q}`; class Q extends W { static get NAME() { return "alert" } close() { if (N.trigger(this._element, V).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(), N.trigger(this._element, K), this.dispose() } static jQueryInterface(t) { return this.each((function () { const e = Q.getOrCreateInstance(this); if ("string" == typeof t) { if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); e[t](this) } })) } } R(Q, "close"), m(Q); const X = '[data-bs-toggle="button"]'; class Y 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 = Y.getOrCreateInstance(this); "toggle" === t && e[t]() })) } } N.on(document, "click.bs.button.data-api", X, (t => { t.preventDefault(); const e = t.target.closest(X); Y.getOrCreateInstance(e).toggle() })), m(Y); const U = ".bs.swipe", G = `touchstart${U}`, J = `touchmove${U}`, Z = `touchend${U}`, tt = `pointerdown${U}`, et = `pointerup${U}`, it = { endCallback: null, leftCallback: null, rightCallback: null }, nt = { endCallback: "(function|null)", leftCallback: "(function|null)", rightCallback: "(function|null)" }; class st extends H { constructor(t, e) { super(), this._element = t, t && st.isSupported() && (this._config = this._getConfig(e), this._deltaX = 0, this._supportPointerEvents = Boolean(window.PointerEvent), this._initEvents()) } static get Default() { return it } static get DefaultType() { return nt } static get NAME() { return "swipe" } dispose() { N.off(this._element, U) } _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(), g(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 && g(e > 0 ? this._config.rightCallback : this._config.leftCallback) } _initEvents() { this._supportPointerEvents ? (N.on(this._element, tt, (t => this._start(t))), N.on(this._element, et, (t => this._end(t))), this._element.classList.add("pointer-event")) : (N.on(this._element, G, (t => this._start(t))), N.on(this._element, J, (t => this._move(t))), N.on(this._element, Z, (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 ot = ".bs.carousel", rt = ".data-api", at = "next", lt = "prev", ct = "left", ht = "right", dt = `slide${ot}`, ut = `slid${ot}`, ft = `keydown${ot}`, pt = `mouseenter${ot}`, mt = `mouseleave${ot}`, gt = `dragstart${ot}`, _t = `load${ot}${rt}`, bt = `click${ot}${rt}`, vt = "carousel", yt = "active", wt = ".active", At = ".carousel-item", Et = wt + At, Tt = { ArrowLeft: ht, ArrowRight: ct }, Ct = { interval: 5e3, keyboard: !0, pause: "hover", ride: !1, touch: !0, wrap: !0 }, Ot = { interval: "(number|boolean)", keyboard: "boolean", pause: "(string|boolean)", ride: "(boolean|string)", touch: "boolean", wrap: "boolean" }; class xt 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 = z.findOne(".carousel-indicators", this._element), this._addEventListeners(), this._config.ride === vt && this.cycle() } static get Default() { return Ct } static get DefaultType() { return Ot } static get NAME() { return "carousel" } next() { this._slide(at) } nextWhenVisible() { !document.hidden && a(this._element) && this.next() } prev() { this._slide(lt) } pause() { this._isSliding && s(this._element), this._clearInterval() } cycle() { this._clearInterval(), this._updateInterval(), this._interval = setInterval((() => this.nextWhenVisible()), this._config.interval) } _maybeEnableCycle() { this._config.ride && (this._isSliding ? N.one(this._element, ut, (() => this.cycle())) : this.cycle()) } to(t) { const e = this._getItems(); if (t > e.length - 1 || t < 0) return; if (this._isSliding) return void N.one(this._element, ut, (() => this.to(t))); const i = this._getItemIndex(this._getActive()); if (i === t) return; const n = t > i ? at : lt; this._slide(n, e[t]) } dispose() { this._swipeHelper && this._swipeHelper.dispose(), super.dispose() } _configAfterMerge(t) { return t.defaultInterval = t.interval, t } _addEventListeners() { this._config.keyboard && N.on(this._element, ft, (t => this._keydown(t))), "hover" === this._config.pause && (N.on(this._element, pt, (() => this.pause())), N.on(this._element, mt, (() => this._maybeEnableCycle()))), this._config.touch && st.isSupported() && this._addTouchEventListeners() } _addTouchEventListeners() { for (const t of z.find(".carousel-item img", this._element)) N.on(t, gt, (t => t.preventDefault())); const t = { leftCallback: () => this._slide(this._directionToOrder(ct)), rightCallback: () => this._slide(this._directionToOrder(ht)), endCallback: () => { "hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout((() => this._maybeEnableCycle()), 500 + this._config.interval)) } }; this._swipeHelper = new st(this._element, t) } _keydown(t) { if (/input|textarea/i.test(t.target.tagName)) return; const e = Tt[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 = z.findOne(wt, this._indicatorsElement); e.classList.remove(yt), e.removeAttribute("aria-current"); const i = z.findOne(`[data-bs-slide-to="${t}"]`, this._indicatorsElement); i && (i.classList.add(yt), 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(), n = t === at, s = e || b(this._getItems(), i, n, this._config.wrap); if (s === i) return; const o = this._getItemIndex(s), r = e => N.trigger(this._element, e, { relatedTarget: s, direction: this._orderToDirection(t), from: this._getItemIndex(i), to: o }); if (r(dt).defaultPrevented) return; if (!i || !s) return; const a = Boolean(this._interval); this.pause(), this._isSliding = !0, this._setActiveIndicatorElement(o), this._activeElement = s; const l = n ? "carousel-item-start" : "carousel-item-end", c = n ? "carousel-item-next" : "carousel-item-prev"; s.classList.add(c), d(s), i.classList.add(l), s.classList.add(l), this._queueCallback((() => { s.classList.remove(l, c), s.classList.add(yt), i.classList.remove(yt, c, l), this._isSliding = !1, r(ut) }), i, this._isAnimated()), a && this.cycle() } _isAnimated() { return this._element.classList.contains("slide") } _getActive() { return z.findOne(Et, this._element) } _getItems() { return z.find(At, this._element) } _clearInterval() { this._interval && (clearInterval(this._interval), this._interval = null) } _directionToOrder(t) { return p() ? t === ct ? lt : at : t === ct ? at : lt } _orderToDirection(t) { return p() ? t === lt ? ct : ht : t === lt ? ht : ct } static jQueryInterface(t) { return this.each((function () { const e = xt.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) })) } } N.on(document, bt, "[data-bs-slide], [data-bs-slide-to]", (function (t) { const e = z.getElementFromSelector(this); if (!e || !e.classList.contains(vt)) return; t.preventDefault(); const i = xt.getOrCreateInstance(e), n = this.getAttribute("data-bs-slide-to"); return n ? (i.to(n), void i._maybeEnableCycle()) : "next" === F.getDataAttribute(this, "slide") ? (i.next(), void i._maybeEnableCycle()) : (i.prev(), void i._maybeEnableCycle()) })), N.on(window, _t, (() => { const t = z.find('[data-bs-ride="carousel"]'); for (const e of t) xt.getOrCreateInstance(e) })), m(xt); const kt = ".bs.collapse", Lt = `show${kt}`, St = `shown${kt}`, Dt = `hide${kt}`, $t = `hidden${kt}`, It = `click${kt}.data-api`, Nt = "show", Pt = "collapse", jt = "collapsing", Mt = `:scope .${Pt} .${Pt}`, Ft = '[data-bs-toggle="collapse"]', Ht = { parent: null, toggle: !0 }, Wt = { parent: "(null|element)", toggle: "boolean" }; class Bt extends W { constructor(t, e) { super(t, e), this._isTransitioning = !1, this._triggerArray = []; const i = z.find(Ft); for (const t of i) { const e = z.getSelectorFromElement(t), i = z.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 Ht } 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 => Bt.getOrCreateInstance(t, { toggle: !1 })))), t.length && t[0]._isTransitioning) return; if (N.trigger(this._element, Lt).defaultPrevented) return; for (const e of t) e.hide(); const e = this._getDimension(); this._element.classList.remove(Pt), this._element.classList.add(jt), 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(jt), this._element.classList.add(Pt, Nt), this._element.style[e] = "", N.trigger(this._element, St) }), this._element, !0), this._element.style[e] = `${this._element[i]}px` } hide() { if (this._isTransitioning || !this._isShown()) return; if (N.trigger(this._element, Dt).defaultPrevented) return; const t = this._getDimension(); this._element.style[t] = `${this._element.getBoundingClientRect()[t]}px`, d(this._element), this._element.classList.add(jt), this._element.classList.remove(Pt, Nt); for (const t of this._triggerArray) { const e = z.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(jt), this._element.classList.add(Pt), N.trigger(this._element, $t) }), this._element, !0) } _isShown(t = this._element) { return t.classList.contains(Nt) } _configAfterMerge(t) { return t.toggle = Boolean(t.toggle), t.parent = r(t.parent), t } _getDimension() { return this._element.classList.contains("collapse-horizontal") ? "width" : "height" } _initializeChildren() { if (!this._config.parent) return; const t = this._getFirstLevelChildren(Ft); for (const e of t) { const t = z.getElementFromSelector(e); t && this._addAriaAndCollapsedClass([e], this._isShown(t)) } } _getFirstLevelChildren(t) { const e = z.find(Mt, this._config.parent); return z.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 = Bt.getOrCreateInstance(this, e); if ("string" == typeof t) { if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); i[t]() } })) } } N.on(document, It, Ft, (function (t) { ("A" === t.target.tagName || t.delegateTarget && "A" === t.delegateTarget.tagName) && t.preventDefault(); for (const t of z.getMultipleElementsFromSelector(this)) Bt.getOrCreateInstance(t, { toggle: !1 }).toggle() })), m(Bt); var zt = "top", Rt = "bottom", qt = "right", Vt = "left", Kt = "auto", Qt = [zt, Rt, qt, Vt], Xt = "start", Yt = "end", Ut = "clippingParents", Gt = "viewport", Jt = "popper", Zt = "reference", te = Qt.reduce((function (t, e) { return t.concat([e + "-" + Xt, e + "-" + Yt]) }), []), ee = [].concat(Qt, [Kt]).reduce((function (t, e) { return t.concat([e, e + "-" + Xt, e + "-" + Yt]) }), []), ie = "beforeRead", ne = "read", se = "afterRead", oe = "beforeMain", re = "main", ae = "afterMain", le = "beforeWrite", ce = "write", he = "afterWrite", de = [ie, ne, se, oe, re, ae, le, ce, he]; function ue(t) { return t ? (t.nodeName || "").toLowerCase() : null } function fe(t) { if (null == t) return window; if ("[object Window]" !== t.toString()) { var e = t.ownerDocument; return e && e.defaultView || window } return t } function pe(t) { return t instanceof fe(t).Element || t instanceof Element } function me(t) { return t instanceof fe(t).HTMLElement || t instanceof HTMLElement } function ge(t) { return "undefined" != typeof ShadowRoot && (t instanceof fe(t).ShadowRoot || t instanceof ShadowRoot) } const _e = { name: "applyStyles", enabled: !0, phase: "write", fn: function (t) { var e = t.state; Object.keys(e.elements).forEach((function (t) { var i = e.styles[t] || {}, n = e.attributes[t] || {}, s = e.elements[t]; me(s) && ue(s) && (Object.assign(s.style, i), Object.keys(n).forEach((function (t) { var e = n[t]; !1 === e ? s.removeAttribute(t) : s.setAttribute(t, !0 === e ? "" : e) }))) })) }, effect: function (t) { var e = t.state, i = { popper: { position: e.options.strategy, left: "0", top: "0", margin: "0" }, arrow: { position: "absolute" }, reference: {} }; return Object.assign(e.elements.popper.style, i.popper), e.styles = i, e.elements.arrow && Object.assign(e.elements.arrow.style, i.arrow), function () { Object.keys(e.elements).forEach((function (t) { var n = e.elements[t], s = e.attributes[t] || {}, o = Object.keys(e.styles.hasOwnProperty(t) ? e.styles[t] : i[t]).reduce((function (t, e) { return t[e] = "", t }), {}); me(n) && ue(n) && (Object.assign(n.style, o), Object.keys(s).forEach((function (t) { n.removeAttribute(t) }))) })) } }, requires: ["computeStyles"] }; function be(t) { return t.split("-")[0] } var ve = Math.max, ye = Math.min, we = Math.round; function Ae() { var t = navigator.userAgentData; return null != t && t.brands && Array.isArray(t.brands) ? t.brands.map((function (t) { return t.brand + "/" + t.version })).join(" ") : navigator.userAgent } function Ee() { return !/^((?!chrome|android).)*safari/i.test(Ae()) } function Te(t, e, i) { void 0 === e && (e = !1), void 0 === i && (i = !1); var n = t.getBoundingClientRect(), s = 1, o = 1; e && me(t) && (s = t.offsetWidth > 0 && we(n.width) / t.offsetWidth || 1, o = t.offsetHeight > 0 && we(n.height) / t.offsetHeight || 1); var r = (pe(t) ? fe(t) : window).visualViewport, a = !Ee() && i, l = (n.left + (a && r ? r.offsetLeft : 0)) / s, c = (n.top + (a && r ? r.offsetTop : 0)) / o, h = n.width / s, d = n.height / o; return { width: h, height: d, top: c, right: l + h, bottom: c + d, left: l, x: l, y: c } } function Ce(t) { var e = Te(t), i = t.offsetWidth, n = t.offsetHeight; return Math.abs(e.width - i) <= 1 && (i = e.width), Math.abs(e.height - n) <= 1 && (n = e.height), { x: t.offsetLeft, y: t.offsetTop, width: i, height: n } } function Oe(t, e) { var i = e.getRootNode && e.getRootNode(); if (t.contains(e)) return !0; if (i && ge(i)) { var n = e; do { if (n && t.isSameNode(n)) return !0; n = n.parentNode || n.host } while (n) } return !1 } function xe(t) { return fe(t).getComputedStyle(t) } function ke(t) { return ["table", "td", "th"].indexOf(ue(t)) >= 0 } function Le(t) { return ((pe(t) ? t.ownerDocument : t.document) || window.document).documentElement } function Se(t) { return "html" === ue(t) ? t : t.assignedSlot || t.parentNode || (ge(t) ? t.host : null) || Le(t) } function De(t) { return me(t) && "fixed" !== xe(t).position ? t.offsetParent : null } function $e(t) { for (var e = fe(t), i = De(t); i && ke(i) && "static" === xe(i).position;)i = De(i); return i && ("html" === ue(i) || "body" === ue(i) && "static" === xe(i).position) ? e : i || function (t) { var e = /firefox/i.test(Ae()); if (/Trident/i.test(Ae()) && me(t) && "fixed" === xe(t).position) return null; var i = Se(t); for (ge(i) && (i = i.host); me(i) && ["html", "body"].indexOf(ue(i)) < 0;) { var n = xe(i); if ("none" !== n.transform || "none" !== n.perspective || "paint" === n.contain || -1 !== ["transform", "perspective"].indexOf(n.willChange) || e && "filter" === n.willChange || e && n.filter && "none" !== n.filter) return i; i = i.parentNode } return null }(t) || e } function Ie(t) { return ["top", "bottom"].indexOf(t) >= 0 ? "x" : "y" } function Ne(t, e, i) { return ve(t, ye(e, i)) } function Pe(t) { return Object.assign({}, { top: 0, right: 0, bottom: 0, left: 0 }, t) } function je(t, e) { return e.reduce((function (e, i) { return e[i] = t, e }), {}) } const Me = { name: "arrow", enabled: !0, phase: "main", fn: function (t) { var e, i = t.state, n = t.name, s = t.options, o = i.elements.arrow, r = i.modifiersData.popperOffsets, a = be(i.placement), l = Ie(a), c = [Vt, qt].indexOf(a) >= 0 ? "height" : "width"; if (o && r) { var h = function (t, e) { return Pe("number" != typeof (t = "function" == typeof t ? t(Object.assign({}, e.rects, { placement: e.placement })) : t) ? t : je(t, Qt)) }(s.padding, i), d = Ce(o), u = "y" === l ? zt : Vt, f = "y" === l ? Rt : qt, p = i.rects.reference[c] + i.rects.reference[l] - r[l] - i.rects.popper[c], m = r[l] - i.rects.reference[l], g = $e(o), _ = g ? "y" === l ? g.clientHeight || 0 : g.clientWidth || 0 : 0, b = p / 2 - m / 2, v = h[u], y = _ - d[c] - h[f], w = _ / 2 - d[c] / 2 + b, A = Ne(v, w, y), E = l; i.modifiersData[n] = ((e = {})[E] = A, e.centerOffset = A - w, e) } }, effect: function (t) { var e = t.state, i = t.options.element, n = void 0 === i ? "[data-popper-arrow]" : i; null != n && ("string" != typeof n || (n = e.elements.popper.querySelector(n))) && Oe(e.elements.popper, n) && (e.elements.arrow = n) }, requires: ["popperOffsets"], requiresIfExists: ["preventOverflow"] }; function Fe(t) { return t.split("-")[1] } var He = { top: "auto", right: "auto", bottom: "auto", left: "auto" }; function We(t) { var e, i = t.popper, n = t.popperRect, s = t.placement, o = t.variation, r = t.offsets, a = t.position, l = t.gpuAcceleration, c = t.adaptive, h = t.roundOffsets, d = t.isFixed, u = r.x, f = void 0 === u ? 0 : u, p = r.y, m = void 0 === p ? 0 : p, g = "function" == typeof h ? h({ x: f, y: m }) : { x: f, y: m }; f = g.x, m = g.y; var _ = r.hasOwnProperty("x"), b = r.hasOwnProperty("y"), v = Vt, y = zt, w = window; if (c) { var A = $e(i), E = "clientHeight", T = "clientWidth"; A === fe(i) && "static" !== xe(A = Le(i)).position && "absolute" === a && (E = "scrollHeight", T = "scrollWidth"), (s === zt || (s === Vt || s === qt) && o === Yt) && (y = Rt, m -= (d && A === w && w.visualViewport ? w.visualViewport.height : A[E]) - n.height, m *= l ? 1 : -1), s !== Vt && (s !== zt && s !== Rt || o !== Yt) || (v = qt, f -= (d && A === w && w.visualViewport ? w.visualViewport.width : A[T]) - n.width, f *= l ? 1 : -1) } var C, O = Object.assign({ position: a }, c && He), x = !0 === h ? function (t, e) { var i = t.x, n = t.y, s = e.devicePixelRatio || 1; return { x: we(i * s) / s || 0, y: we(n * s) / s || 0 } }({ x: f, y: m }, fe(i)) : { x: f, y: m }; return f = x.x, m = x.y, l ? Object.assign({}, O, ((C = {})[y] = b ? "0" : "", C[v] = _ ? "0" : "", C.transform = (w.devicePixelRatio || 1) <= 1 ? "translate(" + f + "px, " + m + "px)" : "translate3d(" + f + "px, " + m + "px, 0)", C)) : Object.assign({}, O, ((e = {})[y] = b ? m + "px" : "", e[v] = _ ? f + "px" : "", e.transform = "", e)) } const Be = { name: "computeStyles", enabled: !0, phase: "beforeWrite", fn: function (t) { var e = t.state, i = t.options, n = i.gpuAcceleration, s = void 0 === n || n, o = i.adaptive, r = void 0 === o || o, a = i.roundOffsets, l = void 0 === a || a, c = { placement: be(e.placement), variation: Fe(e.placement), popper: e.elements.popper, popperRect: e.rects.popper, gpuAcceleration: s, isFixed: "fixed" === e.options.strategy }; null != e.modifiersData.popperOffsets && (e.styles.popper = Object.assign({}, e.styles.popper, We(Object.assign({}, c, { offsets: e.modifiersData.popperOffsets, position: e.options.strategy, adaptive: r, roundOffsets: l })))), null != e.modifiersData.arrow && (e.styles.arrow = Object.assign({}, e.styles.arrow, We(Object.assign({}, c, { offsets: e.modifiersData.arrow, position: "absolute", adaptive: !1, roundOffsets: l })))), e.attributes.popper = Object.assign({}, e.attributes.popper, { "data-popper-placement": e.placement }) }, data: {} }; var ze = { passive: !0 }; const Re = { name: "eventListeners", enabled: !0, phase: "write", fn: function () { }, effect: function (t) { var e = t.state, i = t.instance, n = t.options, s = n.scroll, o = void 0 === s || s, r = n.resize, a = void 0 === r || r, l = fe(e.elements.popper), c = [].concat(e.scrollParents.reference, e.scrollParents.popper); return o && c.forEach((function (t) { t.addEventListener("scroll", i.update, ze) })), a && l.addEventListener("resize", i.update, ze), function () { o && c.forEach((function (t) { t.removeEventListener("scroll", i.update, ze) })), a && l.removeEventListener("resize", i.update, ze) } }, data: {} }; var qe = { left: "right", right: "left", bottom: "top", top: "bottom" }; function Ve(t) { return t.replace(/left|right|bottom|top/g, (function (t) { return qe[t] })) } var Ke = { start: "end", end: "start" }; function Qe(t) { return t.replace(/start|end/g, (function (t) { return Ke[t] })) } function Xe(t) { var e = fe(t); return { scrollLeft: e.pageXOffset, scrollTop: e.pageYOffset } } function Ye(t) { return Te(Le(t)).left + Xe(t).scrollLeft } function Ue(t) { var e = xe(t), i = e.overflow, n = e.overflowX, s = e.overflowY; return /auto|scroll|overlay|hidden/.test(i + s + n) } function Ge(t) { return ["html", "body", "#document"].indexOf(ue(t)) >= 0 ? t.ownerDocument.body : me(t) && Ue(t) ? t : Ge(Se(t)) } function Je(t, e) { var i; void 0 === e && (e = []); var n = Ge(t), s = n === (null == (i = t.ownerDocument) ? void 0 : i.body), o = fe(n), r = s ? [o].concat(o.visualViewport || [], Ue(n) ? n : []) : n, a = e.concat(r); return s ? a : a.concat(Je(Se(r))) } function Ze(t) { return Object.assign({}, t, { left: t.x, top: t.y, right: t.x + t.width, bottom: t.y + t.height }) } function ti(t, e, i) { return e === Gt ? Ze(function (t, e) { var i = fe(t), n = Le(t), s = i.visualViewport, o = n.clientWidth, r = n.clientHeight, a = 0, l = 0; if (s) { o = s.width, r = s.height; var c = Ee(); (c || !c && "fixed" === e) && (a = s.offsetLeft, l = s.offsetTop) } return { width: o, height: r, x: a + Ye(t), y: l } }(t, i)) : pe(e) ? function (t, e) { var i = Te(t, !1, "fixed" === e); return i.top = i.top + t.clientTop, i.left = i.left + t.clientLeft, i.bottom = i.top + t.clientHeight, i.right = i.left + t.clientWidth, i.width = t.clientWidth, i.height = t.clientHeight, i.x = i.left, i.y = i.top, i }(e, i) : Ze(function (t) { var e, i = Le(t), n = Xe(t), s = null == (e = t.ownerDocument) ? void 0 : e.body, o = ve(i.scrollWidth, i.clientWidth, s ? s.scrollWidth : 0, s ? s.clientWidth : 0), r = ve(i.scrollHeight, i.clientHeight, s ? s.scrollHeight : 0, s ? s.clientHeight : 0), a = -n.scrollLeft + Ye(t), l = -n.scrollTop; return "rtl" === xe(s || i).direction && (a += ve(i.clientWidth, s ? s.clientWidth : 0) - o), { width: o, height: r, x: a, y: l } }(Le(t))) } function ei(t) { var e, i = t.reference, n = t.element, s = t.placement, o = s ? be(s) : null, r = s ? Fe(s) : null, a = i.x + i.width / 2 - n.width / 2, l = i.y + i.height / 2 - n.height / 2; switch (o) { case zt: e = { x: a, y: i.y - n.height }; break; case Rt: e = { x: a, y: i.y + i.height }; break; case qt: e = { x: i.x + i.width, y: l }; break; case Vt: e = { x: i.x - n.width, y: l }; break; default: e = { x: i.x, y: i.y } }var c = o ? Ie(o) : null; if (null != c) { var h = "y" === c ? "height" : "width"; switch (r) { case Xt: e[c] = e[c] - (i[h] / 2 - n[h] / 2); break; case Yt: e[c] = e[c] + (i[h] / 2 - n[h] / 2) } } return e } function ii(t, e) { void 0 === e && (e = {}); var i = e, n = i.placement, s = void 0 === n ? t.placement : n, o = i.strategy, r = void 0 === o ? t.strategy : o, a = i.boundary, l = void 0 === a ? Ut : a, c = i.rootBoundary, h = void 0 === c ? Gt : c, d = i.elementContext, u = void 0 === d ? Jt : d, f = i.altBoundary, p = void 0 !== f && f, m = i.padding, g = void 0 === m ? 0 : m, _ = Pe("number" != typeof g ? g : je(g, Qt)), b = u === Jt ? Zt : Jt, v = t.rects.popper, y = t.elements[p ? b : u], w = function (t, e, i, n) { var s = "clippingParents" === e ? function (t) { var e = Je(Se(t)), i = ["absolute", "fixed"].indexOf(xe(t).position) >= 0 && me(t) ? $e(t) : t; return pe(i) ? e.filter((function (t) { return pe(t) && Oe(t, i) && "body" !== ue(t) })) : [] }(t) : [].concat(e), o = [].concat(s, [i]), r = o[0], a = o.reduce((function (e, i) { var s = ti(t, i, n); return e.top = ve(s.top, e.top), e.right = ye(s.right, e.right), e.bottom = ye(s.bottom, e.bottom), e.left = ve(s.left, e.left), e }), ti(t, r, n)); return a.width = a.right - a.left, a.height = a.bottom - a.top, a.x = a.left, a.y = a.top, a }(pe(y) ? y : y.contextElement || Le(t.elements.popper), l, h, r), A = Te(t.elements.reference), E = ei({ reference: A, element: v, strategy: "absolute", placement: s }), T = Ze(Object.assign({}, v, E)), C = u === Jt ? T : A, O = { top: w.top - C.top + _.top, bottom: C.bottom - w.bottom + _.bottom, left: w.left - C.left + _.left, right: C.right - w.right + _.right }, x = t.modifiersData.offset; if (u === Jt && x) { var k = x[s]; Object.keys(O).forEach((function (t) { var e = [qt, Rt].indexOf(t) >= 0 ? 1 : -1, i = [zt, Rt].indexOf(t) >= 0 ? "y" : "x"; O[t] += k[i] * e })) } return O } function ni(t, e) { void 0 === e && (e = {}); var i = e, n = i.placement, s = i.boundary, o = i.rootBoundary, r = i.padding, a = i.flipVariations, l = i.allowedAutoPlacements, c = void 0 === l ? ee : l, h = Fe(n), d = h ? a ? te : te.filter((function (t) { return Fe(t) === h })) : Qt, u = d.filter((function (t) { return c.indexOf(t) >= 0 })); 0 === u.length && (u = d); var f = u.reduce((function (e, i) { return e[i] = ii(t, { placement: i, boundary: s, rootBoundary: o, padding: r })[be(i)], e }), {}); return Object.keys(f).sort((function (t, e) { return f[t] - f[e] })) } const si = { name: "flip", enabled: !0, phase: "main", fn: function (t) { var e = t.state, i = t.options, n = t.name; if (!e.modifiersData[n]._skip) { for (var s = i.mainAxis, o = void 0 === s || s, r = i.altAxis, a = void 0 === r || r, l = i.fallbackPlacements, c = i.padding, h = i.boundary, d = i.rootBoundary, u = i.altBoundary, f = i.flipVariations, p = void 0 === f || f, m = i.allowedAutoPlacements, g = e.options.placement, _ = be(g), b = l || (_ !== g && p ? function (t) { if (be(t) === Kt) return []; var e = Ve(t); return [Qe(t), e, Qe(e)] }(g) : [Ve(g)]), v = [g].concat(b).reduce((function (t, i) { return t.concat(be(i) === Kt ? ni(e, { placement: i, boundary: h, rootBoundary: d, padding: c, flipVariations: p, allowedAutoPlacements: m }) : i) }), []), y = e.rects.reference, w = e.rects.popper, A = new Map, E = !0, T = v[0], C = 0; C < v.length; C++) { var O = v[C], x = be(O), k = Fe(O) === Xt, L = [zt, Rt].indexOf(x) >= 0, S = L ? "width" : "height", D = ii(e, { placement: O, boundary: h, rootBoundary: d, altBoundary: u, padding: c }), $ = L ? k ? qt : Vt : k ? Rt : zt; y[S] > w[S] && ($ = Ve($)); var I = Ve($), N = []; if (o && N.push(D[x] <= 0), a && N.push(D[$] <= 0, D[I] <= 0), N.every((function (t) { return t }))) { T = O, E = !1; break } A.set(O, N) } if (E) for (var P = function (t) { var e = v.find((function (e) { var i = A.get(e); if (i) return i.slice(0, t).every((function (t) { return t })) })); if (e) return T = e, "break" }, j = p ? 3 : 1; j > 0 && "break" !== P(j); j--); e.placement !== T && (e.modifiersData[n]._skip = !0, e.placement = T, e.reset = !0) } }, requiresIfExists: ["offset"], data: { _skip: !1 } }; function oi(t, e, i) { return void 0 === i && (i = { x: 0, y: 0 }), { top: t.top - e.height - i.y, right: t.right - e.width + i.x, bottom: t.bottom - e.height + i.y, left: t.left - e.width - i.x } } function ri(t) { return [zt, qt, Rt, Vt].some((function (e) { return t[e] >= 0 })) } const ai = { name: "hide", enabled: !0, phase: "main", requiresIfExists: ["preventOverflow"], fn: function (t) { var e = t.state, i = t.name, n = e.rects.reference, s = e.rects.popper, o = e.modifiersData.preventOverflow, r = ii(e, { elementContext: "reference" }), a = ii(e, { altBoundary: !0 }), l = oi(r, n), c = oi(a, s, o), h = ri(l), d = ri(c); e.modifiersData[i] = { referenceClippingOffsets: l, popperEscapeOffsets: c, isReferenceHidden: h, hasPopperEscaped: d }, e.attributes.popper = Object.assign({}, e.attributes.popper, { "data-popper-reference-hidden": h, "data-popper-escaped": d }) } }, li = { name: "offset", enabled: !0, phase: "main", requires: ["popperOffsets"], fn: function (t) { var e = t.state, i = t.options, n = t.name, s = i.offset, o = void 0 === s ? [0, 0] : s, r = ee.reduce((function (t, i) { return t[i] = function (t, e, i) { var n = be(t), s = [Vt, zt].indexOf(n) >= 0 ? -1 : 1, o = "function" == typeof i ? i(Object.assign({}, e, { placement: t })) : i, r = o[0], a = o[1]; return r = r || 0, a = (a || 0) * s, [Vt, qt].indexOf(n) >= 0 ? { x: a, y: r } : { x: r, y: a } }(i, e.rects, o), t }), {}), a = r[e.placement], l = a.x, c = a.y; null != e.modifiersData.popperOffsets && (e.modifiersData.popperOffsets.x += l, e.modifiersData.popperOffsets.y += c), e.modifiersData[n] = r } }, ci = { name: "popperOffsets", enabled: !0, phase: "read", fn: function (t) { var e = t.state, i = t.name; e.modifiersData[i] = ei({ reference: e.rects.reference, element: e.rects.popper, strategy: "absolute", placement: e.placement }) }, data: {} }, hi = { name: "preventOverflow", enabled: !0, phase: "main", fn: function (t) { var e = t.state, i = t.options, n = t.name, s = i.mainAxis, o = void 0 === s || s, r = i.altAxis, a = void 0 !== r && r, l = i.boundary, c = i.rootBoundary, h = i.altBoundary, d = i.padding, u = i.tether, f = void 0 === u || u, p = i.tetherOffset, m = void 0 === p ? 0 : p, g = ii(e, { boundary: l, rootBoundary: c, padding: d, altBoundary: h }), _ = be(e.placement), b = Fe(e.placement), v = !b, y = Ie(_), w = "x" === y ? "y" : "x", A = e.modifiersData.popperOffsets, E = e.rects.reference, T = e.rects.popper, C = "function" == typeof m ? m(Object.assign({}, e.rects, { placement: e.placement })) : m, O = "number" == typeof C ? { mainAxis: C, altAxis: C } : Object.assign({ mainAxis: 0, altAxis: 0 }, C), x = e.modifiersData.offset ? e.modifiersData.offset[e.placement] : null, k = { x: 0, y: 0 }; if (A) { if (o) { var L, S = "y" === y ? zt : Vt, D = "y" === y ? Rt : qt, $ = "y" === y ? "height" : "width", I = A[y], N = I + g[S], P = I - g[D], j = f ? -T[$] / 2 : 0, M = b === Xt ? E[$] : T[$], F = b === Xt ? -T[$] : -E[$], H = e.elements.arrow, W = f && H ? Ce(H) : { width: 0, height: 0 }, B = e.modifiersData["arrow#persistent"] ? e.modifiersData["arrow#persistent"].padding : { top: 0, right: 0, bottom: 0, left: 0 }, z = B[S], R = B[D], q = Ne(0, E[$], W[$]), V = v ? E[$] / 2 - j - q - z - O.mainAxis : M - q - z - O.mainAxis, K = v ? -E[$] / 2 + j + q + R + O.mainAxis : F + q + R + O.mainAxis, Q = e.elements.arrow && $e(e.elements.arrow), X = Q ? "y" === y ? Q.clientTop || 0 : Q.clientLeft || 0 : 0, Y = null != (L = null == x ? void 0 : x[y]) ? L : 0, U = I + K - Y, G = Ne(f ? ye(N, I + V - Y - X) : N, I, f ? ve(P, U) : P); A[y] = G, k[y] = G - I } if (a) { var J, Z = "x" === y ? zt : Vt, tt = "x" === y ? Rt : qt, et = A[w], it = "y" === w ? "height" : "width", nt = et + g[Z], st = et - g[tt], ot = -1 !== [zt, Vt].indexOf(_), rt = null != (J = null == x ? void 0 : x[w]) ? J : 0, at = ot ? nt : et - E[it] - T[it] - rt + O.altAxis, lt = ot ? et + E[it] + T[it] - rt - O.altAxis : st, ct = f && ot ? function (t, e, i) { var n = Ne(t, e, i); return n > i ? i : n }(at, et, lt) : Ne(f ? at : nt, et, f ? lt : st); A[w] = ct, k[w] = ct - et } e.modifiersData[n] = k } }, requiresIfExists: ["offset"] }; function di(t, e, i) { void 0 === i && (i = !1); var n, s, o = me(e), r = me(e) && function (t) { var e = t.getBoundingClientRect(), i = we(e.width) / t.offsetWidth || 1, n = we(e.height) / t.offsetHeight || 1; return 1 !== i || 1 !== n }(e), a = Le(e), l = Te(t, r, i), c = { scrollLeft: 0, scrollTop: 0 }, h = { x: 0, y: 0 }; return (o || !o && !i) && (("body" !== ue(e) || Ue(a)) && (c = (n = e) !== fe(n) && me(n) ? { scrollLeft: (s = n).scrollLeft, scrollTop: s.scrollTop } : Xe(n)), me(e) ? ((h = Te(e, !0)).x += e.clientLeft, h.y += e.clientTop) : a && (h.x = Ye(a))), { x: l.left + c.scrollLeft - h.x, y: l.top + c.scrollTop - h.y, width: l.width, height: l.height } } function ui(t) { var e = new Map, i = new Set, n = []; function s(t) { i.add(t.name), [].concat(t.requires || [], t.requiresIfExists || []).forEach((function (t) { if (!i.has(t)) { var n = e.get(t); n && s(n) } })), n.push(t) } return t.forEach((function (t) { e.set(t.name, t) })), t.forEach((function (t) { i.has(t.name) || s(t) })), n } var fi = { placement: "bottom", modifiers: [], strategy: "absolute" }; function pi() { for (var t = arguments.length, e = new Array(t), i = 0; i < t; i++)e[i] = arguments[i]; return !e.some((function (t) { return !(t && "function" == typeof t.getBoundingClientRect) })) } function mi(t) { void 0 === t && (t = {}); var e = t, i = e.defaultModifiers, n = void 0 === i ? [] : i, s = e.defaultOptions, o = void 0 === s ? fi : s; return function (t, e, i) { void 0 === i && (i = o); var s, r, a = { placement: "bottom", orderedModifiers: [], options: Object.assign({}, fi, o), modifiersData: {}, elements: { reference: t, popper: e }, attributes: {}, styles: {} }, l = [], c = !1, h = { state: a, setOptions: function (i) { var s = "function" == typeof i ? i(a.options) : i; d(), a.options = Object.assign({}, o, a.options, s), a.scrollParents = { reference: pe(t) ? Je(t) : t.contextElement ? Je(t.contextElement) : [], popper: Je(e) }; var r, c, u = function (t) { var e = ui(t); return de.reduce((function (t, i) { return t.concat(e.filter((function (t) { return t.phase === i }))) }), []) }((r = [].concat(n, a.options.modifiers), c = r.reduce((function (t, e) { var i = t[e.name]; return t[e.name] = i ? Object.assign({}, i, e, { options: Object.assign({}, i.options, e.options), data: Object.assign({}, i.data, e.data) }) : e, t }), {}), Object.keys(c).map((function (t) { return c[t] })))); return a.orderedModifiers = u.filter((function (t) { return t.enabled })), a.orderedModifiers.forEach((function (t) { var e = t.name, i = t.options, n = void 0 === i ? {} : i, s = t.effect; if ("function" == typeof s) { var o = s({ state: a, name: e, instance: h, options: n }); l.push(o || function () { }) } })), h.update() }, forceUpdate: function () { if (!c) { var t = a.elements, e = t.reference, i = t.popper; if (pi(e, i)) { a.rects = { reference: di(e, $e(i), "fixed" === a.options.strategy), popper: Ce(i) }, a.reset = !1, a.placement = a.options.placement, a.orderedModifiers.forEach((function (t) { return a.modifiersData[t.name] = Object.assign({}, t.data) })); for (var n = 0; n < a.orderedModifiers.length; n++)if (!0 !== a.reset) { var s = a.orderedModifiers[n], o = s.fn, r = s.options, l = void 0 === r ? {} : r, d = s.name; "function" == typeof o && (a = o({ state: a, options: l, name: d, instance: h }) || a) } else a.reset = !1, n = -1 } } }, update: (s = function () { return new Promise((function (t) { h.forceUpdate(), t(a) })) }, function () { return r || (r = new Promise((function (t) { Promise.resolve().then((function () { r = void 0, t(s()) })) }))), r }), destroy: function () { d(), c = !0 } }; if (!pi(t, e)) return h; function d() { l.forEach((function (t) { return t() })), l = [] } return h.setOptions(i).then((function (t) { !c && i.onFirstUpdate && i.onFirstUpdate(t) })), h } } var gi = mi(), _i = mi({ defaultModifiers: [Re, ci, Be, _e] }), bi = mi({ defaultModifiers: [Re, ci, Be, _e, li, si, hi, Me, ai] }); const vi = Object.freeze(Object.defineProperty({ __proto__: null, afterMain: ae, afterRead: se, afterWrite: he, applyStyles: _e, arrow: Me, auto: Kt, basePlacements: Qt, beforeMain: oe, beforeRead: ie, beforeWrite: le, bottom: Rt, clippingParents: Ut, computeStyles: Be, createPopper: bi, createPopperBase: gi, createPopperLite: _i, detectOverflow: ii, end: Yt, eventListeners: Re, flip: si, hide: ai, left: Vt, main: re, modifierPhases: de, offset: li, placements: ee, popper: Jt, popperGenerator: mi, popperOffsets: ci, preventOverflow: hi, read: ne, reference: Zt, right: qt, start: Xt, top: zt, variationPlacements: te, viewport: Gt, write: ce }, Symbol.toStringTag, { value: "Module" })), yi = "dropdown", wi = ".bs.dropdown", Ai = ".data-api", Ei = "ArrowUp", Ti = "ArrowDown", Ci = `hide${wi}`, Oi = `hidden${wi}`, xi = `show${wi}`, ki = `shown${wi}`, Li = `click${wi}${Ai}`, Si = `keydown${wi}${Ai}`, Di = `keyup${wi}${Ai}`, $i = "show", Ii = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)', Ni = `${Ii}.${$i}`, Pi = ".dropdown-menu", ji = p() ? "top-end" : "top-start", Mi = p() ? "top-start" : "top-end", Fi = p() ? "bottom-end" : "bottom-start", Hi = p() ? "bottom-start" : "bottom-end", Wi = p() ? "left-start" : "right-start", Bi = p() ? "right-start" : "left-start", zi = { autoClose: !0, boundary: "clippingParents", display: "dynamic", offset: [0, 2], popperConfig: null, reference: "toggle" }, Ri = { autoClose: "(boolean|string)", boundary: "(string|element)", display: "string", offset: "(array|string|function)", popperConfig: "(null|object|function)", reference: "(string|element|object)" }; class qi extends W { constructor(t, e) { super(t, e), this._popper = null, this._parent = this._element.parentNode, this._menu = z.next(this._element, Pi)[0] || z.prev(this._element, Pi)[0] || z.findOne(Pi, this._parent), this._inNavbar = this._detectNavbar() } static get Default() { return zi } static get DefaultType() { return Ri } static get NAME() { return yi } toggle() { return this._isShown() ? this.hide() : this.show() } show() { if (l(this._element) || this._isShown()) return; const t = { relatedTarget: this._element }; if (!N.trigger(this._element, xi, t).defaultPrevented) { if (this._createPopper(), "ontouchstart" in document.documentElement && !this._parent.closest(".navbar-nav")) for (const t of [].concat(...document.body.children)) N.on(t, "mouseover", h); this._element.focus(), this._element.setAttribute("aria-expanded", !0), this._menu.classList.add($i), this._element.classList.add($i), N.trigger(this._element, ki, t) } } hide() { if (l(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 (!N.trigger(this._element, Ci, t).defaultPrevented) { if ("ontouchstart" in document.documentElement) for (const t of [].concat(...document.body.children)) N.off(t, "mouseover", h); this._popper && this._popper.destroy(), this._menu.classList.remove($i), this._element.classList.remove($i), this._element.setAttribute("aria-expanded", "false"), F.removeDataAttribute(this._menu, "popper"), N.trigger(this._element, Oi, t) } } _getConfig(t) { if ("object" == typeof (t = super._getConfig(t)).reference && !o(t.reference) && "function" != typeof t.reference.getBoundingClientRect) throw new TypeError(`${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); return t } _createPopper() { if (void 0 === vi) throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); let t = this._element; "parent" === this._config.reference ? t = this._parent : o(this._config.reference) ? t = r(this._config.reference) : "object" == typeof this._config.reference && (t = this._config.reference); const e = this._getPopperConfig(); this._popper = bi(t, this._menu, e) } _isShown() { return this._menu.classList.contains($i) } _getPlacement() { const t = this._parent; if (t.classList.contains("dropend")) return Wi; if (t.classList.contains("dropstart")) return Bi; 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 ? Mi : ji : e ? Hi : Fi } _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) && (F.setDataAttribute(this._menu, "popper", "static"), t.modifiers = [{ name: "applyStyles", enabled: !1 }]), { ...t, ...g(this._config.popperConfig, [t]) } } _selectMenuItem({ key: t, target: e }) { const i = z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter((t => a(t))); i.length && b(i, e, t === Ti, !i.includes(e)).focus() } static jQueryInterface(t) { return this.each((function () { const e = qi.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 = z.find(Ni); for (const i of e) { const e = qi.getInstance(i); if (!e || !1 === e._config.autoClose) continue; const n = t.composedPath(), s = n.includes(e._menu); if (n.includes(e._element) || "inside" === e._config.autoClose && !s || "outside" === e._config.autoClose && s) 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, n = [Ei, Ti].includes(t.key); if (!n && !i) return; if (e && !i) return; t.preventDefault(); const s = this.matches(Ii) ? this : z.prev(this, Ii)[0] || z.next(this, Ii)[0] || z.findOne(Ii, t.delegateTarget.parentNode), o = qi.getOrCreateInstance(s); if (n) return t.stopPropagation(), o.show(), void o._selectMenuItem(t); o._isShown() && (t.stopPropagation(), o.hide(), s.focus()) } } N.on(document, Si, Ii, qi.dataApiKeydownHandler), N.on(document, Si, Pi, qi.dataApiKeydownHandler), N.on(document, Li, qi.clearMenus), N.on(document, Di, qi.clearMenus), N.on(document, Li, Ii, (function (t) { t.preventDefault(), qi.getOrCreateInstance(this).toggle() })), m(qi); const Vi = "backdrop", Ki = "show", Qi = `mousedown.bs.${Vi}`, Xi = { className: "modal-backdrop", clickCallback: null, isAnimated: !1, isVisible: !0, rootElement: "body" }, Yi = { className: "string", clickCallback: "(function|null)", isAnimated: "boolean", isVisible: "boolean", rootElement: "(element|string)" }; class Ui extends H { constructor(t) { super(), this._config = this._getConfig(t), this._isAppended = !1, this._element = null } static get Default() { return Xi } static get DefaultType() { return Yi } static get NAME() { return Vi } show(t) { if (!this._config.isVisible) return void g(t); this._append(); const e = this._getElement(); this._config.isAnimated && d(e), e.classList.add(Ki), this._emulateAnimation((() => { g(t) })) } hide(t) { this._config.isVisible ? (this._getElement().classList.remove(Ki), this._emulateAnimation((() => { this.dispose(), g(t) }))) : g(t) } dispose() { this._isAppended && (N.off(this._element, Qi), 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 = r(t.rootElement), t } _append() { if (this._isAppended) return; const t = this._getElement(); this._config.rootElement.append(t), N.on(t, Qi, (() => { g(this._config.clickCallback) })), this._isAppended = !0 } _emulateAnimation(t) { _(t, this._getElement(), this._config.isAnimated) } } const Gi = ".bs.focustrap", Ji = `focusin${Gi}`, Zi = `keydown.tab${Gi}`, tn = "backward", en = { autofocus: !0, trapElement: null }, nn = { autofocus: "boolean", trapElement: "element" }; class sn extends H { constructor(t) { super(), this._config = this._getConfig(t), this._isActive = !1, this._lastTabNavDirection = null } static get Default() { return en } static get DefaultType() { return nn } static get NAME() { return "focustrap" } activate() { this._isActive || (this._config.autofocus && this._config.trapElement.focus(), N.off(document, Gi), N.on(document, Ji, (t => this._handleFocusin(t))), N.on(document, Zi, (t => this._handleKeydown(t))), this._isActive = !0) } deactivate() { this._isActive && (this._isActive = !1, N.off(document, Gi)) } _handleFocusin(t) { const { trapElement: e } = this._config; if (t.target === document || t.target === e || e.contains(t.target)) return; const i = z.focusableChildren(e); 0 === i.length ? e.focus() : this._lastTabNavDirection === tn ? i[i.length - 1].focus() : i[0].focus() } _handleKeydown(t) { "Tab" === t.key && (this._lastTabNavDirection = t.shiftKey ? tn : "forward") } } const on = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", rn = ".sticky-top", an = "padding-right", ln = "margin-right"; class cn { 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, an, (e => e + t)), this._setElementAttributes(on, an, (e => e + t)), this._setElementAttributes(rn, ln, (e => e - t)) } reset() { this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, an), this._resetElementAttributes(on, an), this._resetElementAttributes(rn, ln) } isOverflowing() { return this.getWidth() > 0 } _disableOverFlow() { this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden" } _setElementAttributes(t, e, i) { const n = this.getWidth(); this._applyManipulationCallback(t, (t => { if (t !== this._element && window.innerWidth > t.clientWidth + n) return; this._saveInitialAttribute(t, e); const s = window.getComputedStyle(t).getPropertyValue(e); t.style.setProperty(e, `${i(Number.parseFloat(s))}px`) })) } _saveInitialAttribute(t, e) { const i = t.style.getPropertyValue(e); i && F.setDataAttribute(t, e, i) } _resetElementAttributes(t, e) { this._applyManipulationCallback(t, (t => { const i = F.getDataAttribute(t, e); null !== i ? (F.removeDataAttribute(t, e), t.style.setProperty(e, i)) : t.style.removeProperty(e) })) } _applyManipulationCallback(t, e) { if (o(t)) e(t); else for (const i of z.find(t, this._element)) e(i) } } const hn = ".bs.modal", dn = `hide${hn}`, un = `hidePrevented${hn}`, fn = `hidden${hn}`, pn = `show${hn}`, mn = `shown${hn}`, gn = `resize${hn}`, _n = `click.dismiss${hn}`, bn = `mousedown.dismiss${hn}`, vn = `keydown.dismiss${hn}`, yn = `click${hn}.data-api`, wn = "modal-open", An = "show", En = "modal-static", Tn = { backdrop: !0, focus: !0, keyboard: !0 }, Cn = { backdrop: "(boolean|string)", focus: "boolean", keyboard: "boolean" }; class On extends W { constructor(t, e) { super(t, e), this._dialog = z.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._isShown = !1, this._isTransitioning = !1, this._scrollBar = new cn, this._addEventListeners() } static get Default() { return Tn } static get DefaultType() { return Cn } static get NAME() { return "modal" } toggle(t) { return this._isShown ? this.hide() : this.show(t) } show(t) { this._isShown || this._isTransitioning || N.trigger(this._element, pn, { relatedTarget: t }).defaultPrevented || (this._isShown = !0, this._isTransitioning = !0, this._scrollBar.hide(), document.body.classList.add(wn), this._adjustDialog(), this._backdrop.show((() => this._showElement(t)))) } hide() { this._isShown && !this._isTransitioning && (N.trigger(this._element, dn).defaultPrevented || (this._isShown = !1, this._isTransitioning = !0, this._focustrap.deactivate(), this._element.classList.remove(An), this._queueCallback((() => this._hideModal()), this._element, this._isAnimated()))) } dispose() { N.off(window, hn), N.off(this._dialog, hn), this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() } handleUpdate() { this._adjustDialog() } _initializeBackDrop() { return new Ui({ isVisible: Boolean(this._config.backdrop), isAnimated: this._isAnimated() }) } _initializeFocusTrap() { return new sn({ 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 = z.findOne(".modal-body", this._dialog); e && (e.scrollTop = 0), d(this._element), this._element.classList.add(An), this._queueCallback((() => { this._config.focus && this._focustrap.activate(), this._isTransitioning = !1, N.trigger(this._element, mn, { relatedTarget: t }) }), this._dialog, this._isAnimated()) } _addEventListeners() { N.on(this._element, vn, (t => { "Escape" === t.key && (this._config.keyboard ? this.hide() : this._triggerBackdropTransition()) })), N.on(window, gn, (() => { this._isShown && !this._isTransitioning && this._adjustDialog() })), N.on(this._element, bn, (t => { N.one(this._element, _n, (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(wn), this._resetAdjustments(), this._scrollBar.reset(), N.trigger(this._element, fn) })) } _isAnimated() { return this._element.classList.contains("fade") } _triggerBackdropTransition() { if (N.trigger(this._element, un).defaultPrevented) return; const t = this._element.scrollHeight > document.documentElement.clientHeight, e = this._element.style.overflowY; "hidden" === e || this._element.classList.contains(En) || (t || (this._element.style.overflowY = "hidden"), this._element.classList.add(En), this._queueCallback((() => { this._element.classList.remove(En), 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 = On.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); i[t](e) } })) } } N.on(document, yn, '[data-bs-toggle="modal"]', (function (t) { const e = z.getElementFromSelector(this);["A", "AREA"].includes(this.tagName) && t.preventDefault(), N.one(e, pn, (t => { t.defaultPrevented || N.one(e, fn, (() => { a(this) && this.focus() })) })); const i = z.findOne(".modal.show"); i && On.getInstance(i).hide(), On.getOrCreateInstance(e).toggle(this) })), R(On), m(On); const xn = ".bs.offcanvas", kn = ".data-api", Ln = `load${xn}${kn}`, Sn = "show", Dn = "showing", $n = "hiding", In = ".offcanvas.show", Nn = `show${xn}`, Pn = `shown${xn}`, jn = `hide${xn}`, Mn = `hidePrevented${xn}`, Fn = `hidden${xn}`, Hn = `resize${xn}`, Wn = `click${xn}${kn}`, Bn = `keydown.dismiss${xn}`, zn = { backdrop: !0, keyboard: !0, scroll: !1 }, Rn = { backdrop: "(boolean|string)", keyboard: "boolean", scroll: "boolean" }; class qn 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 zn } static get DefaultType() { return Rn } static get NAME() { return "offcanvas" } toggle(t) { return this._isShown ? this.hide() : this.show(t) } show(t) { this._isShown || N.trigger(this._element, Nn, { relatedTarget: t }).defaultPrevented || (this._isShown = !0, this._backdrop.show(), this._config.scroll || (new cn).hide(), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.classList.add(Dn), this._queueCallback((() => { this._config.scroll && !this._config.backdrop || this._focustrap.activate(), this._element.classList.add(Sn), this._element.classList.remove(Dn), N.trigger(this._element, Pn, { relatedTarget: t }) }), this._element, !0)) } hide() { this._isShown && (N.trigger(this._element, jn).defaultPrevented || (this._focustrap.deactivate(), this._element.blur(), this._isShown = !1, this._element.classList.add($n), this._backdrop.hide(), this._queueCallback((() => { this._element.classList.remove(Sn, $n), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._config.scroll || (new cn).reset(), N.trigger(this._element, Fn) }), this._element, !0))) } dispose() { this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() } _initializeBackDrop() { const t = Boolean(this._config.backdrop); return new Ui({ className: "offcanvas-backdrop", isVisible: t, isAnimated: !0, rootElement: this._element.parentNode, clickCallback: t ? () => { "static" !== this._config.backdrop ? this.hide() : N.trigger(this._element, Mn) } : null }) } _initializeFocusTrap() { return new sn({ trapElement: this._element }) } _addEventListeners() { N.on(this._element, Bn, (t => { "Escape" === t.key && (this._config.keyboard ? this.hide() : N.trigger(this._element, Mn)) })) } static jQueryInterface(t) { return this.each((function () { const e = qn.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) } })) } } N.on(document, Wn, '[data-bs-toggle="offcanvas"]', (function (t) { const e = z.getElementFromSelector(this); if (["A", "AREA"].includes(this.tagName) && t.preventDefault(), l(this)) return; N.one(e, Fn, (() => { a(this) && this.focus() })); const i = z.findOne(In); i && i !== e && qn.getInstance(i).hide(), qn.getOrCreateInstance(e).toggle(this) })), N.on(window, Ln, (() => { for (const t of z.find(In)) qn.getOrCreateInstance(t).show() })), N.on(window, Hn, (() => { for (const t of z.find("[aria-modal][class*=show][class*=offcanvas-]")) "fixed" !== getComputedStyle(t).position && qn.getOrCreateInstance(t).hide() })), R(qn), m(qn); const Vn = { "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], a: ["target", "href", "title", "rel"], area: [], b: [], br: [], col: [], code: [], dd: [], div: [], dl: [], dt: [], 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: [] }, Kn = new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]), Qn = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i, Xn = (t, e) => { const i = t.nodeName.toLowerCase(); return e.includes(i) ? !Kn.has(i) || Boolean(Qn.test(t.nodeValue)) : e.filter((t => t instanceof RegExp)).some((t => t.test(i))) }, Yn = { allowList: Vn, content: {}, extraClass: "", html: !1, sanitize: !0, sanitizeFn: null, template: "
" }, Un = { allowList: "object", content: "object", extraClass: "(string|function)", html: "boolean", sanitize: "boolean", sanitizeFn: "(null|function)", template: "string" }, Gn = { entry: "(string|element|function|null)", selector: "(string|element)" }; class Jn extends H { constructor(t) { super(), this._config = this._getConfig(t) } static get Default() { return Yn } static get DefaultType() { return Un } 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 }, Gn) } _setContent(t, e, i) { const n = z.findOne(i, t); n && ((e = this._resolvePossibleFunction(e)) ? o(e) ? this._putElementInTemplate(r(e), n) : this._config.html ? n.innerHTML = this._maybeSanitize(e) : n.textContent = e : n.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 n = (new window.DOMParser).parseFromString(t, "text/html"), s = [].concat(...n.body.querySelectorAll("*")); for (const t of s) { const i = t.nodeName.toLowerCase(); if (!Object.keys(e).includes(i)) { t.remove(); continue } const n = [].concat(...t.attributes), s = [].concat(e["*"] || [], e[i] || []); for (const e of n) Xn(e, s) || t.removeAttribute(e.nodeName) } return n.body.innerHTML }(t, this._config.allowList, this._config.sanitizeFn) : t } _resolvePossibleFunction(t) { return g(t, [this]) } _putElementInTemplate(t, e) { if (this._config.html) return e.innerHTML = "", void e.append(t); e.textContent = t.textContent } } const Zn = new Set(["sanitize", "allowList", "sanitizeFn"]), ts = "fade", es = "show", is = ".modal", ns = "hide.bs.modal", ss = "hover", os = "focus", rs = { AUTO: "auto", TOP: "top", RIGHT: p() ? "left" : "right", BOTTOM: "bottom", LEFT: p() ? "right" : "left" }, as = { allowList: Vn, 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" }, ls = { 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 cs extends W { constructor(t, e) { if (void 0 === vi) 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 as } static get DefaultType() { return ls } 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), N.off(this._element.closest(is), ns, 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 = N.trigger(this._element, this.constructor.eventName("show")), e = (c(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: n } = this._config; if (this._element.ownerDocument.documentElement.contains(this.tip) || (n.append(i), N.trigger(this._element, this.constructor.eventName("inserted"))), this._popper = this._createPopper(i), i.classList.add(es), "ontouchstart" in document.documentElement) for (const t of [].concat(...document.body.children)) N.on(t, "mouseover", h); this._queueCallback((() => { N.trigger(this._element, this.constructor.eventName("shown")), !1 === this._isHovered && this._leave(), this._isHovered = !1 }), this.tip, this._isAnimated()) } hide() { if (this._isShown() && !N.trigger(this._element, this.constructor.eventName("hide")).defaultPrevented) { if (this._getTipElement().classList.remove(es), "ontouchstart" in document.documentElement) for (const t of [].concat(...document.body.children)) N.off(t, "mouseover", h); this._activeTrigger.click = !1, this._activeTrigger[os] = !1, this._activeTrigger[ss] = !1, this._isHovered = null, this._queueCallback((() => { this._isWithActiveTrigger() || (this._isHovered || this._disposePopper(), this._element.removeAttribute("aria-describedby"), N.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(ts, es), 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(ts), e } setContent(t) { this._newContent = t, this._isShown() && (this._disposePopper(), this.show()) } _getTemplateFactory(t) { return this._templateFactory ? this._templateFactory.changeContent(t) : this._templateFactory = new Jn({ ...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(ts) } _isShown() { return this.tip && this.tip.classList.contains(es) } _createPopper(t) { const e = g(this._config.placement, [this, t, this._element]), i = rs[e.toUpperCase()]; return bi(this._element, t, this._getPopperConfig(i)) } _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 g(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, ...g(this._config.popperConfig, [e]) } } _setListeners() { const t = this._config.trigger.split(" "); for (const e of t) if ("click" === e) N.on(this._element, this.constructor.eventName("click"), this._config.selector, (t => { this._initializeOnDelegatedTarget(t).toggle() })); else if ("manual" !== e) { const t = e === ss ? this.constructor.eventName("mouseenter") : this.constructor.eventName("focusin"), i = e === ss ? this.constructor.eventName("mouseleave") : this.constructor.eventName("focusout"); N.on(this._element, t, this._config.selector, (t => { const e = this._initializeOnDelegatedTarget(t); e._activeTrigger["focusin" === t.type ? os : ss] = !0, e._enter() })), N.on(this._element, i, this._config.selector, (t => { const e = this._initializeOnDelegatedTarget(t); e._activeTrigger["focusout" === t.type ? os : ss] = e._element.contains(t.relatedTarget), e._leave() })) } this._hideModalHandler = () => { this._element && this.hide() }, N.on(this._element.closest(is), ns, 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 = F.getDataAttributes(this._element); for (const t of Object.keys(e)) Zn.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 : r(t.container), "number" == typeof t.delay && (t.delay = { show: t.delay, hide: t.delay }), "number" == typeof t.title && (t.title = t.title.toString()), "number" == typeof t.content && (t.content = t.content.toString()), 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 = cs.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t]() } })) } } m(cs); const hs = { ...cs.Default, content: "", offset: [0, 8], placement: "right", template: '', trigger: "click" }, ds = { ...cs.DefaultType, content: "(null|string|element|function)" }; class us extends cs { static get Default() { return hs } static get DefaultType() { return ds } 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 = us.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t]() } })) } } m(us); const fs = ".bs.scrollspy", ps = `activate${fs}`, ms = `click${fs}`, gs = `load${fs}.data-api`, _s = "active", bs = "[href]", vs = ".nav-link", ys = `${vs}, .nav-item > ${vs}, .list-group-item`, ws = { offset: null, rootMargin: "0px 0px -25%", smoothScroll: !1, target: null, threshold: [.1, .5, 1] }, As = { offset: "(number|null)", rootMargin: "string", smoothScroll: "boolean", target: "element", threshold: "array" }; class Es 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 ws } static get DefaultType() { return As } 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 = r(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 && (N.off(this._config.target, ms), N.on(this._config.target, ms, bs, (t => { const e = this._observableSections.get(t.target.hash); if (e) { t.preventDefault(); const i = this._rootElement || window, n = e.offsetTop - this._element.offsetTop; if (i.scrollTo) return void i.scrollTo({ top: n, behavior: "smooth" }); i.scrollTop = n } }))) } _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)) }, n = (this._rootElement || document.documentElement).scrollTop, s = n >= this._previousScrollData.parentScrollTop; this._previousScrollData.parentScrollTop = n; 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 (s && t) { if (i(o), !n) return } else s || t || i(o) } } _initializeTargetsAndObservables() { this._targetLinks = new Map, this._observableSections = new Map; const t = z.find(bs, this._config.target); for (const e of t) { if (!e.hash || l(e)) continue; const t = z.findOne(decodeURI(e.hash), this._element); a(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(_s), this._activateParents(t), N.trigger(this._element, ps, { relatedTarget: t })) } _activateParents(t) { if (t.classList.contains("dropdown-item")) z.findOne(".dropdown-toggle", t.closest(".dropdown")).classList.add(_s); else for (const e of z.parents(t, ".nav, .list-group")) for (const t of z.prev(e, ys)) t.classList.add(_s) } _clearActiveClass(t) { t.classList.remove(_s); const e = z.find(`${bs}.${_s}`, t); for (const t of e) t.classList.remove(_s) } static jQueryInterface(t) { return this.each((function () { const e = Es.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]() } })) } } N.on(window, gs, (() => { for (const t of z.find('[data-bs-spy="scroll"]')) Es.getOrCreateInstance(t) })), m(Es); const Ts = ".bs.tab", Cs = `hide${Ts}`, Os = `hidden${Ts}`, xs = `show${Ts}`, ks = `shown${Ts}`, Ls = `click${Ts}`, Ss = `keydown${Ts}`, Ds = `load${Ts}`, $s = "ArrowLeft", Is = "ArrowRight", Ns = "ArrowUp", Ps = "ArrowDown", js = "Home", Ms = "End", Fs = "active", Hs = "fade", Ws = "show", Bs = ".dropdown-toggle", zs = `:not(${Bs})`, Rs = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', qs = `.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`, Vs = `.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`; class Ks extends W { constructor(t) { super(t), this._parent = this._element.closest('.list-group, .nav, [role="tablist"]'), this._parent && (this._setInitialAttributes(this._parent, this._getChildren()), N.on(this._element, Ss, (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 ? N.trigger(e, Cs, { relatedTarget: t }) : null; N.trigger(t, xs, { relatedTarget: e }).defaultPrevented || i && i.defaultPrevented || (this._deactivate(e, t), this._activate(t, e)) } _activate(t, e) { t && (t.classList.add(Fs), this._activate(z.getElementFromSelector(t)), this._queueCallback((() => { "tab" === t.getAttribute("role") ? (t.removeAttribute("tabindex"), t.setAttribute("aria-selected", !0), this._toggleDropDown(t, !0), N.trigger(t, ks, { relatedTarget: e })) : t.classList.add(Ws) }), t, t.classList.contains(Hs))) } _deactivate(t, e) { t && (t.classList.remove(Fs), t.blur(), this._deactivate(z.getElementFromSelector(t)), this._queueCallback((() => { "tab" === t.getAttribute("role") ? (t.setAttribute("aria-selected", !1), t.setAttribute("tabindex", "-1"), this._toggleDropDown(t, !1), N.trigger(t, Os, { relatedTarget: e })) : t.classList.remove(Ws) }), t, t.classList.contains(Hs))) } _keydown(t) { if (![$s, Is, Ns, Ps, js, Ms].includes(t.key)) return; t.stopPropagation(), t.preventDefault(); const e = this._getChildren().filter((t => !l(t))); let i; if ([js, Ms].includes(t.key)) i = e[t.key === js ? 0 : e.length - 1]; else { const n = [Is, Ps].includes(t.key); i = b(e, t.target, n, !0) } i && (i.focus({ preventScroll: !0 }), Ks.getOrCreateInstance(i).show()) } _getChildren() { return z.find(qs, 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 = z.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 n = (t, n) => { const s = z.findOne(t, i); s && s.classList.toggle(n, e) }; n(Bs, Fs), n(".dropdown-menu", Ws), i.setAttribute("aria-expanded", e) } _setAttributeIfNotExists(t, e, i) { t.hasAttribute(e) || t.setAttribute(e, i) } _elemIsActive(t) { return t.classList.contains(Fs) } _getInnerElement(t) { return t.matches(qs) ? t : z.findOne(qs, t) } _getOuterElement(t) { return t.closest(".nav-item, .list-group-item") || t } static jQueryInterface(t) { return this.each((function () { const e = Ks.getOrCreateInstance(this); if ("string" == typeof t) { if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); e[t]() } })) } } N.on(document, Ls, Rs, (function (t) { ["A", "AREA"].includes(this.tagName) && t.preventDefault(), l(this) || Ks.getOrCreateInstance(this).show() })), N.on(window, Ds, (() => { for (const t of z.find(Vs)) Ks.getOrCreateInstance(t) })), m(Ks); const Qs = ".bs.toast", Xs = `mouseover${Qs}`, Ys = `mouseout${Qs}`, Us = `focusin${Qs}`, Gs = `focusout${Qs}`, Js = `hide${Qs}`, Zs = `hidden${Qs}`, to = `show${Qs}`, eo = `shown${Qs}`, io = "hide", no = "show", so = "showing", oo = { animation: "boolean", autohide: "boolean", delay: "number" }, ro = { animation: !0, autohide: !0, delay: 5e3 }; class ao extends W { constructor(t, e) { super(t, e), this._timeout = null, this._hasMouseInteraction = !1, this._hasKeyboardInteraction = !1, this._setListeners() } static get Default() { return ro } static get DefaultType() { return oo } static get NAME() { return "toast" } show() { N.trigger(this._element, to).defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove(io), d(this._element), this._element.classList.add(no, so), this._queueCallback((() => { this._element.classList.remove(so), N.trigger(this._element, eo), this._maybeScheduleHide() }), this._element, this._config.animation)) } hide() { this.isShown() && (N.trigger(this._element, Js).defaultPrevented || (this._element.classList.add(so), this._queueCallback((() => { this._element.classList.add(io), this._element.classList.remove(so, no), N.trigger(this._element, Zs) }), this._element, this._config.animation))) } dispose() { this._clearTimeout(), this.isShown() && this._element.classList.remove(no), super.dispose() } isShown() { return this._element.classList.contains(no) } _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() { N.on(this._element, Xs, (t => this._onInteraction(t, !0))), N.on(this._element, Ys, (t => this._onInteraction(t, !1))), N.on(this._element, Us, (t => this._onInteraction(t, !0))), N.on(this._element, Gs, (t => this._onInteraction(t, !1))) } _clearTimeout() { clearTimeout(this._timeout), this._timeout = null } static jQueryInterface(t) { return this.each((function () { const e = ao.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t](this) } })) } } return R(ao), m(ao), { Alert: Q, Button: Y, Carousel: xt, Collapse: Bt, Dropdown: qi, Modal: On, Offcanvas: qn, Popover: us, ScrollSpy: Es, Tab: Ks, Toast: ao, Tooltip: cs } })); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/HerramientaCASA/wwwroot/Scripts/bootstrap.min.js b/HerramientaCASA/wwwroot/Scripts/bootstrap.min.js new file mode 100644 index 0000000..7722099 --- /dev/null +++ b/HerramientaCASA/wwwroot/Scripts/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.0.2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function (t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e(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) { if (t && t.__esModule) return t; var e = Object.create(null); return t && Object.keys(t).forEach((function (s) { if ("default" !== s) { var i = Object.getOwnPropertyDescriptor(t, s); Object.defineProperty(e, s, i.get ? i : { enumerable: !0, get: function () { return t[s] } }) } })), e.default = t, Object.freeze(e) } var s = e(t); const i = { 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 s = []; let i = t.parentNode; for (; i && i.nodeType === Node.ELEMENT_NODE && 3 !== i.nodeType;)i.matches(e) && s.push(i), i = i.parentNode; return s }, prev(t, e) { let s = t.previousElementSibling; for (; s;) { if (s.matches(e)) return [s]; s = s.previousElementSibling } return [] }, next(t, e) { let s = t.nextElementSibling; for (; s;) { if (s.matches(e)) return [s]; s = s.nextElementSibling } return [] } }, n = t => { do { t += Math.floor(1e6 * Math.random()) } while (document.getElementById(t)); return t }, o = t => { let e = t.getAttribute("data-bs-target"); if (!e || "#" === e) { let s = t.getAttribute("href"); if (!s || !s.includes("#") && !s.startsWith(".")) return null; s.includes("#") && !s.startsWith("#") && (s = "#" + s.split("#")[1]), e = s && "#" !== s ? s.trim() : null } return e }, r = t => { const e = o(t); return e && document.querySelector(e) ? e : null }, a = t => { const e = o(t); return e ? document.querySelector(e) : null }, l = t => { t.dispatchEvent(new Event("transitionend")) }, c = t => !(!t || "object" != typeof t) && (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), h = t => c(t) ? t.jquery ? t[0] : t : "string" == typeof t && t.length > 0 ? i.findOne(t) : null, d = (t, e, s) => { Object.keys(s).forEach(i => { const n = s[i], o = e[i], r = o && c(o) ? "element" : null == (a = o) ? "" + a : {}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase(); var a; if (!new RegExp(n).test(r)) throw new TypeError(`${t.toUpperCase()}: Option "${i}" provided type "${r}" but expected type "${n}".`) }) }, u = t => !(!c(t) || 0 === t.getClientRects().length) && "visible" === getComputedStyle(t).getPropertyValue("visibility"), g = t => !t || t.nodeType !== Node.ELEMENT_NODE || !!t.classList.contains("disabled") || (void 0 !== t.disabled ? t.disabled : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")), p = 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 ? p(t.parentNode) : null }, f = () => { }, m = t => t.offsetHeight, _ = () => { const { jQuery: t } = window; return t && !document.body.hasAttribute("data-bs-no-jquery") ? t : null }, b = [], v = () => "rtl" === document.documentElement.dir, y = t => { var e; e = () => { const e = _(); if (e) { const s = t.NAME, i = e.fn[s]; e.fn[s] = t.jQueryInterface, e.fn[s].Constructor = t, e.fn[s].noConflict = () => (e.fn[s] = i, t.jQueryInterface) } }, "loading" === document.readyState ? (b.length || document.addEventListener("DOMContentLoaded", () => { b.forEach(t => t()) }), b.push(e)) : e() }, w = t => { "function" == typeof t && t() }, E = (t, e, s = !0) => { if (!s) return void w(t); const i = (t => { if (!t) return 0; let { transitionDuration: e, transitionDelay: s } = window.getComputedStyle(t); const i = Number.parseFloat(e), n = Number.parseFloat(s); return i || n ? (e = e.split(",")[0], s = s.split(",")[0], 1e3 * (Number.parseFloat(e) + Number.parseFloat(s))) : 0 })(e) + 5; let n = !1; const o = ({ target: s }) => { s === e && (n = !0, e.removeEventListener("transitionend", o), w(t)) }; e.addEventListener("transitionend", o), setTimeout(() => { n || l(e) }, i) }, A = (t, e, s, i) => { let n = t.indexOf(e); if (-1 === n) return t[!s && i ? t.length - 1 : 0]; const o = t.length; return n += s ? 1 : -1, i && (n = (n + o) % o), t[Math.max(0, Math.min(n, o - 1))] }, T = /[^.]*(?=\..*)\.|.*/, C = /\..*/, k = /::\d+$/, L = {}; let O = 1; const D = { mouseenter: "mouseover", mouseleave: "mouseout" }, I = /^(mouseenter|mouseleave)/i, N = 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 S(t, e) { return e && `${e}::${O++}` || t.uidEvent || O++ } function x(t) { const e = S(t); return t.uidEvent = e, L[e] = L[e] || {}, L[e] } function M(t, e, s = null) { const i = Object.keys(t); for (let n = 0, o = i.length; n < o; n++) { const o = t[i[n]]; if (o.originalHandler === e && o.delegationSelector === s) return o } return null } function P(t, e, s) { const i = "string" == typeof e, n = i ? s : e; let o = R(t); return N.has(o) || (o = t), [i, n, o] } function j(t, e, s, i, n) { if ("string" != typeof e || !t) return; if (s || (s = i, i = null), I.test(e)) { const t = t => function (e) { if (!e.relatedTarget || e.relatedTarget !== e.delegateTarget && !e.delegateTarget.contains(e.relatedTarget)) return t.call(this, e) }; i ? i = t(i) : s = t(s) } const [o, r, a] = P(e, s, i), l = x(t), c = l[a] || (l[a] = {}), h = M(c, r, o ? s : null); if (h) return void (h.oneOff = h.oneOff && n); const d = S(r, e.replace(T, "")), u = o ? function (t, e, s) { return function i(n) { const o = t.querySelectorAll(e); for (let { target: r } = n; r && r !== this; r = r.parentNode)for (let a = o.length; a--;)if (o[a] === r) return n.delegateTarget = r, i.oneOff && B.off(t, n.type, e, s), s.apply(r, [n]); return null } }(t, s, i) : function (t, e) { return function s(i) { return i.delegateTarget = t, s.oneOff && B.off(t, i.type, e), e.apply(t, [i]) } }(t, s); u.delegationSelector = o ? s : null, u.originalHandler = r, u.oneOff = n, u.uidEvent = d, c[d] = u, t.addEventListener(a, u, o) } function H(t, e, s, i, n) { const o = M(e[s], i, n); o && (t.removeEventListener(s, o, Boolean(n)), delete e[s][o.uidEvent]) } function R(t) { return t = t.replace(C, ""), D[t] || t } const B = { on(t, e, s, i) { j(t, e, s, i, !1) }, one(t, e, s, i) { j(t, e, s, i, !0) }, off(t, e, s, i) { if ("string" != typeof e || !t) return; const [n, o, r] = P(e, s, i), a = r !== e, l = x(t), c = e.startsWith("."); if (void 0 !== o) { if (!l || !l[r]) return; return void H(t, l, r, o, n ? s : null) } c && Object.keys(l).forEach(s => { !function (t, e, s, i) { const n = e[s] || {}; Object.keys(n).forEach(o => { if (o.includes(i)) { const i = n[o]; H(t, e, s, i.originalHandler, i.delegationSelector) } }) }(t, l, s, e.slice(1)) }); const h = l[r] || {}; Object.keys(h).forEach(s => { const i = s.replace(k, ""); if (!a || e.includes(i)) { const e = h[s]; H(t, l, r, e.originalHandler, e.delegationSelector) } }) }, trigger(t, e, s) { if ("string" != typeof e || !t) return null; const i = _(), n = R(e), o = e !== n, r = N.has(n); let a, l = !0, c = !0, h = !1, d = null; return o && i && (a = i.Event(e, s), i(t).trigger(a), l = !a.isPropagationStopped(), c = !a.isImmediatePropagationStopped(), h = a.isDefaultPrevented()), r ? (d = document.createEvent("HTMLEvents"), d.initEvent(n, l, !0)) : d = new CustomEvent(e, { bubbles: l, cancelable: !0 }), void 0 !== s && Object.keys(s).forEach(t => { Object.defineProperty(d, t, { get: () => s[t] }) }), h && d.preventDefault(), c && t.dispatchEvent(d), d.defaultPrevented && void 0 !== a && a.preventDefault(), d } }, $ = new Map; var W = { set(t, e, s) { $.has(t) || $.set(t, new Map); const i = $.get(t); i.has(e) || 0 === i.size ? i.set(e, s) : console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`) }, get: (t, e) => $.has(t) && $.get(t).get(e) || null, remove(t, e) { if (!$.has(t)) return; const s = $.get(t); s.delete(e), 0 === s.size && $.delete(t) } }; class q { constructor(t) { (t = h(t)) && (this._element = t, W.set(this._element, this.constructor.DATA_KEY, this)) } dispose() { W.remove(this._element, this.constructor.DATA_KEY), B.off(this._element, this.constructor.EVENT_KEY), Object.getOwnPropertyNames(this).forEach(t => { this[t] = null }) } _queueCallback(t, e, s = !0) { E(t, e, s) } static getInstance(t) { return W.get(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.0.2" } static get NAME() { throw new Error('You have to implement the static method "NAME", for each component!') } static get DATA_KEY() { return "bs." + this.NAME } static get EVENT_KEY() { return "." + this.DATA_KEY } } class z extends q { static get NAME() { return "alert" } close(t) { const e = t ? this._getRootElement(t) : this._element, s = this._triggerCloseEvent(e); null === s || s.defaultPrevented || this._removeElement(e) } _getRootElement(t) { return a(t) || t.closest(".alert") } _triggerCloseEvent(t) { return B.trigger(t, "close.bs.alert") } _removeElement(t) { t.classList.remove("show"); const e = t.classList.contains("fade"); this._queueCallback(() => this._destroyElement(t), t, e) } _destroyElement(t) { t.remove(), B.trigger(t, "closed.bs.alert") } static jQueryInterface(t) { return this.each((function () { const e = z.getOrCreateInstance(this); "close" === t && e[t](this) })) } static handleDismiss(t) { return function (e) { e && e.preventDefault(), t.close(this) } } } B.on(document, "click.bs.alert.data-api", '[data-bs-dismiss="alert"]', z.handleDismiss(new z)), y(z); class F extends q { 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 = F.getOrCreateInstance(this); "toggle" === t && e[t]() })) } } function U(t) { return "true" === t || "false" !== t && (t === Number(t).toString() ? Number(t) : "" === t || "null" === t ? null : t) } function K(t) { return t.replace(/[A-Z]/g, t => "-" + t.toLowerCase()) } B.on(document, "click.bs.button.data-api", '[data-bs-toggle="button"]', t => { t.preventDefault(); const e = t.target.closest('[data-bs-toggle="button"]'); F.getOrCreateInstance(e).toggle() }), y(F); const V = { setDataAttribute(t, e, s) { t.setAttribute("data-bs-" + K(e), s) }, removeDataAttribute(t, e) { t.removeAttribute("data-bs-" + K(e)) }, getDataAttributes(t) { if (!t) return {}; const e = {}; return Object.keys(t.dataset).filter(t => t.startsWith("bs")).forEach(s => { let i = s.replace(/^bs/, ""); i = i.charAt(0).toLowerCase() + i.slice(1, i.length), e[i] = U(t.dataset[s]) }), e }, getDataAttribute: (t, e) => U(t.getAttribute("data-bs-" + K(e))), offset(t) { const e = t.getBoundingClientRect(); return { top: e.top + document.body.scrollTop, left: e.left + document.body.scrollLeft } }, position: t => ({ top: t.offsetTop, left: t.offsetLeft }) }, Q = { interval: 5e3, keyboard: !0, slide: !1, pause: "hover", wrap: !0, touch: !0 }, X = { interval: "(number|boolean)", keyboard: "boolean", slide: "(boolean|string)", pause: "(string|boolean)", wrap: "boolean", touch: "boolean" }, Y = "next", G = "prev", Z = "left", J = "right", tt = { ArrowLeft: J, ArrowRight: Z }; class et extends q { constructor(t, e) { super(t), this._items = null, this._interval = null, this._activeElement = null, this._isPaused = !1, this._isSliding = !1, this.touchTimeout = null, this.touchStartX = 0, this.touchDeltaX = 0, this._config = this._getConfig(e), this._indicatorsElement = i.findOne(".carousel-indicators", this._element), this._touchSupported = "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0, this._pointerEvent = Boolean(window.PointerEvent), this._addEventListeners() } static get Default() { return Q } static get NAME() { return "carousel" } next() { this._slide(Y) } nextWhenVisible() { !document.hidden && u(this._element) && this.next() } prev() { this._slide(G) } pause(t) { t || (this._isPaused = !0), i.findOne(".carousel-item-next, .carousel-item-prev", this._element) && (l(this._element), this.cycle(!0)), clearInterval(this._interval), this._interval = null } cycle(t) { t || (this._isPaused = !1), this._interval && (clearInterval(this._interval), this._interval = null), this._config && this._config.interval && !this._isPaused && (this._updateInterval(), this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval)) } to(t) { this._activeElement = i.findOne(".active.carousel-item", this._element); const e = this._getItemIndex(this._activeElement); if (t > this._items.length - 1 || t < 0) return; if (this._isSliding) return void B.one(this._element, "slid.bs.carousel", () => this.to(t)); if (e === t) return this.pause(), void this.cycle(); const s = t > e ? Y : G; this._slide(s, this._items[t]) } _getConfig(t) { return t = { ...Q, ...V.getDataAttributes(this._element), ..."object" == typeof t ? t : {} }, d("carousel", t, X), t } _handleSwipe() { const t = Math.abs(this.touchDeltaX); if (t <= 40) return; const e = t / this.touchDeltaX; this.touchDeltaX = 0, e && this._slide(e > 0 ? J : Z) } _addEventListeners() { this._config.keyboard && B.on(this._element, "keydown.bs.carousel", t => this._keydown(t)), "hover" === this._config.pause && (B.on(this._element, "mouseenter.bs.carousel", t => this.pause(t)), B.on(this._element, "mouseleave.bs.carousel", t => this.cycle(t))), this._config.touch && this._touchSupported && this._addTouchEventListeners() } _addTouchEventListeners() { const t = t => { !this._pointerEvent || "pen" !== t.pointerType && "touch" !== t.pointerType ? this._pointerEvent || (this.touchStartX = t.touches[0].clientX) : this.touchStartX = t.clientX }, e = t => { this.touchDeltaX = t.touches && t.touches.length > 1 ? 0 : t.touches[0].clientX - this.touchStartX }, s = t => { !this._pointerEvent || "pen" !== t.pointerType && "touch" !== t.pointerType || (this.touchDeltaX = t.clientX - this.touchStartX), this._handleSwipe(), "hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout(t => this.cycle(t), 500 + this._config.interval)) }; i.find(".carousel-item img", this._element).forEach(t => { B.on(t, "dragstart.bs.carousel", t => t.preventDefault()) }), this._pointerEvent ? (B.on(this._element, "pointerdown.bs.carousel", e => t(e)), B.on(this._element, "pointerup.bs.carousel", t => s(t)), this._element.classList.add("pointer-event")) : (B.on(this._element, "touchstart.bs.carousel", e => t(e)), B.on(this._element, "touchmove.bs.carousel", t => e(t)), B.on(this._element, "touchend.bs.carousel", t => s(t))) } _keydown(t) { if (/input|textarea/i.test(t.target.tagName)) return; const e = tt[t.key]; e && (t.preventDefault(), this._slide(e)) } _getItemIndex(t) { return this._items = t && t.parentNode ? i.find(".carousel-item", t.parentNode) : [], this._items.indexOf(t) } _getItemByOrder(t, e) { const s = t === Y; return A(this._items, e, s, this._config.wrap) } _triggerSlideEvent(t, e) { const s = this._getItemIndex(t), n = this._getItemIndex(i.findOne(".active.carousel-item", this._element)); return B.trigger(this._element, "slide.bs.carousel", { relatedTarget: t, direction: e, from: n, to: s }) } _setActiveIndicatorElement(t) { if (this._indicatorsElement) { const e = i.findOne(".active", this._indicatorsElement); e.classList.remove("active"), e.removeAttribute("aria-current"); const s = i.find("[data-bs-target]", this._indicatorsElement); for (let e = 0; e < s.length; e++)if (Number.parseInt(s[e].getAttribute("data-bs-slide-to"), 10) === this._getItemIndex(t)) { s[e].classList.add("active"), s[e].setAttribute("aria-current", "true"); break } } } _updateInterval() { const t = this._activeElement || i.findOne(".active.carousel-item", this._element); if (!t) return; const e = Number.parseInt(t.getAttribute("data-bs-interval"), 10); e ? (this._config.defaultInterval = this._config.defaultInterval || this._config.interval, this._config.interval = e) : this._config.interval = this._config.defaultInterval || this._config.interval } _slide(t, e) { const s = this._directionToOrder(t), n = i.findOne(".active.carousel-item", this._element), o = this._getItemIndex(n), r = e || this._getItemByOrder(s, n), a = this._getItemIndex(r), l = Boolean(this._interval), c = s === Y, h = c ? "carousel-item-start" : "carousel-item-end", d = c ? "carousel-item-next" : "carousel-item-prev", u = this._orderToDirection(s); if (r && r.classList.contains("active")) return void (this._isSliding = !1); if (this._isSliding) return; if (this._triggerSlideEvent(r, u).defaultPrevented) return; if (!n || !r) return; this._isSliding = !0, l && this.pause(), this._setActiveIndicatorElement(r), this._activeElement = r; const g = () => { B.trigger(this._element, "slid.bs.carousel", { relatedTarget: r, direction: u, from: o, to: a }) }; if (this._element.classList.contains("slide")) { r.classList.add(d), m(r), n.classList.add(h), r.classList.add(h); const t = () => { r.classList.remove(h, d), r.classList.add("active"), n.classList.remove("active", d, h), this._isSliding = !1, setTimeout(g, 0) }; this._queueCallback(t, n, !0) } else n.classList.remove("active"), r.classList.add("active"), this._isSliding = !1, g(); l && this.cycle() } _directionToOrder(t) { return [J, Z].includes(t) ? v() ? t === Z ? G : Y : t === Z ? Y : G : t } _orderToDirection(t) { return [Y, G].includes(t) ? v() ? t === G ? Z : J : t === G ? J : Z : t } static carouselInterface(t, e) { const s = et.getOrCreateInstance(t, e); let { _config: i } = s; "object" == typeof e && (i = { ...i, ...e }); const n = "string" == typeof e ? e : i.slide; if ("number" == typeof e) s.to(e); else if ("string" == typeof n) { if (void 0 === s[n]) throw new TypeError(`No method named "${n}"`); s[n]() } else i.interval && i.ride && (s.pause(), s.cycle()) } static jQueryInterface(t) { return this.each((function () { et.carouselInterface(this, t) })) } static dataApiClickHandler(t) { const e = a(this); if (!e || !e.classList.contains("carousel")) return; const s = { ...V.getDataAttributes(e), ...V.getDataAttributes(this) }, i = this.getAttribute("data-bs-slide-to"); i && (s.interval = !1), et.carouselInterface(e, s), i && et.getInstance(e).to(i), t.preventDefault() } } B.on(document, "click.bs.carousel.data-api", "[data-bs-slide], [data-bs-slide-to]", et.dataApiClickHandler), B.on(window, "load.bs.carousel.data-api", () => { const t = i.find('[data-bs-ride="carousel"]'); for (let e = 0, s = t.length; e < s; e++)et.carouselInterface(t[e], et.getInstance(t[e])) }), y(et); const st = { toggle: !0, parent: "" }, it = { toggle: "boolean", parent: "(string|element)" }; class nt extends q { constructor(t, e) { super(t), this._isTransitioning = !1, this._config = this._getConfig(e), this._triggerArray = i.find(`[data-bs-toggle="collapse"][href="#${this._element.id}"],[data-bs-toggle="collapse"][data-bs-target="#${this._element.id}"]`); const s = i.find('[data-bs-toggle="collapse"]'); for (let t = 0, e = s.length; t < e; t++) { const e = s[t], n = r(e), o = i.find(n).filter(t => t === this._element); null !== n && o.length && (this._selector = n, this._triggerArray.push(e)) } this._parent = this._config.parent ? this._getParent() : null, this._config.parent || this._addAriaAndCollapsedClass(this._element, this._triggerArray), this._config.toggle && this.toggle() } static get Default() { return st } static get NAME() { return "collapse" } toggle() { this._element.classList.contains("show") ? this.hide() : this.show() } show() { if (this._isTransitioning || this._element.classList.contains("show")) return; let t, e; this._parent && (t = i.find(".show, .collapsing", this._parent).filter(t => "string" == typeof this._config.parent ? t.getAttribute("data-bs-parent") === this._config.parent : t.classList.contains("collapse")), 0 === t.length && (t = null)); const s = i.findOne(this._selector); if (t) { const i = t.find(t => s !== t); if (e = i ? nt.getInstance(i) : null, e && e._isTransitioning) return } if (B.trigger(this._element, "show.bs.collapse").defaultPrevented) return; t && t.forEach(t => { s !== t && nt.collapseInterface(t, "hide"), e || W.set(t, "bs.collapse", null) }); const n = this._getDimension(); this._element.classList.remove("collapse"), this._element.classList.add("collapsing"), this._element.style[n] = 0, this._triggerArray.length && this._triggerArray.forEach(t => { t.classList.remove("collapsed"), t.setAttribute("aria-expanded", !0) }), this.setTransitioning(!0); const o = "scroll" + (n[0].toUpperCase() + n.slice(1)); this._queueCallback(() => { this._element.classList.remove("collapsing"), this._element.classList.add("collapse", "show"), this._element.style[n] = "", this.setTransitioning(!1), B.trigger(this._element, "shown.bs.collapse") }, this._element, !0), this._element.style[n] = this._element[o] + "px" } hide() { if (this._isTransitioning || !this._element.classList.contains("show")) return; if (B.trigger(this._element, "hide.bs.collapse").defaultPrevented) return; const t = this._getDimension(); this._element.style[t] = this._element.getBoundingClientRect()[t] + "px", m(this._element), this._element.classList.add("collapsing"), this._element.classList.remove("collapse", "show"); const e = this._triggerArray.length; if (e > 0) for (let t = 0; t < e; t++) { const e = this._triggerArray[t], s = a(e); s && !s.classList.contains("show") && (e.classList.add("collapsed"), e.setAttribute("aria-expanded", !1)) } this.setTransitioning(!0), this._element.style[t] = "", this._queueCallback(() => { this.setTransitioning(!1), this._element.classList.remove("collapsing"), this._element.classList.add("collapse"), B.trigger(this._element, "hidden.bs.collapse") }, this._element, !0) } setTransitioning(t) { this._isTransitioning = t } _getConfig(t) { return (t = { ...st, ...t }).toggle = Boolean(t.toggle), d("collapse", t, it), t } _getDimension() { return this._element.classList.contains("width") ? "width" : "height" } _getParent() { let { parent: t } = this._config; t = h(t); const e = `[data-bs-toggle="collapse"][data-bs-parent="${t}"]`; return i.find(e, t).forEach(t => { const e = a(t); this._addAriaAndCollapsedClass(e, [t]) }), t } _addAriaAndCollapsedClass(t, e) { if (!t || !e.length) return; const s = t.classList.contains("show"); e.forEach(t => { s ? t.classList.remove("collapsed") : t.classList.add("collapsed"), t.setAttribute("aria-expanded", s) }) } static collapseInterface(t, e) { let s = nt.getInstance(t); const i = { ...st, ...V.getDataAttributes(t), ..."object" == typeof e && e ? e : {} }; if (!s && i.toggle && "string" == typeof e && /show|hide/.test(e) && (i.toggle = !1), s || (s = new nt(t, i)), "string" == typeof e) { if (void 0 === s[e]) throw new TypeError(`No method named "${e}"`); s[e]() } } static jQueryInterface(t) { return this.each((function () { nt.collapseInterface(this, t) })) } } B.on(document, "click.bs.collapse.data-api", '[data-bs-toggle="collapse"]', (function (t) { ("A" === t.target.tagName || t.delegateTarget && "A" === t.delegateTarget.tagName) && t.preventDefault(); const e = V.getDataAttributes(this), s = r(this); i.find(s).forEach(t => { const s = nt.getInstance(t); let i; s ? (null === s._parent && "string" == typeof e.parent && (s._config.parent = e.parent, s._parent = s._getParent()), i = "toggle") : i = e, nt.collapseInterface(t, i) }) })), y(nt); const ot = new RegExp("ArrowUp|ArrowDown|Escape"), rt = v() ? "top-end" : "top-start", at = v() ? "top-start" : "top-end", lt = v() ? "bottom-end" : "bottom-start", ct = v() ? "bottom-start" : "bottom-end", ht = v() ? "left-start" : "right-start", dt = v() ? "right-start" : "left-start", ut = { offset: [0, 2], boundary: "clippingParents", reference: "toggle", display: "dynamic", popperConfig: null, autoClose: !0 }, gt = { offset: "(array|string|function)", boundary: "(string|element)", reference: "(string|element|object)", display: "string", popperConfig: "(null|object|function)", autoClose: "(boolean|string)" }; class pt extends q { constructor(t, e) { super(t), this._popper = null, this._config = this._getConfig(e), this._menu = this._getMenuElement(), this._inNavbar = this._detectNavbar(), this._addEventListeners() } static get Default() { return ut } static get DefaultType() { return gt } static get NAME() { return "dropdown" } toggle() { g(this._element) || (this._element.classList.contains("show") ? this.hide() : this.show()) } show() { if (g(this._element) || this._menu.classList.contains("show")) return; const t = pt.getParentFromElement(this._element), e = { relatedTarget: this._element }; if (!B.trigger(this._element, "show.bs.dropdown", e).defaultPrevented) { if (this._inNavbar) V.setDataAttribute(this._menu, "popper", "none"); else { if (void 0 === s) throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); let e = this._element; "parent" === this._config.reference ? e = t : c(this._config.reference) ? e = h(this._config.reference) : "object" == typeof this._config.reference && (e = this._config.reference); const i = this._getPopperConfig(), n = i.modifiers.find(t => "applyStyles" === t.name && !1 === t.enabled); this._popper = s.createPopper(e, this._menu, i), n && V.setDataAttribute(this._menu, "popper", "static") } "ontouchstart" in document.documentElement && !t.closest(".navbar-nav") && [].concat(...document.body.children).forEach(t => B.on(t, "mouseover", f)), this._element.focus(), this._element.setAttribute("aria-expanded", !0), this._menu.classList.toggle("show"), this._element.classList.toggle("show"), B.trigger(this._element, "shown.bs.dropdown", e) } } hide() { if (g(this._element) || !this._menu.classList.contains("show")) 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() } _addEventListeners() { B.on(this._element, "click.bs.dropdown", t => { t.preventDefault(), this.toggle() }) } _completeHide(t) { B.trigger(this._element, "hide.bs.dropdown", t).defaultPrevented || ("ontouchstart" in document.documentElement && [].concat(...document.body.children).forEach(t => B.off(t, "mouseover", f)), this._popper && this._popper.destroy(), this._menu.classList.remove("show"), this._element.classList.remove("show"), this._element.setAttribute("aria-expanded", "false"), V.removeDataAttribute(this._menu, "popper"), B.trigger(this._element, "hidden.bs.dropdown", t)) } _getConfig(t) { if (t = { ...this.constructor.Default, ...V.getDataAttributes(this._element), ...t }, d("dropdown", t, this.constructor.DefaultType), "object" == typeof t.reference && !c(t.reference) && "function" != typeof t.reference.getBoundingClientRect) throw new TypeError("dropdown".toUpperCase() + ': Option "reference" provided type "object" without a required "getBoundingClientRect" method.'); return t } _getMenuElement() { return i.next(this._element, ".dropdown-menu")[0] } _getPlacement() { const t = this._element.parentNode; if (t.classList.contains("dropend")) return ht; if (t.classList.contains("dropstart")) return dt; const e = "end" === getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(); return t.classList.contains("dropup") ? e ? at : rt : e ? ct : lt } _detectNavbar() { return null !== this._element.closest(".navbar") } _getOffset() { const { offset: t } = this._config; return "string" == typeof t ? t.split(",").map(t => Number.parseInt(t, 10)) : "function" == typeof t ? e => t(e, this._element) : t } _getPopperConfig() { const t = { placement: this._getPlacement(), modifiers: [{ name: "preventOverflow", options: { boundary: this._config.boundary } }, { name: "offset", options: { offset: this._getOffset() } }] }; return "static" === this._config.display && (t.modifiers = [{ name: "applyStyles", enabled: !1 }]), { ...t, ..."function" == typeof this._config.popperConfig ? this._config.popperConfig(t) : this._config.popperConfig } } _selectMenuItem({ key: t, target: e }) { const s = i.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter(u); s.length && A(s, e, "ArrowDown" === t, !s.includes(e)).focus() } static dropdownInterface(t, e) { const s = pt.getOrCreateInstance(t, e); if ("string" == typeof e) { if (void 0 === s[e]) throw new TypeError(`No method named "${e}"`); s[e]() } } static jQueryInterface(t) { return this.each((function () { pt.dropdownInterface(this, t) })) } static clearMenus(t) { if (t && (2 === t.button || "keyup" === t.type && "Tab" !== t.key)) return; const e = i.find('[data-bs-toggle="dropdown"]'); for (let s = 0, i = e.length; s < i; s++) { const i = pt.getInstance(e[s]); if (!i || !1 === i._config.autoClose) continue; if (!i._element.classList.contains("show")) continue; const n = { relatedTarget: i._element }; if (t) { const e = t.composedPath(), s = e.includes(i._menu); if (e.includes(i._element) || "inside" === i._config.autoClose && !s || "outside" === i._config.autoClose && s) continue; if (i._menu.contains(t.target) && ("keyup" === t.type && "Tab" === t.key || /input|select|option|textarea|form/i.test(t.target.tagName))) continue; "click" === t.type && (n.clickEvent = t) } i._completeHide(n) } } static getParentFromElement(t) { return a(t) || t.parentNode } static dataApiKeydownHandler(t) { if (/input|textarea/i.test(t.target.tagName) ? "Space" === t.key || "Escape" !== t.key && ("ArrowDown" !== t.key && "ArrowUp" !== t.key || t.target.closest(".dropdown-menu")) : !ot.test(t.key)) return; const e = this.classList.contains("show"); if (!e && "Escape" === t.key) return; if (t.preventDefault(), t.stopPropagation(), g(this)) return; const s = () => this.matches('[data-bs-toggle="dropdown"]') ? this : i.prev(this, '[data-bs-toggle="dropdown"]')[0]; return "Escape" === t.key ? (s().focus(), void pt.clearMenus()) : "ArrowUp" === t.key || "ArrowDown" === t.key ? (e || s().click(), void pt.getInstance(s())._selectMenuItem(t)) : void (e && "Space" !== t.key || pt.clearMenus()) } } B.on(document, "keydown.bs.dropdown.data-api", '[data-bs-toggle="dropdown"]', pt.dataApiKeydownHandler), B.on(document, "keydown.bs.dropdown.data-api", ".dropdown-menu", pt.dataApiKeydownHandler), B.on(document, "click.bs.dropdown.data-api", pt.clearMenus), B.on(document, "keyup.bs.dropdown.data-api", pt.clearMenus), B.on(document, "click.bs.dropdown.data-api", '[data-bs-toggle="dropdown"]', (function (t) { t.preventDefault(), pt.dropdownInterface(this) })), y(pt); class ft { constructor() { this._element = document.body } getWidth() { const t = document.documentElement.clientWidth; return Math.abs(window.innerWidth - t) } hide() { const t = this.getWidth(); this._disableOverFlow(), this._setElementAttributes(this._element, "paddingRight", e => e + t), this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", "paddingRight", e => e + t), this._setElementAttributes(".sticky-top", "marginRight", e => e - t) } _disableOverFlow() { this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden" } _setElementAttributes(t, e, s) { const i = this.getWidth(); this._applyManipulationCallback(t, t => { if (t !== this._element && window.innerWidth > t.clientWidth + i) return; this._saveInitialAttribute(t, e); const n = window.getComputedStyle(t)[e]; t.style[e] = s(Number.parseFloat(n)) + "px" }) } reset() { this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, "paddingRight"), this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", "paddingRight"), this._resetElementAttributes(".sticky-top", "marginRight") } _saveInitialAttribute(t, e) { const s = t.style[e]; s && V.setDataAttribute(t, e, s) } _resetElementAttributes(t, e) { this._applyManipulationCallback(t, t => { const s = V.getDataAttribute(t, e); void 0 === s ? t.style.removeProperty(e) : (V.removeDataAttribute(t, e), t.style[e] = s) }) } _applyManipulationCallback(t, e) { c(t) ? e(t) : i.find(t, this._element).forEach(e) } isOverflowing() { return this.getWidth() > 0 } } const mt = { isVisible: !0, isAnimated: !1, rootElement: "body", clickCallback: null }, _t = { isVisible: "boolean", isAnimated: "boolean", rootElement: "(element|string)", clickCallback: "(function|null)" }; class bt { constructor(t) { this._config = this._getConfig(t), this._isAppended = !1, this._element = null } show(t) { this._config.isVisible ? (this._append(), this._config.isAnimated && m(this._getElement()), this._getElement().classList.add("show"), this._emulateAnimation(() => { w(t) })) : w(t) } hide(t) { this._config.isVisible ? (this._getElement().classList.remove("show"), this._emulateAnimation(() => { this.dispose(), w(t) })) : w(t) } _getElement() { if (!this._element) { const t = document.createElement("div"); t.className = "modal-backdrop", this._config.isAnimated && t.classList.add("fade"), this._element = t } return this._element } _getConfig(t) { return (t = { ...mt, ..."object" == typeof t ? t : {} }).rootElement = h(t.rootElement), d("backdrop", t, _t), t } _append() { this._isAppended || (this._config.rootElement.appendChild(this._getElement()), B.on(this._getElement(), "mousedown.bs.backdrop", () => { w(this._config.clickCallback) }), this._isAppended = !0) } dispose() { this._isAppended && (B.off(this._element, "mousedown.bs.backdrop"), this._element.remove(), this._isAppended = !1) } _emulateAnimation(t) { E(t, this._getElement(), this._config.isAnimated) } } const vt = { backdrop: !0, keyboard: !0, focus: !0 }, yt = { backdrop: "(boolean|string)", keyboard: "boolean", focus: "boolean" }; class wt extends q { constructor(t, e) { super(t), this._config = this._getConfig(e), this._dialog = i.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._isShown = !1, this._ignoreBackdropClick = !1, this._isTransitioning = !1, this._scrollBar = new ft } static get Default() { return vt } static get NAME() { return "modal" } toggle(t) { return this._isShown ? this.hide() : this.show(t) } show(t) { this._isShown || this._isTransitioning || B.trigger(this._element, "show.bs.modal", { relatedTarget: t }).defaultPrevented || (this._isShown = !0, this._isAnimated() && (this._isTransitioning = !0), this._scrollBar.hide(), document.body.classList.add("modal-open"), this._adjustDialog(), this._setEscapeEvent(), this._setResizeEvent(), B.on(this._element, "click.dismiss.bs.modal", '[data-bs-dismiss="modal"]', t => this.hide(t)), B.on(this._dialog, "mousedown.dismiss.bs.modal", () => { B.one(this._element, "mouseup.dismiss.bs.modal", t => { t.target === this._element && (this._ignoreBackdropClick = !0) }) }), this._showBackdrop(() => this._showElement(t))) } hide(t) { if (t && ["A", "AREA"].includes(t.target.tagName) && t.preventDefault(), !this._isShown || this._isTransitioning) return; if (B.trigger(this._element, "hide.bs.modal").defaultPrevented) return; this._isShown = !1; const e = this._isAnimated(); e && (this._isTransitioning = !0), this._setEscapeEvent(), this._setResizeEvent(), B.off(document, "focusin.bs.modal"), this._element.classList.remove("show"), B.off(this._element, "click.dismiss.bs.modal"), B.off(this._dialog, "mousedown.dismiss.bs.modal"), this._queueCallback(() => this._hideModal(), this._element, e) } dispose() { [window, this._dialog].forEach(t => B.off(t, ".bs.modal")), this._backdrop.dispose(), super.dispose(), B.off(document, "focusin.bs.modal") } handleUpdate() { this._adjustDialog() } _initializeBackDrop() { return new bt({ isVisible: Boolean(this._config.backdrop), isAnimated: this._isAnimated() }) } _getConfig(t) { return t = { ...vt, ...V.getDataAttributes(this._element), ..."object" == typeof t ? t : {} }, d("modal", t, yt), t } _showElement(t) { const e = this._isAnimated(), s = i.findOne(".modal-body", this._dialog); this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE || document.body.appendChild(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, s && (s.scrollTop = 0), e && m(this._element), this._element.classList.add("show"), this._config.focus && this._enforceFocus(), this._queueCallback(() => { this._config.focus && this._element.focus(), this._isTransitioning = !1, B.trigger(this._element, "shown.bs.modal", { relatedTarget: t }) }, this._dialog, e) } _enforceFocus() { B.off(document, "focusin.bs.modal"), B.on(document, "focusin.bs.modal", t => { document === t.target || this._element === t.target || this._element.contains(t.target) || this._element.focus() }) } _setEscapeEvent() { this._isShown ? B.on(this._element, "keydown.dismiss.bs.modal", t => { this._config.keyboard && "Escape" === t.key ? (t.preventDefault(), this.hide()) : this._config.keyboard || "Escape" !== t.key || this._triggerBackdropTransition() }) : B.off(this._element, "keydown.dismiss.bs.modal") } _setResizeEvent() { this._isShown ? B.on(window, "resize.bs.modal", () => this._adjustDialog()) : B.off(window, "resize.bs.modal") } _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("modal-open"), this._resetAdjustments(), this._scrollBar.reset(), B.trigger(this._element, "hidden.bs.modal") }) } _showBackdrop(t) { B.on(this._element, "click.dismiss.bs.modal", t => { this._ignoreBackdropClick ? this._ignoreBackdropClick = !1 : t.target === t.currentTarget && (!0 === this._config.backdrop ? this.hide() : "static" === this._config.backdrop && this._triggerBackdropTransition()) }), this._backdrop.show(t) } _isAnimated() { return this._element.classList.contains("fade") } _triggerBackdropTransition() { if (B.trigger(this._element, "hidePrevented.bs.modal").defaultPrevented) return; const { classList: t, scrollHeight: e, style: s } = this._element, i = e > document.documentElement.clientHeight; !i && "hidden" === s.overflowY || t.contains("modal-static") || (i || (s.overflowY = "hidden"), t.add("modal-static"), this._queueCallback(() => { t.remove("modal-static"), i || this._queueCallback(() => { s.overflowY = "" }, this._dialog) }, this._dialog), this._element.focus()) } _adjustDialog() { const t = this._element.scrollHeight > document.documentElement.clientHeight, e = this._scrollBar.getWidth(), s = e > 0; (!s && t && !v() || s && !t && v()) && (this._element.style.paddingLeft = e + "px"), (s && !t && !v() || !s && t && v()) && (this._element.style.paddingRight = e + "px") } _resetAdjustments() { this._element.style.paddingLeft = "", this._element.style.paddingRight = "" } static jQueryInterface(t, e) { return this.each((function () { const s = wt.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === s[t]) throw new TypeError(`No method named "${t}"`); s[t](e) } })) } } B.on(document, "click.bs.modal.data-api", '[data-bs-toggle="modal"]', (function (t) { const e = a(this);["A", "AREA"].includes(this.tagName) && t.preventDefault(), B.one(e, "show.bs.modal", t => { t.defaultPrevented || B.one(e, "hidden.bs.modal", () => { u(this) && this.focus() }) }), wt.getOrCreateInstance(e).toggle(this) })), y(wt); const Et = { backdrop: !0, keyboard: !0, scroll: !1 }, At = { backdrop: "boolean", keyboard: "boolean", scroll: "boolean" }; class Tt extends q { constructor(t, e) { super(t), this._config = this._getConfig(e), this._isShown = !1, this._backdrop = this._initializeBackDrop(), this._addEventListeners() } static get NAME() { return "offcanvas" } static get Default() { return Et } toggle(t) { return this._isShown ? this.hide() : this.show(t) } show(t) { this._isShown || B.trigger(this._element, "show.bs.offcanvas", { relatedTarget: t }).defaultPrevented || (this._isShown = !0, this._element.style.visibility = "visible", this._backdrop.show(), this._config.scroll || ((new ft).hide(), this._enforceFocusOnElement(this._element)), this._element.removeAttribute("aria-hidden"), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.classList.add("show"), this._queueCallback(() => { B.trigger(this._element, "shown.bs.offcanvas", { relatedTarget: t }) }, this._element, !0)) } hide() { this._isShown && (B.trigger(this._element, "hide.bs.offcanvas").defaultPrevented || (B.off(document, "focusin.bs.offcanvas"), this._element.blur(), this._isShown = !1, this._element.classList.remove("show"), this._backdrop.hide(), this._queueCallback(() => { this._element.setAttribute("aria-hidden", !0), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._element.style.visibility = "hidden", this._config.scroll || (new ft).reset(), B.trigger(this._element, "hidden.bs.offcanvas") }, this._element, !0))) } dispose() { this._backdrop.dispose(), super.dispose(), B.off(document, "focusin.bs.offcanvas") } _getConfig(t) { return t = { ...Et, ...V.getDataAttributes(this._element), ..."object" == typeof t ? t : {} }, d("offcanvas", t, At), t } _initializeBackDrop() { return new bt({ isVisible: this._config.backdrop, isAnimated: !0, rootElement: this._element.parentNode, clickCallback: () => this.hide() }) } _enforceFocusOnElement(t) { B.off(document, "focusin.bs.offcanvas"), B.on(document, "focusin.bs.offcanvas", e => { document === e.target || t === e.target || t.contains(e.target) || t.focus() }), t.focus() } _addEventListeners() { B.on(this._element, "click.dismiss.bs.offcanvas", '[data-bs-dismiss="offcanvas"]', () => this.hide()), B.on(this._element, "keydown.dismiss.bs.offcanvas", t => { this._config.keyboard && "Escape" === t.key && this.hide() }) } static jQueryInterface(t) { return this.each((function () { const e = Tt.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) } })) } } B.on(document, "click.bs.offcanvas.data-api", '[data-bs-toggle="offcanvas"]', (function (t) { const e = a(this); if (["A", "AREA"].includes(this.tagName) && t.preventDefault(), g(this)) return; B.one(e, "hidden.bs.offcanvas", () => { u(this) && this.focus() }); const s = i.findOne(".offcanvas.show"); s && s !== e && Tt.getInstance(s).hide(), Tt.getOrCreateInstance(e).toggle(this) })), B.on(window, "load.bs.offcanvas.data-api", () => i.find(".offcanvas.show").forEach(t => Tt.getOrCreateInstance(t).show())), y(Tt); const Ct = new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]), kt = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i, Lt = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i, Ot = (t, e) => { const s = t.nodeName.toLowerCase(); if (e.includes(s)) return !Ct.has(s) || Boolean(kt.test(t.nodeValue) || Lt.test(t.nodeValue)); const i = e.filter(t => t instanceof RegExp); for (let t = 0, e = i.length; t < e; t++)if (i[t].test(s)) return !0; return !1 }; function Dt(t, e, s) { if (!t.length) return t; if (s && "function" == typeof s) return s(t); const i = (new window.DOMParser).parseFromString(t, "text/html"), n = Object.keys(e), o = [].concat(...i.body.querySelectorAll("*")); for (let t = 0, s = o.length; t < s; t++) { const s = o[t], i = s.nodeName.toLowerCase(); if (!n.includes(i)) { s.remove(); continue } const r = [].concat(...s.attributes), a = [].concat(e["*"] || [], e[i] || []); r.forEach(t => { Ot(t, a) || s.removeAttribute(t.nodeName) }) } return i.body.innerHTML } const It = new RegExp("(^|\\s)bs-tooltip\\S+", "g"), Nt = new Set(["sanitize", "allowList", "sanitizeFn"]), St = { animation: "boolean", template: "string", title: "(string|element|function)", trigger: "string", delay: "(number|object)", html: "boolean", selector: "(string|boolean)", placement: "(string|function)", offset: "(array|string|function)", container: "(string|element|boolean)", fallbackPlacements: "array", boundary: "(string|element)", customClass: "(string|function)", sanitize: "boolean", sanitizeFn: "(null|function)", allowList: "object", popperConfig: "(null|object|function)" }, xt = { AUTO: "auto", TOP: "top", RIGHT: v() ? "left" : "right", BOTTOM: "bottom", LEFT: v() ? "right" : "left" }, Mt = { animation: !0, template: '', trigger: "hover focus", title: "", delay: 0, html: !1, selector: !1, placement: "top", offset: [0, 0], container: !1, fallbackPlacements: ["top", "right", "bottom", "left"], boundary: "clippingParents", customClass: "", sanitize: !0, sanitizeFn: null, allowList: { "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], a: ["target", "href", "title", "rel"], area: [], b: [], br: [], col: [], code: [], div: [], em: [], hr: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], i: [], img: ["src", "srcset", "alt", "title", "width", "height"], li: [], ol: [], p: [], pre: [], s: [], small: [], span: [], sub: [], sup: [], strong: [], u: [], ul: [] }, popperConfig: null }, Pt = { HIDE: "hide.bs.tooltip", HIDDEN: "hidden.bs.tooltip", SHOW: "show.bs.tooltip", SHOWN: "shown.bs.tooltip", INSERTED: "inserted.bs.tooltip", CLICK: "click.bs.tooltip", FOCUSIN: "focusin.bs.tooltip", FOCUSOUT: "focusout.bs.tooltip", MOUSEENTER: "mouseenter.bs.tooltip", MOUSELEAVE: "mouseleave.bs.tooltip" }; class jt extends q { constructor(t, e) { if (void 0 === s) throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); super(t), this._isEnabled = !0, this._timeout = 0, this._hoverState = "", this._activeTrigger = {}, this._popper = null, this._config = this._getConfig(e), this.tip = null, this._setListeners() } static get Default() { return Mt } static get NAME() { return "tooltip" } static get Event() { return Pt } static get DefaultType() { return St } enable() { this._isEnabled = !0 } disable() { this._isEnabled = !1 } toggleEnabled() { this._isEnabled = !this._isEnabled } toggle(t) { if (this._isEnabled) if (t) { const e = this._initializeOnDelegatedTarget(t); e._activeTrigger.click = !e._activeTrigger.click, e._isWithActiveTrigger() ? e._enter(null, e) : e._leave(null, e) } else { if (this.getTipElement().classList.contains("show")) return void this._leave(null, this); this._enter(null, this) } } dispose() { clearTimeout(this._timeout), B.off(this._element.closest(".modal"), "hide.bs.modal", this._hideModalHandler), this.tip && this.tip.remove(), this._popper && this._popper.destroy(), 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 = B.trigger(this._element, this.constructor.Event.SHOW), e = p(this._element), i = null === e ? this._element.ownerDocument.documentElement.contains(this._element) : e.contains(this._element); if (t.defaultPrevented || !i) return; const o = this.getTipElement(), r = n(this.constructor.NAME); o.setAttribute("id", r), this._element.setAttribute("aria-describedby", r), this.setContent(), this._config.animation && o.classList.add("fade"); const a = "function" == typeof this._config.placement ? this._config.placement.call(this, o, this._element) : this._config.placement, l = this._getAttachment(a); this._addAttachmentClass(l); const { container: c } = this._config; W.set(o, this.constructor.DATA_KEY, this), this._element.ownerDocument.documentElement.contains(this.tip) || (c.appendChild(o), B.trigger(this._element, this.constructor.Event.INSERTED)), this._popper ? this._popper.update() : this._popper = s.createPopper(this._element, o, this._getPopperConfig(l)), o.classList.add("show"); const h = "function" == typeof this._config.customClass ? this._config.customClass() : this._config.customClass; h && o.classList.add(...h.split(" ")), "ontouchstart" in document.documentElement && [].concat(...document.body.children).forEach(t => { B.on(t, "mouseover", f) }); const d = this.tip.classList.contains("fade"); this._queueCallback(() => { const t = this._hoverState; this._hoverState = null, B.trigger(this._element, this.constructor.Event.SHOWN), "out" === t && this._leave(null, this) }, this.tip, d) } hide() { if (!this._popper) return; const t = this.getTipElement(); if (B.trigger(this._element, this.constructor.Event.HIDE).defaultPrevented) return; t.classList.remove("show"), "ontouchstart" in document.documentElement && [].concat(...document.body.children).forEach(t => B.off(t, "mouseover", f)), this._activeTrigger.click = !1, this._activeTrigger.focus = !1, this._activeTrigger.hover = !1; const e = this.tip.classList.contains("fade"); this._queueCallback(() => { this._isWithActiveTrigger() || ("show" !== this._hoverState && t.remove(), this._cleanTipClass(), this._element.removeAttribute("aria-describedby"), B.trigger(this._element, this.constructor.Event.HIDDEN), this._popper && (this._popper.destroy(), this._popper = null)) }, this.tip, e), this._hoverState = "" } update() { null !== this._popper && this._popper.update() } isWithContent() { return Boolean(this.getTitle()) } getTipElement() { if (this.tip) return this.tip; const t = document.createElement("div"); return t.innerHTML = this._config.template, this.tip = t.children[0], this.tip } setContent() { const t = this.getTipElement(); this.setElementContent(i.findOne(".tooltip-inner", t), this.getTitle()), t.classList.remove("fade", "show") } setElementContent(t, e) { if (null !== t) return c(e) ? (e = h(e), void (this._config.html ? e.parentNode !== t && (t.innerHTML = "", t.appendChild(e)) : t.textContent = e.textContent)) : void (this._config.html ? (this._config.sanitize && (e = Dt(e, this._config.allowList, this._config.sanitizeFn)), t.innerHTML = e) : t.textContent = e) } getTitle() { let t = this._element.getAttribute("data-bs-original-title"); return t || (t = "function" == typeof this._config.title ? this._config.title.call(this._element) : this._config.title), t } updateAttachment(t) { return "right" === t ? "end" : "left" === t ? "start" : t } _initializeOnDelegatedTarget(t, e) { const s = this.constructor.DATA_KEY; return (e = e || W.get(t.delegateTarget, s)) || (e = new this.constructor(t.delegateTarget, this._getDelegateConfig()), W.set(t.delegateTarget, s, e)), e } _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(t) { const e = { placement: t, modifiers: [{ name: "flip", options: { fallbackPlacements: this._config.fallbackPlacements } }, { name: "offset", options: { offset: this._getOffset() } }, { name: "preventOverflow", options: { boundary: this._config.boundary } }, { name: "arrow", options: { element: `.${this.constructor.NAME}-arrow` } }, { name: "onChange", enabled: !0, phase: "afterWrite", fn: t => this._handlePopperPlacementChange(t) }], onFirstUpdate: t => { t.options.placement !== t.placement && this._handlePopperPlacementChange(t) } }; return { ...e, ..."function" == typeof this._config.popperConfig ? this._config.popperConfig(e) : this._config.popperConfig } } _addAttachmentClass(t) { this.getTipElement().classList.add("bs-tooltip-" + this.updateAttachment(t)) } _getAttachment(t) { return xt[t.toUpperCase()] } _setListeners() { this._config.trigger.split(" ").forEach(t => { if ("click" === t) B.on(this._element, this.constructor.Event.CLICK, this._config.selector, t => this.toggle(t)); else if ("manual" !== t) { const e = "hover" === t ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN, s = "hover" === t ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT; B.on(this._element, e, this._config.selector, t => this._enter(t)), B.on(this._element, s, this._config.selector, t => this._leave(t)) } }), this._hideModalHandler = () => { this._element && this.hide() }, B.on(this._element.closest(".modal"), "hide.bs.modal", this._hideModalHandler), this._config.selector ? this._config = { ...this._config, trigger: "manual", selector: "" } : this._fixTitle() } _fixTitle() { const t = this._element.getAttribute("title"), e = typeof this._element.getAttribute("data-bs-original-title"); (t || "string" !== e) && (this._element.setAttribute("data-bs-original-title", t || ""), !t || this._element.getAttribute("aria-label") || this._element.textContent || this._element.setAttribute("aria-label", t), this._element.setAttribute("title", "")) } _enter(t, e) { e = this._initializeOnDelegatedTarget(t, e), t && (e._activeTrigger["focusin" === t.type ? "focus" : "hover"] = !0), e.getTipElement().classList.contains("show") || "show" === e._hoverState ? e._hoverState = "show" : (clearTimeout(e._timeout), e._hoverState = "show", e._config.delay && e._config.delay.show ? e._timeout = setTimeout(() => { "show" === e._hoverState && e.show() }, e._config.delay.show) : e.show()) } _leave(t, e) { e = this._initializeOnDelegatedTarget(t, e), t && (e._activeTrigger["focusout" === t.type ? "focus" : "hover"] = e._element.contains(t.relatedTarget)), e._isWithActiveTrigger() || (clearTimeout(e._timeout), e._hoverState = "out", e._config.delay && e._config.delay.hide ? e._timeout = setTimeout(() => { "out" === e._hoverState && e.hide() }, e._config.delay.hide) : e.hide()) } _isWithActiveTrigger() { for (const t in this._activeTrigger) if (this._activeTrigger[t]) return !0; return !1 } _getConfig(t) { const e = V.getDataAttributes(this._element); return Object.keys(e).forEach(t => { Nt.has(t) && delete e[t] }), (t = { ...this.constructor.Default, ...e, ..."object" == typeof t && t ? t : {} }).container = !1 === t.container ? document.body : h(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()), d("tooltip", t, this.constructor.DefaultType), t.sanitize && (t.template = Dt(t.template, t.allowList, t.sanitizeFn)), t } _getDelegateConfig() { const t = {}; if (this._config) for (const e in this._config) this.constructor.Default[e] !== this._config[e] && (t[e] = this._config[e]); return t } _cleanTipClass() { const t = this.getTipElement(), e = t.getAttribute("class").match(It); null !== e && e.length > 0 && e.map(t => t.trim()).forEach(e => t.classList.remove(e)) } _handlePopperPlacementChange(t) { const { state: e } = t; e && (this.tip = e.elements.popper, this._cleanTipClass(), this._addAttachmentClass(this._getAttachment(e.placement))) } static jQueryInterface(t) { return this.each((function () { const e = jt.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t]() } })) } } y(jt); const Ht = new RegExp("(^|\\s)bs-popover\\S+", "g"), Rt = { ...jt.Default, placement: "right", offset: [0, 8], trigger: "click", content: "", template: '' }, Bt = { ...jt.DefaultType, content: "(string|element|function)" }, $t = { HIDE: "hide.bs.popover", HIDDEN: "hidden.bs.popover", SHOW: "show.bs.popover", SHOWN: "shown.bs.popover", INSERTED: "inserted.bs.popover", CLICK: "click.bs.popover", FOCUSIN: "focusin.bs.popover", FOCUSOUT: "focusout.bs.popover", MOUSEENTER: "mouseenter.bs.popover", MOUSELEAVE: "mouseleave.bs.popover" }; class Wt extends jt { static get Default() { return Rt } static get NAME() { return "popover" } static get Event() { return $t } static get DefaultType() { return Bt } isWithContent() { return this.getTitle() || this._getContent() } getTipElement() { return this.tip || (this.tip = super.getTipElement(), this.getTitle() || i.findOne(".popover-header", this.tip).remove(), this._getContent() || i.findOne(".popover-body", this.tip).remove()), this.tip } setContent() { const t = this.getTipElement(); this.setElementContent(i.findOne(".popover-header", t), this.getTitle()); let e = this._getContent(); "function" == typeof e && (e = e.call(this._element)), this.setElementContent(i.findOne(".popover-body", t), e), t.classList.remove("fade", "show") } _addAttachmentClass(t) { this.getTipElement().classList.add("bs-popover-" + this.updateAttachment(t)) } _getContent() { return this._element.getAttribute("data-bs-content") || this._config.content } _cleanTipClass() { const t = this.getTipElement(), e = t.getAttribute("class").match(Ht); null !== e && e.length > 0 && e.map(t => t.trim()).forEach(e => t.classList.remove(e)) } static jQueryInterface(t) { return this.each((function () { const e = Wt.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t]() } })) } } y(Wt); const qt = { offset: 10, method: "auto", target: "" }, zt = { offset: "number", method: "string", target: "(string|element)" }; class Ft extends q { constructor(t, e) { super(t), this._scrollElement = "BODY" === this._element.tagName ? window : this._element, this._config = this._getConfig(e), this._selector = `${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`, this._offsets = [], this._targets = [], this._activeTarget = null, this._scrollHeight = 0, B.on(this._scrollElement, "scroll.bs.scrollspy", () => this._process()), this.refresh(), this._process() } static get Default() { return qt } static get NAME() { return "scrollspy" } refresh() { const t = this._scrollElement === this._scrollElement.window ? "offset" : "position", e = "auto" === this._config.method ? t : this._config.method, s = "position" === e ? this._getScrollTop() : 0; this._offsets = [], this._targets = [], this._scrollHeight = this._getScrollHeight(), i.find(this._selector).map(t => { const n = r(t), o = n ? i.findOne(n) : null; if (o) { const t = o.getBoundingClientRect(); if (t.width || t.height) return [V[e](o).top + s, n] } return null }).filter(t => t).sort((t, e) => t[0] - e[0]).forEach(t => { this._offsets.push(t[0]), this._targets.push(t[1]) }) } dispose() { B.off(this._scrollElement, ".bs.scrollspy"), super.dispose() } _getConfig(t) { if ("string" != typeof (t = { ...qt, ...V.getDataAttributes(this._element), ..."object" == typeof t && t ? t : {} }).target && c(t.target)) { let { id: e } = t.target; e || (e = n("scrollspy"), t.target.id = e), t.target = "#" + e } return d("scrollspy", t, zt), t } _getScrollTop() { return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop } _getScrollHeight() { return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) } _getOffsetHeight() { return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height } _process() { const t = this._getScrollTop() + this._config.offset, e = this._getScrollHeight(), s = this._config.offset + e - this._getOffsetHeight(); if (this._scrollHeight !== e && this.refresh(), t >= s) { const t = this._targets[this._targets.length - 1]; this._activeTarget !== t && this._activate(t) } else { if (this._activeTarget && t < this._offsets[0] && this._offsets[0] > 0) return this._activeTarget = null, void this._clear(); for (let e = this._offsets.length; e--;)this._activeTarget !== this._targets[e] && t >= this._offsets[e] && (void 0 === this._offsets[e + 1] || t < this._offsets[e + 1]) && this._activate(this._targets[e]) } } _activate(t) { this._activeTarget = t, this._clear(); const e = this._selector.split(",").map(e => `${e}[data-bs-target="${t}"],${e}[href="${t}"]`), s = i.findOne(e.join(",")); s.classList.contains("dropdown-item") ? (i.findOne(".dropdown-toggle", s.closest(".dropdown")).classList.add("active"), s.classList.add("active")) : (s.classList.add("active"), i.parents(s, ".nav, .list-group").forEach(t => { i.prev(t, ".nav-link, .list-group-item").forEach(t => t.classList.add("active")), i.prev(t, ".nav-item").forEach(t => { i.children(t, ".nav-link").forEach(t => t.classList.add("active")) }) })), B.trigger(this._scrollElement, "activate.bs.scrollspy", { relatedTarget: t }) } _clear() { i.find(this._selector).filter(t => t.classList.contains("active")).forEach(t => t.classList.remove("active")) } static jQueryInterface(t) { return this.each((function () { const e = Ft.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t]() } })) } } B.on(window, "load.bs.scrollspy.data-api", () => { i.find('[data-bs-spy="scroll"]').forEach(t => new Ft(t)) }), y(Ft); class Ut extends q { static get NAME() { return "tab" } show() { if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains("active")) return; let t; const e = a(this._element), s = this._element.closest(".nav, .list-group"); if (s) { const e = "UL" === s.nodeName || "OL" === s.nodeName ? ":scope > li > .active" : ".active"; t = i.find(e, s), t = t[t.length - 1] } const n = t ? B.trigger(t, "hide.bs.tab", { relatedTarget: this._element }) : null; if (B.trigger(this._element, "show.bs.tab", { relatedTarget: t }).defaultPrevented || null !== n && n.defaultPrevented) return; this._activate(this._element, s); const o = () => { B.trigger(t, "hidden.bs.tab", { relatedTarget: this._element }), B.trigger(this._element, "shown.bs.tab", { relatedTarget: t }) }; e ? this._activate(e, e.parentNode, o) : o() } _activate(t, e, s) { const n = (!e || "UL" !== e.nodeName && "OL" !== e.nodeName ? i.children(e, ".active") : i.find(":scope > li > .active", e))[0], o = s && n && n.classList.contains("fade"), r = () => this._transitionComplete(t, n, s); n && o ? (n.classList.remove("show"), this._queueCallback(r, t, !0)) : r() } _transitionComplete(t, e, s) { if (e) { e.classList.remove("active"); const t = i.findOne(":scope > .dropdown-menu .active", e.parentNode); t && t.classList.remove("active"), "tab" === e.getAttribute("role") && e.setAttribute("aria-selected", !1) } t.classList.add("active"), "tab" === t.getAttribute("role") && t.setAttribute("aria-selected", !0), m(t), t.classList.contains("fade") && t.classList.add("show"); let n = t.parentNode; if (n && "LI" === n.nodeName && (n = n.parentNode), n && n.classList.contains("dropdown-menu")) { const e = t.closest(".dropdown"); e && i.find(".dropdown-toggle", e).forEach(t => t.classList.add("active")), t.setAttribute("aria-expanded", !0) } s && s() } static jQueryInterface(t) { return this.each((function () { const e = Ut.getOrCreateInstance(this); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t]() } })) } } B.on(document, "click.bs.tab.data-api", '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', (function (t) { ["A", "AREA"].includes(this.tagName) && t.preventDefault(), g(this) || Ut.getOrCreateInstance(this).show() })), y(Ut); const Kt = { animation: "boolean", autohide: "boolean", delay: "number" }, Vt = { animation: !0, autohide: !0, delay: 5e3 }; class Qt extends q { constructor(t, e) { super(t), this._config = this._getConfig(e), this._timeout = null, this._hasMouseInteraction = !1, this._hasKeyboardInteraction = !1, this._setListeners() } static get DefaultType() { return Kt } static get Default() { return Vt } static get NAME() { return "toast" } show() { B.trigger(this._element, "show.bs.toast").defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove("hide"), m(this._element), this._element.classList.add("showing"), this._queueCallback(() => { this._element.classList.remove("showing"), this._element.classList.add("show"), B.trigger(this._element, "shown.bs.toast"), this._maybeScheduleHide() }, this._element, this._config.animation)) } hide() { this._element.classList.contains("show") && (B.trigger(this._element, "hide.bs.toast").defaultPrevented || (this._element.classList.remove("show"), this._queueCallback(() => { this._element.classList.add("hide"), B.trigger(this._element, "hidden.bs.toast") }, this._element, this._config.animation))) } dispose() { this._clearTimeout(), this._element.classList.contains("show") && this._element.classList.remove("show"), super.dispose() } _getConfig(t) { return t = { ...Vt, ...V.getDataAttributes(this._element), ..."object" == typeof t && t ? t : {} }, d("toast", t, this.constructor.DefaultType), t } _maybeScheduleHide() { this._config.autohide && (this._hasMouseInteraction || this._hasKeyboardInteraction || (this._timeout = setTimeout(() => { this.hide() }, this._config.delay))) } _onInteraction(t, e) { switch (t.type) { case "mouseover": case "mouseout": this._hasMouseInteraction = e; break; case "focusin": case "focusout": this._hasKeyboardInteraction = e }if (e) return void this._clearTimeout(); const s = t.relatedTarget; this._element === s || this._element.contains(s) || this._maybeScheduleHide() } _setListeners() { B.on(this._element, "click.dismiss.bs.toast", '[data-bs-dismiss="toast"]', () => this.hide()), B.on(this._element, "mouseover.bs.toast", t => this._onInteraction(t, !0)), B.on(this._element, "mouseout.bs.toast", t => this._onInteraction(t, !1)), B.on(this._element, "focusin.bs.toast", t => this._onInteraction(t, !0)), B.on(this._element, "focusout.bs.toast", t => this._onInteraction(t, !1)) } _clearTimeout() { clearTimeout(this._timeout), this._timeout = null } static jQueryInterface(t) { return this.each((function () { const e = Qt.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); e[t](this) } })) } } return y(Qt), { Alert: z, Button: F, Carousel: et, Collapse: nt, Dropdown: pt, Modal: wt, Offcanvas: Tt, Popover: Wt, ScrollSpy: Ft, Tab: Ut, Toast: Qt, Tooltip: jt } })); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/HerramientaCASA/wwwroot/Scripts/jquery.min.js b/HerramientaCASA/wwwroot/Scripts/jquery.min.js new file mode 100644 index 0000000..0de648e --- /dev/null +++ b/HerramientaCASA/wwwroot/Scripts/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.4 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.4",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.cssHas=ce(function(){try{return C.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),d.cssHas||y.push(":has"),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType&&e.documentElement||e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 element. This information allows you to progressively enhance + * your pages with a granular level of control over the experience. + * + * Modernizr has an optional (not included) conditional resource loader + * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). + * To get a build that includes Modernizr.load(), as well as choosing + * which tests to include, go to www.modernizr.com/download/ + * + * Authors Faruk Ates, Paul Irish, Alex Sexton + * Contributors Ryan Seddon, Ben Alman + */ + +window.Modernizr = (function( window, document, undefined ) { + + var version = '2.8.3', + + Modernizr = {}, + + /*>>cssclasses*/ + // option for enabling the HTML classes to be added + enableClasses = true, + /*>>cssclasses*/ + + docElement = document.documentElement, + + /** + * Create our "modernizr" element that we do most feature tests on. + */ + mod = 'modernizr', + modElem = document.createElement(mod), + mStyle = modElem.style, + + /** + * Create the input element for various Web Forms feature tests. + */ + inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ , + + /*>>smile*/ + smile = ':)', + /*>>smile*/ + + toString = {}.toString, + + // TODO :: make the prefixes more granular + /*>>prefixes*/ + // List of property values to set for css tests. See ticket #21 + prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), + /*>>prefixes*/ + + /*>>domprefixes*/ + // Following spec is to expose vendor-specific style properties as: + // elem.style.WebkitBorderRadius + // and the following would be incorrect: + // elem.style.webkitBorderRadius + + // Webkit ghosts their properties in lowercase but Opera & Moz do not. + // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+ + // erik.eae.net/archives/2008/03/10/21.48.10/ + + // More here: github.com/Modernizr/Modernizr/issues/issue/21 + omPrefixes = 'Webkit Moz O ms', + + cssomPrefixes = omPrefixes.split(' '), + + domPrefixes = omPrefixes.toLowerCase().split(' '), + /*>>domprefixes*/ + + /*>>ns*/ + ns = {'svg': 'http://www.w3.org/2000/svg'}, + /*>>ns*/ + + tests = {}, + inputs = {}, + attrs = {}, + + classes = [], + + slice = classes.slice, + + featureName, // used in testing loop + + + /*>>teststyles*/ + // Inject element with style element and some CSS rules + injectElementWithStyles = function( rule, callback, nodes, testnames ) { + + var style, ret, node, docOverflow, + div = document.createElement('div'), + // After page load injecting a fake body doesn't work so check if body exists + body = document.body, + // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it. + fakeBody = body || document.createElement('body'); + + if ( parseInt(nodes, 10) ) { + // In order not to give false positives we create a node for each test + // This also allows the method to scale for unspecified uses + while ( nodes-- ) { + node = document.createElement('div'); + node.id = testnames ? testnames[nodes] : mod + (nodes + 1); + div.appendChild(node); + } + } + + // '].join(''); + div.id = mod; + // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. + // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 + (body ? div : fakeBody).innerHTML += style; + fakeBody.appendChild(div); + if ( !body ) { + //avoid crashing IE8, if background image is used + fakeBody.style.background = ''; + //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible + fakeBody.style.overflow = 'hidden'; + docOverflow = docElement.style.overflow; + docElement.style.overflow = 'hidden'; + docElement.appendChild(fakeBody); + } + + ret = callback(div, rule); + // If this is done after page load we don't want to remove the body so check if body exists + if ( !body ) { + fakeBody.parentNode.removeChild(fakeBody); + docElement.style.overflow = docOverflow; + } else { + div.parentNode.removeChild(div); + } + + return !!ret; + + }, + /*>>teststyles*/ + + /*>>mq*/ + // adapted from matchMedia polyfill + // by Scott Jehl and Paul Irish + // gist.github.com/786768 + testMediaQuery = function( mq ) { + + var matchMedia = window.matchMedia || window.msMatchMedia; + if ( matchMedia ) { + return matchMedia(mq) && matchMedia(mq).matches || false; + } + + var bool; + + injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { + bool = (window.getComputedStyle ? + getComputedStyle(node, null) : + node.currentStyle)['position'] == 'absolute'; + }); + + return bool; + + }, + /*>>mq*/ + + + /*>>hasevent*/ + // + // isEventSupported determines if a given element supports the given event + // kangax.github.com/iseventsupported/ + // + // The following results are known incorrects: + // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative + // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333 + // ... + isEventSupported = (function() { + + var TAGNAMES = { + 'select': 'input', 'change': 'input', + 'submit': 'form', 'reset': 'form', + 'error': 'img', 'load': 'img', 'abort': 'img' + }; + + function isEventSupported( eventName, element ) { + + element = element || document.createElement(TAGNAMES[eventName] || 'div'); + eventName = 'on' + eventName; + + // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those + var isSupported = eventName in element; + + if ( !isSupported ) { + // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element + if ( !element.setAttribute ) { + element = document.createElement('div'); + } + if ( element.setAttribute && element.removeAttribute ) { + element.setAttribute(eventName, ''); + isSupported = is(element[eventName], 'function'); + + // If property was created, "remove it" (by setting value to `undefined`) + if ( !is(element[eventName], 'undefined') ) { + element[eventName] = undefined; + } + element.removeAttribute(eventName); + } + } + + element = null; + return isSupported; + } + return isEventSupported; + })(), + /*>>hasevent*/ + + // TODO :: Add flag for hasownprop ? didn't last time + + // hasOwnProperty shim by kangax needed for Safari 2.0 support + _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; + + if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { + hasOwnProp = function (object, property) { + return _hasOwnProperty.call(object, property); + }; + } + else { + hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ + return ((property in object) && is(object.constructor.prototype[property], 'undefined')); + }; + } + + // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js + // es5.github.com/#x15.3.4.5 + + if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { + + var target = this; + + if (typeof target != "function") { + throw new TypeError(); + } + + var args = slice.call(arguments, 1), + bound = function () { + + if (this instanceof bound) { + + var F = function(){}; + F.prototype = target.prototype; + var self = new F(); + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return self; + + } else { + + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + + return bound; + }; + } + + /** + * setCss applies given styles to the Modernizr DOM node. + */ + function setCss( str ) { + mStyle.cssText = str; + } + + /** + * setCssAll extrapolates all vendor-specific css strings. + */ + function setCssAll( str1, str2 ) { + return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); + } + + /** + * is returns a boolean for if typeof obj is exactly type. + */ + function is( obj, type ) { + return typeof obj === type; + } + + /** + * contains returns a boolean for if substr is found within str. + */ + function contains( str, substr ) { + return !!~('' + str).indexOf(substr); + } + + /*>>testprop*/ + + // testProps is a generic CSS / DOM property test. + + // In testing support for a given CSS property, it's legit to test: + // `elem.style[styleName] !== undefined` + // If the property is supported it will return an empty string, + // if unsupported it will return undefined. + + // We'll take advantage of this quick test and skip setting a style + // on our modernizr element, but instead just testing undefined vs + // empty string. + + // Because the testing of the CSS property names (with "-", as + // opposed to the camelCase DOM properties) is non-portable and + // non-standard but works in WebKit and IE (but not Gecko or Opera), + // we explicitly reject properties with dashes so that authors + // developing in WebKit or IE first don't end up with + // browser-specific content by accident. + + function testProps( props, prefixed ) { + for ( var i in props ) { + var prop = props[i]; + if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { + return prefixed == 'pfx' ? prop : true; + } + } + return false; + } + /*>>testprop*/ + + // TODO :: add testDOMProps + /** + * testDOMProps is a generic DOM property test; if a browser supports + * a certain property, it won't return undefined for it. + */ + function testDOMProps( props, obj, elem ) { + for ( var i in props ) { + var item = obj[props[i]]; + if ( item !== undefined) { + + // return the property name as a string + if (elem === false) return props[i]; + + // let's bind a function + if (is(item, 'function')){ + // default to autobind unless override + return item.bind(elem || obj); + } + + // return the unbound function or obj or value + return item; + } + } + return false; + } + + /*>>testallprops*/ + /** + * testPropsAll tests a list of DOM properties we want to check against. + * We specify literally ALL possible (known and/or likely) properties on + * the element including the non-vendor prefixed one, for forward- + * compatibility. + */ + function testPropsAll( prop, prefixed, elem ) { + + var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), + props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); + + // did they call .prefixed('boxSizing') or are we just testing a prop? + if(is(prefixed, "string") || is(prefixed, "undefined")) { + return testProps(props, prefixed); + + // otherwise, they called .prefixed('requestAnimationFrame', window[, elem]) + } else { + props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); + return testDOMProps(props, prefixed, elem); + } + } + /*>>testallprops*/ + + + /** + * Tests + * ----- + */ + + // The *new* flexbox + // dev.w3.org/csswg/css3-flexbox + + tests['flexbox'] = function() { + return testPropsAll('flexWrap'); + }; + + // The *old* flexbox + // www.w3.org/TR/2009/WD-css3-flexbox-20090723/ + + tests['flexboxlegacy'] = function() { + return testPropsAll('boxDirection'); + }; + + // On the S60 and BB Storm, getContext exists, but always returns undefined + // so we actually have to call getContext() to verify + // github.com/Modernizr/Modernizr/issues/issue/97/ + + tests['canvas'] = function() { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }; + + tests['canvastext'] = function() { + return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); + }; + + // webk.it/70117 is tracking a legit WebGL feature detect proposal + + // We do a soft detect which may false positive in order to avoid + // an expensive context creation: bugzil.la/732441 + + tests['webgl'] = function() { + return !!window.WebGLRenderingContext; + }; + + /* + * The Modernizr.touch test only indicates if the browser supports + * touch events, which does not necessarily reflect a touchscreen + * device, as evidenced by tablets running Windows 7 or, alas, + * the Palm Pre / WebOS (touch) phones. + * + * Additionally, Chrome (desktop) used to lie about its support on this, + * but that has since been rectified: crbug.com/36415 + * + * We also test for Firefox 4 Multitouch Support. + * + * For more info, see: modernizr.github.com/Modernizr/touch.html + */ + + tests['touch'] = function() { + var bool; + + if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { + bool = true; + } else { + injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { + bool = node.offsetTop === 9; + }); + } + + return bool; + }; + + + // geolocation is often considered a trivial feature detect... + // Turns out, it's quite tricky to get right: + // + // Using !!navigator.geolocation does two things we don't want. It: + // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513 + // 2. Disables page caching in WebKit: webk.it/43956 + // + // Meanwhile, in Firefox < 8, an about:config setting could expose + // a false positive that would throw an exception: bugzil.la/688158 + + tests['geolocation'] = function() { + return 'geolocation' in navigator; + }; + + + tests['postmessage'] = function() { + return !!window.postMessage; + }; + + + // Chrome incognito mode used to throw an exception when using openDatabase + // It doesn't anymore. + tests['websqldatabase'] = function() { + return !!window.openDatabase; + }; + + // Vendors had inconsistent prefixing with the experimental Indexed DB: + // - Webkit's implementation is accessible through webkitIndexedDB + // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB + // For speed, we don't test the legacy (and beta-only) indexedDB + tests['indexedDB'] = function() { + return !!testPropsAll("indexedDB", window); + }; + + // documentMode logic from YUI to filter out IE8 Compat Mode + // which false positives. + tests['hashchange'] = function() { + return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); + }; + + // Per 1.6: + // This used to be Modernizr.historymanagement but the longer + // name has been deprecated in favor of a shorter and property-matching one. + // The old API is still available in 1.6, but as of 2.0 will throw a warning, + // and in the first release thereafter disappear entirely. + tests['history'] = function() { + return !!(window.history && history.pushState); + }; + + tests['draganddrop'] = function() { + var div = document.createElement('div'); + return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); + }; + + // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10 + // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17. + // FF10 still uses prefixes, so check for it until then. + // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/ + tests['websockets'] = function() { + return 'WebSocket' in window || 'MozWebSocket' in window; + }; + + + // css-tricks.com/rgba-browser-support/ + tests['rgba'] = function() { + // Set an rgba() color and check the returned value + + setCss('background-color:rgba(150,255,150,.5)'); + + return contains(mStyle.backgroundColor, 'rgba'); + }; + + tests['hsla'] = function() { + // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, + // except IE9 who retains it as hsla + + setCss('background-color:hsla(120,40%,100%,.5)'); + + return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla'); + }; + + tests['multiplebgs'] = function() { + // Setting multiple images AND a color on the background shorthand property + // and then querying the style.background property value for the number of + // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! + + setCss('background:url(https://),url(https://),red url(https://)'); + + // If the UA supports multiple backgrounds, there should be three occurrences + // of the string "url(" in the return value for elemStyle.background + + return (/(url\s*\(.*?){3}/).test(mStyle.background); + }; + + + + // this will false positive in Opera Mini + // github.com/Modernizr/Modernizr/issues/396 + + tests['backgroundsize'] = function() { + return testPropsAll('backgroundSize'); + }; + + tests['borderimage'] = function() { + return testPropsAll('borderImage'); + }; + + + // Super comprehensive table about all the unique implementations of + // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance + + tests['borderradius'] = function() { + return testPropsAll('borderRadius'); + }; + + // WebOS unfortunately false positives on this test. + tests['boxshadow'] = function() { + return testPropsAll('boxShadow'); + }; + + // FF3.0 will false positive on this test + tests['textshadow'] = function() { + return document.createElement('div').style.textShadow === ''; + }; + + + tests['opacity'] = function() { + // Browsers that actually have CSS Opacity implemented have done so + // according to spec, which means their return values are within the + // range of [0.0,1.0] - including the leading zero. + + setCssAll('opacity:.55'); + + // The non-literal . in this regex is intentional: + // German Chrome returns this value as 0,55 + // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632 + return (/^0.55$/).test(mStyle.opacity); + }; + + + // Note, Android < 4 will pass this test, but can only animate + // a single property at a time + // goo.gl/v3V4Gp + tests['cssanimations'] = function() { + return testPropsAll('animationName'); + }; + + + tests['csscolumns'] = function() { + return testPropsAll('columnCount'); + }; + + + tests['cssgradients'] = function() { + /** + * For CSS Gradients syntax, please see: + * webkit.org/blog/175/introducing-css-gradients/ + * developer.mozilla.org/en/CSS/-moz-linear-gradient + * developer.mozilla.org/en/CSS/-moz-radial-gradient + * dev.w3.org/csswg/css3-images/#gradients- + */ + + var str1 = 'background-image:', + str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', + str3 = 'linear-gradient(left top,#9f9, white);'; + + setCss( + // legacy webkit syntax (FIXME: remove when syntax not in use anymore) + (str1 + '-webkit- '.split(' ').join(str2 + str1) + + // standard syntax // trailing 'background-image:' + prefixes.join(str3 + str1)).slice(0, -str1.length) + ); + + return contains(mStyle.backgroundImage, 'gradient'); + }; + + + tests['cssreflections'] = function() { + return testPropsAll('boxReflect'); + }; + + + tests['csstransforms'] = function() { + return !!testPropsAll('transform'); + }; + + + tests['csstransforms3d'] = function() { + + var ret = !!testPropsAll('perspective'); + + // Webkit's 3D transforms are passed off to the browser's own graphics renderer. + // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in + // some conditions. As a result, Webkit typically recognizes the syntax but + // will sometimes throw a false positive, thus we must do a more thorough check: + if ( ret && 'webkitPerspective' in docElement.style ) { + + // Webkit allows this media query to succeed only if the feature is enabled. + // `@media (transform-3d),(-webkit-transform-3d){ ... }` + injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { + ret = node.offsetLeft === 9 && node.offsetHeight === 3; + }); + } + return ret; + }; + + + tests['csstransitions'] = function() { + return testPropsAll('transition'); + }; + + + /*>>fontface*/ + // @font-face detection routine by Diego Perini + // javascript.nwbox.com/CSSSupport/ + + // false positives: + // WebOS github.com/Modernizr/Modernizr/issues/342 + // WP7 github.com/Modernizr/Modernizr/issues/538 + tests['fontface'] = function() { + var bool; + + injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { + var style = document.getElementById('smodernizr'), + sheet = style.sheet || style.styleSheet, + cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; + + bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; + }); + + return bool; + }; + /*>>fontface*/ + + // CSS generated content detection + tests['generatedcontent'] = function() { + var bool; + + injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) { + bool = node.offsetHeight >= 3; + }); + + return bool; + }; + + + + // These tests evaluate support of the video/audio elements, as well as + // testing what types of content they support. + // + // We're using the Boolean constructor here, so that we can extend the value + // e.g. Modernizr.video // true + // Modernizr.video.ogg // 'probably' + // + // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845 + // thx to NielsLeenheer and zcorpan + + // Note: in some older browsers, "no" was a return value instead of empty string. + // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2 + // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5 + + tests['video'] = function() { + var elem = document.createElement('video'), + bool = false; + + // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,''); + + // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546 + bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,''); + + bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,''); + } + + } catch(e) { } + + return bool; + }; + + tests['audio'] = function() { + var elem = document.createElement('audio'), + bool = false; + + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''); + bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,''); + + // Mimetypes accepted: + // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements + // bit.ly/iphoneoscodecs + bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,''); + bool.m4a = ( elem.canPlayType('audio/x-m4a;') || + elem.canPlayType('audio/aac;')) .replace(/^no$/,''); + } + } catch(e) { } + + return bool; + }; + + + // In FF4, if disabled, window.localStorage should === null. + + // Normally, we could not test that directly and need to do a + // `('localStorage' in window) && ` test first because otherwise Firefox will + // throw bugzil.la/365772 if cookies are disabled + + // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem + // will throw the exception: + // QUOTA_EXCEEDED_ERRROR DOM Exception 22. + // Peculiarly, getItem and removeItem calls do not throw. + + // Because we are forced to try/catch this, we'll go aggressive. + + // Just FWIW: IE8 Compat mode supports these features completely: + // www.quirksmode.org/dom/html5.html + // But IE8 doesn't support either with local files + + tests['localstorage'] = function() { + try { + localStorage.setItem(mod, mod); + localStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + tests['sessionstorage'] = function() { + try { + sessionStorage.setItem(mod, mod); + sessionStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + + tests['webworkers'] = function() { + return !!window.Worker; + }; + + + tests['applicationcache'] = function() { + return !!window.applicationCache; + }; + + + // Thanks to Erik Dahlstrom + tests['svg'] = function() { + return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; + }; + + // specifically for SVG inline in HTML, not within XHTML + // test page: paulirish.com/demo/inline-svg + tests['inlinesvg'] = function() { + var div = document.createElement('div'); + div.innerHTML = ''; + return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; + }; + + // SVG SMIL animation + tests['smil'] = function() { + return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); + }; + + // This test is only for clip paths in SVG proper, not clip paths on HTML content + // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg + + // However read the comments to dig into applying SVG clippaths to HTML content here: + // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491 + tests['svgclippaths'] = function() { + return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); + }; + + /*>>webforms*/ + // input features and input types go directly onto the ret object, bypassing the tests loop. + // Hold this guy to execute in a moment. + function webforms() { + /*>>input*/ + // Run through HTML5's new input attributes to see if the UA understands any. + // We're using f which is the element created early on + // Mike Taylr has created a comprehensive resource for testing these attributes + // when applied to all input types: + // miketaylr.com/code/input-type-attr.html + // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + + // Only input placeholder is tested while textarea's placeholder is not. + // Currently Safari 4 and Opera 11 have support only for the input placeholder + // Both tests are available in feature-detects/forms-placeholder.js + Modernizr['input'] = (function( props ) { + for ( var i = 0, len = props.length; i < len; i++ ) { + attrs[ props[i] ] = !!(props[i] in inputElem); + } + if (attrs.list){ + // safari false positive's on datalist: webk.it/74252 + // see also github.com/Modernizr/Modernizr/issues/146 + attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); + } + return attrs; + })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); + /*>>input*/ + + /*>>inputtypes*/ + // Run through HTML5's new input types to see if the UA understands any. + // This is put behind the tests runloop because it doesn't return a + // true/false like all the other tests; instead, it returns an object + // containing each input type with its corresponding true/false value + + // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/ + Modernizr['inputtypes'] = (function(props) { + + for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { + + inputElem.setAttribute('type', inputElemType = props[i]); + bool = inputElem.type !== 'text'; + + // We first check to see if the type we give it sticks.. + // If the type does, we feed it a textual value, which shouldn't be valid. + // If the value doesn't stick, we know there's input sanitization which infers a custom UI + if ( bool ) { + + inputElem.value = smile; + inputElem.style.cssText = 'position:absolute;visibility:hidden;'; + + if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { + + docElement.appendChild(inputElem); + defaultView = document.defaultView; + + // Safari 2-4 allows the smiley as a value, despite making a slider + bool = defaultView.getComputedStyle && + defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && + // Mobile android web browser has false positive, so must + // check the height to see if the widget is actually there. + (inputElem.offsetHeight !== 0); + + docElement.removeChild(inputElem); + + } else if ( /^(search|tel)$/.test(inputElemType) ){ + // Spec doesn't define any special parsing or detectable UI + // behaviors so we pass these through as true + + // Interestingly, opera fails the earlier test, so it doesn't + // even make it here. + + } else if ( /^(url|email)$/.test(inputElemType) ) { + // Real url and email support comes with prebaked validation. + bool = inputElem.checkValidity && inputElem.checkValidity() === false; + + } else { + // If the upgraded input compontent rejects the :) text, we got a winner + bool = inputElem.value != smile; + } + } + + inputs[ props[i] ] = !!bool; + } + return inputs; + })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); + /*>>inputtypes*/ + } + /*>>webforms*/ + + + // End of test definitions + // ----------------------- + + + + // Run through all tests and detect their support in the current UA. + // todo: hypothetically we could be doing an array of tests and use a basic loop here. + for ( var feature in tests ) { + if ( hasOwnProp(tests, feature) ) { + // run the test, throw the return value into the Modernizr, + // then based on that boolean, define an appropriate className + // and push it into an array of classes we'll join later. + featureName = feature.toLowerCase(); + Modernizr[featureName] = tests[feature](); + + classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); + } + } + + /*>>webforms*/ + // input tests need to run. + Modernizr.input || webforms(); + /*>>webforms*/ + + + /** + * addTest allows the user to define their own feature tests + * the result will be added onto the Modernizr object, + * as well as an appropriate className set on the html element + * + * @param feature - String naming the feature + * @param test - Function returning true if feature is supported, false if not + */ + Modernizr.addTest = function ( feature, test ) { + if ( typeof feature == 'object' ) { + for ( var key in feature ) { + if ( hasOwnProp( feature, key ) ) { + Modernizr.addTest( key, feature[ key ] ); + } + } + } else { + + feature = feature.toLowerCase(); + + if ( Modernizr[feature] !== undefined ) { + // we're going to quit if you're trying to overwrite an existing test + // if we were to allow it, we'd do this: + // var re = new RegExp("\\b(no-)?" + feature + "\\b"); + // docElement.className = docElement.className.replace( re, '' ); + // but, no rly, stuff 'em. + return Modernizr; + } + + test = typeof test == 'function' ? test() : test; + + if (typeof enableClasses !== "undefined" && enableClasses) { + docElement.className += ' ' + (test ? '' : 'no-') + feature; + } + Modernizr[feature] = test; + + } + + return Modernizr; // allow chaining. + }; + + + // Reset modElem.cssText to nothing to reduce memory footprint. + setCss(''); + modElem = inputElem = null; + + /*>>shiv*/ + /** + * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed + */ + ;(function(window, document) { + /*jshint evil:true */ + /** version */ + var version = '3.7.0'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i>shiv*/ + + // Assign private properties to the return object with prefix + Modernizr._version = version; + + // expose these for the plugin API. Look in the source for how to join() them against your input + /*>>prefixes*/ + Modernizr._prefixes = prefixes; + /*>>prefixes*/ + /*>>domprefixes*/ + Modernizr._domPrefixes = domPrefixes; + Modernizr._cssomPrefixes = cssomPrefixes; + /*>>domprefixes*/ + + /*>>mq*/ + // Modernizr.mq tests a given media query, live against the current state of the window + // A few important notes: + // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false + // * A max-width or orientation query will be evaluated against the current state, which may change later. + // * You must specify values. Eg. If you are testing support for the min-width media query use: + // Modernizr.mq('(min-width:0)') + // usage: + // Modernizr.mq('only screen and (max-width:768)') + Modernizr.mq = testMediaQuery; + /*>>mq*/ + + /*>>hasevent*/ + // Modernizr.hasEvent() detects support for a given event, with an optional element to test on + // Modernizr.hasEvent('gesturestart', elem) + Modernizr.hasEvent = isEventSupported; + /*>>hasevent*/ + + /*>>testprop*/ + // Modernizr.testProp() investigates whether a given style property is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testProp('pointerEvents') + Modernizr.testProp = function(prop){ + return testProps([prop]); + }; + /*>>testprop*/ + + /*>>testallprops*/ + // Modernizr.testAllProps() investigates whether a given style property, + // or any of its vendor-prefixed variants, is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testAllProps('boxSizing') + Modernizr.testAllProps = testPropsAll; + /*>>testallprops*/ + + + /*>>teststyles*/ + // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards + // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) + Modernizr.testStyles = injectElementWithStyles; + /*>>teststyles*/ + + + /*>>prefixed*/ + // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input + // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' + + // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. + // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: + // + // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-'); + + // If you're trying to ascertain which transition end event to bind to, you might do something like... + // + // var transEndEventNames = { + // 'WebkitTransition' : 'webkitTransitionEnd', + // 'MozTransition' : 'transitionend', + // 'OTransition' : 'oTransitionEnd', + // 'msTransition' : 'MSTransitionEnd', + // 'transition' : 'transitionend' + // }, + // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; + + Modernizr.prefixed = function(prop, obj, elem){ + if(!obj) { + return testPropsAll(prop, 'pfx'); + } else { + // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame' + return testPropsAll(prop, obj, elem); + } + }; + /*>>prefixed*/ + + + /*>>cssclasses*/ + // Remove "no-js" class from element, if it exists: + docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + + + // Add the new classes to the element. + (enableClasses ? ' js ' + classes.join(' ') : ''); + /*>>cssclasses*/ + + return Modernizr; + +})(this, this.document); diff --git a/HerramientaCASA/wwwroot/Scripts/popper.min.js b/HerramientaCASA/wwwroot/Scripts/popper.min.js new file mode 100644 index 0000000..23122cc --- /dev/null +++ b/HerramientaCASA/wwwroot/Scripts/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.9.2 - MIT License + */ + +"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){function t(e){return{width:(e=e.getBoundingClientRect()).width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function n(e){return null==e?window:"[object Window]"!==e.toString()?(e=e.ownerDocument)&&e.defaultView||window:e}function o(e){return{scrollLeft:(e=n(e)).pageXOffset,scrollTop:e.pageYOffset}}function r(e){return e instanceof n(e).Element||e instanceof Element}function i(e){return e instanceof n(e).HTMLElement||e instanceof HTMLElement}function a(e){return"undefined"!=typeof ShadowRoot&&(e instanceof n(e).ShadowRoot||e instanceof ShadowRoot)}function s(e){return e?(e.nodeName||"").toLowerCase():null}function f(e){return((r(e)?e.ownerDocument:e.document)||window.document).documentElement}function p(e){return t(f(e)).left+o(e).scrollLeft}function c(e){return n(e).getComputedStyle(e)}function l(e){return e=c(e),/auto|scroll|overlay|hidden/.test(e.overflow+e.overflowY+e.overflowX)}function u(e,r,a){void 0===a&&(a=!1);var c=f(r);e=t(e);var u=i(r),d={scrollLeft:0,scrollTop:0},m={x:0,y:0};return(u||!u&&!a)&&(("body"!==s(r)||l(c))&&(d=r!==n(r)&&i(r)?{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}:o(r)),i(r)?((m=t(r)).x+=r.clientLeft,m.y+=r.clientTop):c&&(m.x=p(c))),{x:e.left+d.scrollLeft-m.x,y:e.top+d.scrollTop-m.y,width:e.width,height:e.height}}function d(e){var n=t(e),o=e.offsetWidth,r=e.offsetHeight;return 1>=Math.abs(n.width-o)&&(o=n.width),1>=Math.abs(n.height-r)&&(r=n.height),{x:e.offsetLeft,y:e.offsetTop,width:o,height:r}}function m(e){return"html"===s(e)?e:e.assignedSlot||e.parentNode||(a(e)?e.host:null)||f(e)}function h(e){return 0<=["html","body","#document"].indexOf(s(e))?e.ownerDocument.body:i(e)&&l(e)?e:h(m(e))}function v(e,t){var o;void 0===t&&(t=[]);var r=h(e);return e=r===(null==(o=e.ownerDocument)?void 0:o.body),o=n(r),r=e?[o].concat(o.visualViewport||[],l(r)?r:[]):r,t=t.concat(r),e?t:t.concat(v(m(r)))}function g(e){return i(e)&&"fixed"!==c(e).position?e.offsetParent:null}function y(e){for(var t=n(e),o=g(e);o&&0<=["table","td","th"].indexOf(s(o))&&"static"===c(o).position;)o=g(o);if(o&&("html"===s(o)||"body"===s(o)&&"static"===c(o).position))return t;if(!o)e:{if(o=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),-1===navigator.userAgent.indexOf("Trident")||!i(e)||"fixed"!==c(e).position)for(e=m(e);i(e)&&0>["html","body"].indexOf(s(e));){var r=c(e);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||o&&"filter"===r.willChange||o&&r.filter&&"none"!==r.filter){o=e;break e}e=e.parentNode}o=null}return o||t}function b(e){function t(e){o.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){o.has(e)||(e=n.get(e))&&t(e)})),r.push(e)}var n=new Map,o=new Set,r=[];return e.forEach((function(e){n.set(e.name,e)})),e.forEach((function(e){o.has(e.name)||t(e)})),r}function w(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function x(e){return e.split("-")[0]}function O(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&a(n))do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function j(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function E(e,r){if("viewport"===r){r=n(e);var a=f(e);r=r.visualViewport;var s=a.clientWidth;a=a.clientHeight;var l=0,u=0;r&&(s=r.width,a=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=r.offsetLeft,u=r.offsetTop)),e=j(e={width:s,height:a,x:l+p(e),y:u})}else i(r)?((e=t(r)).top+=r.clientTop,e.left+=r.clientLeft,e.bottom=e.top+r.clientHeight,e.right=e.left+r.clientWidth,e.width=r.clientWidth,e.height=r.clientHeight,e.x=e.left,e.y=e.top):(u=f(e),e=f(u),s=o(u),r=null==(a=u.ownerDocument)?void 0:a.body,a=_(e.scrollWidth,e.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),l=_(e.scrollHeight,e.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),u=-s.scrollLeft+p(u),s=-s.scrollTop,"rtl"===c(r||e).direction&&(u+=_(e.clientWidth,r?r.clientWidth:0)-a),e=j({width:a,height:l,x:u,y:s}));return e}function D(e,t,n){return t="clippingParents"===t?function(e){var t=v(m(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?y(e):e;return r(n)?t.filter((function(e){return r(e)&&O(e,n)&&"body"!==s(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=E(e,n),t.top=_(n.top,t.top),t.right=U(n.right,t.right),t.bottom=U(n.bottom,t.bottom),t.left=_(n.left,t.left),t}),E(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function L(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function P(e){var t=e.reference,n=e.element,o=(e=e.placement)?x(e):null;e=e?e.split("-")[1]:null;var r=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(o){case"top":r={x:r,y:t.y-n.height};break;case"bottom":r={x:r,y:t.y+t.height};break;case"right":r={x:t.x+t.width,y:i};break;case"left":r={x:t.x-n.width,y:i};break;default:r={x:t.x,y:t.y}}if(null!=(o=o?L(o):null))switch(i="y"===o?"height":"width",e){case"start":r[o]-=t[i]/2-n[i]/2;break;case"end":r[o]+=t[i]/2-n[i]/2}return r}function M(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function k(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function A(e,n){void 0===n&&(n={});var o=n;n=void 0===(n=o.placement)?e.placement:n;var i=o.boundary,a=void 0===i?"clippingParents":i,s=void 0===(i=o.rootBoundary)?"viewport":i;i=void 0===(i=o.elementContext)?"popper":i;var p=o.altBoundary,c=void 0!==p&&p;o=M("number"!=typeof(o=void 0===(o=o.padding)?0:o)?o:k(o,C));var l=e.elements.reference;p=e.rects.popper,a=D(r(c=e.elements[c?"popper"===i?"reference":"popper":i])?c:c.contextElement||f(e.elements.popper),a,s),c=P({reference:s=t(l),element:p,strategy:"absolute",placement:n}),p=j(Object.assign({},p,c)),s="popper"===i?p:s;var u={top:a.top-s.top+o.top,bottom:s.bottom-a.bottom+o.bottom,left:a.left-s.left+o.left,right:s.right-a.right+o.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function W(){for(var e=arguments.length,t=Array(e),n=0;n(g.devicePixelRatio||1)?"translate("+e+"px, "+u+"px)":"translate3d("+e+"px, "+u+"px, 0)",m)):Object.assign({},o,((t={})[v]=a?u+"px":"",t[h]=d?e+"px":"",t.transform="",t))}function H(e){return e.replace(/left|right|bottom|top/g,(function(e){return $[e]}))}function R(e){return e.replace(/start|end/g,(function(e){return ee[e]}))}function S(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function q(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var C=["top","bottom","right","left"],N=C.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),V=[].concat(C,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),I="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),_=Math.max,U=Math.min,z=Math.round,F={placement:"bottom",modifiers:[],strategy:"absolute"},X={passive:!0},Y={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,o=e.instance,r=(e=e.options).scroll,i=void 0===r||r,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",o.update,X)})),a&&s.addEventListener("resize",o.update,X),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",o.update,X)})),a&&s.removeEventListener("resize",o.update,X)}},data:{}},G={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=P({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},J={top:"auto",right:"auto",bottom:"auto",left:"auto"},K={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e;var o=n.adaptive;o=void 0===o||o,n=void 0===(n=n.roundOffsets)||n,e={placement:x(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,T(Object.assign({},e,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:o,roundOffsets:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,T(Object.assign({},e,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:n})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},Q={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},r=t.elements[e];i(r)&&s(r)&&(Object.assign(r.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],r=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(o)&&s(o)&&(Object.assign(o.style,e),Object.keys(r).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]},Z={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,o=void 0===(e=e.options.offset)?[0,0]:e,r=(e=V.reduce((function(e,n){var r=t.rects,i=x(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof o?o(Object.assign({},r,{placement:n})):o;return r=(r=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:r}:{x:r,y:s},e[n]=i,e}),{}))[t.placement],i=r.x;r=r.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=r),t.modifiersData[n]=e}},$={left:"right",right:"left",bottom:"top",top:"bottom"},ee={start:"end",end:"start"},te={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var o=n.mainAxis;o=void 0===o||o;var r=n.altAxis;r=void 0===r||r;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,p=n.altBoundary,c=n.flipVariations,l=void 0===c||c,u=n.allowedAutoPlacements;c=x(n=t.options.placement),i=i||(c!==n&&l?function(e){if("auto"===x(e))return[];var t=H(e);return[R(e),t,R(t)]}(n):[H(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===x(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,o=t.rootBoundary,r=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?V:a,f=t.placement.split("-")[1];0===(i=(t=f?i?N:N.filter((function(e){return e.split("-")[1]===f})):C).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var p=i.reduce((function(t,i){return t[i]=A(e,{placement:i,boundary:n,rootBoundary:o,padding:r})[x(i)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;c=!0;for(var h=d[0],v=0;vi[O]&&(b=H(b)),O=H(b),w=[],o&&w.push(0>=j[y]),r&&w.push(0>=j[b],0>=j[O]),w.every((function(e){return e}))){h=g,c=!1;break}m.set(g,w)}if(c)for(o=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},r=l?3:1;0code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/HerramientaCASA/wwwroot/bootstrap/bootstrap.min.css.map b/HerramientaCASA/wwwroot/bootstrap/bootstrap.min.css.map new file mode 100644 index 0000000..afcd9e3 --- /dev/null +++ b/HerramientaCASA/wwwroot/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}-root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`