diff --git a/src/Mixcore.sln b/src/Mixcore.sln index 80b39793d..2ab0101d1 100644 --- a/src/Mixcore.sln +++ b/src/Mixcore.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31912.275 @@ -37,7 +37,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.grpc", "modules\mix.grp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.queue", "platform\mix.queue\mix.queue.csproj", "{2E843175-B948-4D90-A11B-415EE67D9E1A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.heart", "platform\core\mix-heart\src\Mix.Heart\mix.heart.csproj", "{D4938E22-22C3-4364-A710-557B63954B5E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.heart", "platform\core\mix-heart\src\mix.heart\mix.heart.csproj", "{D4938E22-22C3-4364-A710-557B63954B5E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.tenancy", "modules\mix.tenancy\mix.tenancy.csproj", "{2D254550-CE54-43A2-8AE9-FAA72F2C0FD6}" EndProject @@ -107,23 +107,28 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.log", "modules\mix.log\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.auth", "platform\mix.auth\mix.auth.csproj", "{67C7637A-1E86-49C0-8BBB-F91260F9058F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore", "applications\mixcore\mixcore.csproj", "{BEFA0F34-2594-4E77-88A9-4DF2B535343A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.portal", "modules\mix.portal\mix.portal.csproj", "{F5D4C70F-DD2E-4EC9-A191-56A717B1B5EE}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore.host.aspire.AppHost", "applications\mixcore.host.aspire\mixcore.host.aspire.AppHost\mixcore.host.aspire.AppHost.csproj", "{803BBEFE-A5AF-4C43-87FC-DA9132F18498}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mix-message-queue", "mix-message-queue", "{C93898B7-2001-4C29-9BBE-33A2E61C350A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore.host.aspire.ServiceDefaults", "applications\mixcore.host.aspire\mixcore.host.aspire.ServiceDefaults\mixcore.host.aspire.ServiceDefaults.csproj", "{3BADD396-E830-468B-B2D8-A52FD5E6C6BD}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mix-auth-service", "mix-auth-service", "{7E1C5D8B-58B4-40B1-8BA7-F8F80B76F276}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore.gateway", "applications\mixcore.gateway\mixcore.gateway.csproj", "{5FA252B6-6FDA-451E-BE5E-F6D82EDE9AB1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore", "applications\mixcore\mixcore.csproj", "{015CAD77-646A-4AD4-A049-11E373BAFE80}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.portal", "modules\mix.portal\mix.portal.csproj", "{F5D4C70F-DD2E-4EC9-A191-56A717B1B5EE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore.gateway", "applications\mixcore.gateway\mixcore.gateway.csproj", "{93B46374-306E-4A4D-AD68-89CD1CA3FA33}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mix-message-queue", "mix-message-queue", "{C93898B7-2001-4C29-9BBE-33A2E61C350A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore.host.aspire.AppHost", "applications\mixcore.host.aspire.AppHost\mixcore.host.aspire.AppHost.csproj", "{77215C0B-A8EF-4490-9B49-A3C631E0C4E5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mixcore.host.aspire.ServiceDefaults", "applications\mixcore.host.aspire.ServiceDefaults\mixcore.host.aspire.ServiceDefaults.csproj", "{A094BEBE-9607-4AE9-A9DB-9BF7BF704F2F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mix-auth-service", "mix-auth-service", "{EC933357-1D95-4CDD-B290-7A5984FC1AA2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.auth.api", "services\core\mix-auth-service\mix.auth.api\mix.auth.api.csproj", "{4B4B73DD-9014-4609-89A0-3297289157A6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.mq.server", "services\mix-message-queue\mix.mq.server\mix.mq.server.csproj", "{7C5101F3-E3E6-42DB-8585-D08C2BE5E30C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.mq.server", "services\core\mix-message-queue\mix.mq.server\mix.mq.server.csproj", "{737720EE-DF6F-4457-84D6-45E0E2F209E6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mix.auth.api", "services\mix-auth-service\mix.auth.api\mix.auth.api.csproj", "{9C04921A-38D5-4EC9-8FF5-0E0D74681049}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution items", "solution items", "{3D065AA9-4DAA-4B82-8C7F-3372B5EFA5A5}" + ProjectSection(SolutionItems) = preProject + Readme.md = Readme.md + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -259,34 +264,34 @@ Global {67C7637A-1E86-49C0-8BBB-F91260F9058F}.Debug|Any CPU.Build.0 = Debug|Any CPU {67C7637A-1E86-49C0-8BBB-F91260F9058F}.Release|Any CPU.ActiveCfg = Release|Any CPU {67C7637A-1E86-49C0-8BBB-F91260F9058F}.Release|Any CPU.Build.0 = Release|Any CPU - {BEFA0F34-2594-4E77-88A9-4DF2B535343A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEFA0F34-2594-4E77-88A9-4DF2B535343A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEFA0F34-2594-4E77-88A9-4DF2B535343A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEFA0F34-2594-4E77-88A9-4DF2B535343A}.Release|Any CPU.Build.0 = Release|Any CPU - {803BBEFE-A5AF-4C43-87FC-DA9132F18498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {803BBEFE-A5AF-4C43-87FC-DA9132F18498}.Debug|Any CPU.Build.0 = Debug|Any CPU - {803BBEFE-A5AF-4C43-87FC-DA9132F18498}.Release|Any CPU.ActiveCfg = Release|Any CPU - {803BBEFE-A5AF-4C43-87FC-DA9132F18498}.Release|Any CPU.Build.0 = Release|Any CPU - {3BADD396-E830-468B-B2D8-A52FD5E6C6BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3BADD396-E830-468B-B2D8-A52FD5E6C6BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3BADD396-E830-468B-B2D8-A52FD5E6C6BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3BADD396-E830-468B-B2D8-A52FD5E6C6BD}.Release|Any CPU.Build.0 = Release|Any CPU - {5FA252B6-6FDA-451E-BE5E-F6D82EDE9AB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5FA252B6-6FDA-451E-BE5E-F6D82EDE9AB1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5FA252B6-6FDA-451E-BE5E-F6D82EDE9AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5FA252B6-6FDA-451E-BE5E-F6D82EDE9AB1}.Release|Any CPU.Build.0 = Release|Any CPU {F5D4C70F-DD2E-4EC9-A191-56A717B1B5EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F5D4C70F-DD2E-4EC9-A191-56A717B1B5EE}.Debug|Any CPU.Build.0 = Debug|Any CPU {F5D4C70F-DD2E-4EC9-A191-56A717B1B5EE}.Release|Any CPU.ActiveCfg = Release|Any CPU {F5D4C70F-DD2E-4EC9-A191-56A717B1B5EE}.Release|Any CPU.Build.0 = Release|Any CPU - {7C5101F3-E3E6-42DB-8585-D08C2BE5E30C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7C5101F3-E3E6-42DB-8585-D08C2BE5E30C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7C5101F3-E3E6-42DB-8585-D08C2BE5E30C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7C5101F3-E3E6-42DB-8585-D08C2BE5E30C}.Release|Any CPU.Build.0 = Release|Any CPU - {9C04921A-38D5-4EC9-8FF5-0E0D74681049}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C04921A-38D5-4EC9-8FF5-0E0D74681049}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C04921A-38D5-4EC9-8FF5-0E0D74681049}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C04921A-38D5-4EC9-8FF5-0E0D74681049}.Release|Any CPU.Build.0 = Release|Any CPU + {015CAD77-646A-4AD4-A049-11E373BAFE80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {015CAD77-646A-4AD4-A049-11E373BAFE80}.Debug|Any CPU.Build.0 = Debug|Any CPU + {015CAD77-646A-4AD4-A049-11E373BAFE80}.Release|Any CPU.ActiveCfg = Release|Any CPU + {015CAD77-646A-4AD4-A049-11E373BAFE80}.Release|Any CPU.Build.0 = Release|Any CPU + {93B46374-306E-4A4D-AD68-89CD1CA3FA33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93B46374-306E-4A4D-AD68-89CD1CA3FA33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93B46374-306E-4A4D-AD68-89CD1CA3FA33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93B46374-306E-4A4D-AD68-89CD1CA3FA33}.Release|Any CPU.Build.0 = Release|Any CPU + {77215C0B-A8EF-4490-9B49-A3C631E0C4E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77215C0B-A8EF-4490-9B49-A3C631E0C4E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77215C0B-A8EF-4490-9B49-A3C631E0C4E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77215C0B-A8EF-4490-9B49-A3C631E0C4E5}.Release|Any CPU.Build.0 = Release|Any CPU + {A094BEBE-9607-4AE9-A9DB-9BF7BF704F2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A094BEBE-9607-4AE9-A9DB-9BF7BF704F2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A094BEBE-9607-4AE9-A9DB-9BF7BF704F2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A094BEBE-9607-4AE9-A9DB-9BF7BF704F2F}.Release|Any CPU.Build.0 = Release|Any CPU + {4B4B73DD-9014-4609-89A0-3297289157A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B4B73DD-9014-4609-89A0-3297289157A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B4B73DD-9014-4609-89A0-3297289157A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B4B73DD-9014-4609-89A0-3297289157A6}.Release|Any CPU.Build.0 = Release|Any CPU + {737720EE-DF6F-4457-84D6-45E0E2F209E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {737720EE-DF6F-4457-84D6-45E0E2F209E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {737720EE-DF6F-4457-84D6-45E0E2F209E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {737720EE-DF6F-4457-84D6-45E0E2F209E6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -343,15 +348,15 @@ Global {BC6B8583-4F0F-45AD-BF71-1D998AA65869} = {84C68A6F-ECE0-467E-91C0-AE63AC4FC4C7} {F37BBDB4-EB48-42E4-8CB1-D459F5EF3C3F} = {B4C40E02-E06A-4359-BDC5-349E103366AD} {67C7637A-1E86-49C0-8BBB-F91260F9058F} = {0027B7D2-664D-4872-AE99-BA2A2BCA6B2E} - {BEFA0F34-2594-4E77-88A9-4DF2B535343A} = {4E880812-C336-4EB2-9FED-2E437957F50A} - {803BBEFE-A5AF-4C43-87FC-DA9132F18498} = {4E880812-C336-4EB2-9FED-2E437957F50A} - {3BADD396-E830-468B-B2D8-A52FD5E6C6BD} = {4E880812-C336-4EB2-9FED-2E437957F50A} - {5FA252B6-6FDA-451E-BE5E-F6D82EDE9AB1} = {4E880812-C336-4EB2-9FED-2E437957F50A} {F5D4C70F-DD2E-4EC9-A191-56A717B1B5EE} = {B4C40E02-E06A-4359-BDC5-349E103366AD} - {C93898B7-2001-4C29-9BBE-33A2E61C350A} = {C0A05428-767E-46C5-A31F-0D220E41F7C5} - {EC933357-1D95-4CDD-B290-7A5984FC1AA2} = {C0A05428-767E-46C5-A31F-0D220E41F7C5} - {7C5101F3-E3E6-42DB-8585-D08C2BE5E30C} = {C93898B7-2001-4C29-9BBE-33A2E61C350A} - {9C04921A-38D5-4EC9-8FF5-0E0D74681049} = {EC933357-1D95-4CDD-B290-7A5984FC1AA2} + {C93898B7-2001-4C29-9BBE-33A2E61C350A} = {7C9FFA1B-D992-4E3F-B2B1-74D86E81512D} + {7E1C5D8B-58B4-40B1-8BA7-F8F80B76F276} = {7C9FFA1B-D992-4E3F-B2B1-74D86E81512D} + {015CAD77-646A-4AD4-A049-11E373BAFE80} = {4E880812-C336-4EB2-9FED-2E437957F50A} + {93B46374-306E-4A4D-AD68-89CD1CA3FA33} = {4E880812-C336-4EB2-9FED-2E437957F50A} + {77215C0B-A8EF-4490-9B49-A3C631E0C4E5} = {4E880812-C336-4EB2-9FED-2E437957F50A} + {A094BEBE-9607-4AE9-A9DB-9BF7BF704F2F} = {4E880812-C336-4EB2-9FED-2E437957F50A} + {4B4B73DD-9014-4609-89A0-3297289157A6} = {7E1C5D8B-58B4-40B1-8BA7-F8F80B76F276} + {737720EE-DF6F-4457-84D6-45E0E2F209E6} = {C93898B7-2001-4C29-9BBE-33A2E61C350A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0143C230-7F40-44B2-8BA3-EF5B92D55848} diff --git a/src/applications/mixcore.gateway/Dockerfile b/src/applications/mixcore.gateway/Dockerfile index 5a52d3bc8..d097c8ccb 100644 --- a/src/applications/mixcore.gateway/Dockerfile +++ b/src/applications/mixcore.gateway/Dockerfile @@ -9,9 +9,29 @@ EXPOSE 8081 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src +COPY ["platform/core/mix-heart/nuget.config", "platform/core/mix-heart/"] COPY ["applications/mixcore.gateway/mixcore.gateway.csproj", "applications/mixcore.gateway/"] -COPY ["applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/"] -RUN dotnet restore "./applications/mixcore.gateway/./mixcore.gateway.csproj" +COPY ["platform/mix.library/mix.library.csproj", "platform/mix.library/"] +COPY ["platform/core/mix.mixdb.event/mix.mixdb.event.csproj", "platform/core/mix.mixdb.event/"] +COPY ["platform/mix.mixdb/mix.mixdb.csproj", "platform/mix.mixdb/"] +COPY ["platform/mix.database/mix.database.csproj", "platform/mix.database/"] +COPY ["platform/mix.shared/mix.shared.csproj", "platform/mix.shared/"] +COPY ["platform/core/mix-heart/src/mix.heart/mix.heart.csproj", "platform/core/mix-heart/src/mix.heart/"] +COPY ["platform/mix.constant/mix.constant.csproj", "platform/mix.constant/"] +COPY ["platform/mix.service/mix.service.csproj", "platform/mix.service/"] +COPY ["platform/mix.identity/mix.identity.csproj", "platform/mix.identity/"] +COPY ["platform/mix.auth/mix.auth.csproj", "platform/mix.auth/"] +COPY ["platform/mix.quartz/mix.quartz.csproj", "platform/mix.quartz/"] +COPY ["platform/mix.queue/mix.queue.csproj", "platform/mix.queue/"] +COPY ["services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj", "services/core/mix-message-queue/mix.mq/"] +COPY ["applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "applications/mixcore.host.aspire.ServiceDefaults/"] +COPY ["services/core/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj", "services/core/mix-message-queue/mix.mq.lib/"] +COPY ["platform/mix.signalr/mix.signalr.csproj", "platform/mix.signalr/"] +COPY ["platform/mix.repodb/mix.repodb.csproj", "platform/mix.repodb/"] +COPY ["platform/mix.communicator/mix.communicator.csproj", "platform/mix.communicator/"] +COPY ["platform/mix.signalr.hub/mix.signalr.hub.csproj", "platform/mix.signalr.hub/"] +COPY ["platform/mix.log/mix.log.lib.csproj", "platform/mix.log/"] +RUN dotnet restore "./applications/mixcore.gateway/mixcore.gateway.csproj" COPY . . WORKDIR "/src/applications/mixcore.gateway" RUN dotnet build "./mixcore.gateway.csproj" -c $BUILD_CONFIGURATION -o /app/build diff --git a/src/applications/mixcore.gateway/Program.cs b/src/applications/mixcore.gateway/Program.cs index 3416ac75d..7ca965d7c 100644 --- a/src/applications/mixcore.gateway/Program.cs +++ b/src/applications/mixcore.gateway/Program.cs @@ -4,6 +4,7 @@ using Mix.Database.Entities.Cms; using Mix.Heart.Services; using Mix.Lib.Helpers; +using Mix.Lib.Services; using Mix.Shared.Services; using Ocelot.DependencyInjection; using Ocelot.Middleware; @@ -36,10 +37,14 @@ builder.Services.AddControllers(); builder.Services.AddMixServices(Assembly.GetExecutingAssembly(), builder.Configuration); builder.Services.AddMixAuthorize(builder.Configuration); +builder.Services.AddScoped(); builder.Services.TryAddSingleton(); builder.Services.AddOcelot(builder.Configuration); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); +if (!builder.Environment.IsDevelopment()) +{ + builder.Services.AddEndpointsApiExplorer(); +} if (isInit) { builder.Services.AddCors(options => diff --git a/src/applications/mixcore.gateway/appsettings.Production.json b/src/applications/mixcore.gateway/appsettings.Production.json new file mode 100644 index 000000000..04f5eda0b --- /dev/null +++ b/src/applications/mixcore.gateway/appsettings.Production.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Critical", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/applications/mixcore.gateway/mixcore.gateway.csproj b/src/applications/mixcore.gateway/mixcore.gateway.csproj index 46219679d..674fa9c5d 100644 --- a/src/applications/mixcore.gateway/mixcore.gateway.csproj +++ b/src/applications/mixcore.gateway/mixcore.gateway.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -13,16 +13,16 @@ - - - - - + + + + + - + diff --git a/src/applications/mixcore.gateway/ocelot.json b/src/applications/mixcore.gateway/ocelot.json deleted file mode 100644 index 31aa9590e..000000000 --- a/src/applications/mixcore.gateway/ocelot.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "Routes": [ - { - "Priority": 0, - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "https", - "DownstreamHostAndPorts": [ - { - "Host": "localhost", - "Port": 5010 - } - ], - "UpstreamPathTemplate": "/{everything}", - "UpstreamHttpMethod": [ "Get", "Post", "Put", "Patch", "Delete" ], - "RateLimitOptions": { - "ClientWhitelist": [], - "EnableRateLimiting": true, - "Period": "1s", - "PeriodTimespan": 1, - "Limit": 10 - }, - "FileCacheOptions": { - "TtlSeconds": 0, - "Region": "VN" - }, - "HttpHandlerOptions": { - "AllowAutoRedirect": true, - "UseCookieContainer": true, - "UseTracing": true, - "MaxConnectionsPerServer": 20 - } - } - ], - "GlobalConfiguration": { - "BaseUrl": "" - } -} \ No newline at end of file diff --git a/src/applications/mixcore.gateway/ocelot.sample.json b/src/applications/mixcore.gateway/ocelot.sample.json deleted file mode 100644 index 7c583e0ba..000000000 --- a/src/applications/mixcore.gateway/ocelot.sample.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "Routes": [ - { - "Priority": 0, - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "https", - "DownstreamHostAndPorts": [ - { - "Host": "localhost", - "Port": 5010 - } - ], - "UpstreamPathTemplate": "/{everything}", - "UpstreamHttpMethod": [ "Get", "Post", "Put", "Patch", "Delete", "options" ], - "RateLimitOptions": { - "ClientWhitelist": [], - "EnableRateLimiting": true, - "Period": "1s", - "PeriodTimespan": 1, - "Limit": 100 - }, - "FileCacheOptions": { - "TtlSeconds": 10, - "Region": "VN" - }, - "HttpHandlerOptions": { - "AllowAutoRedirect": true, - "UseCookieContainer": true, - "UseTracing": true, - "MaxConnectionsPerServer": 20 - } - }, - { - "Priority": 1, - "DownstreamPathTemplate": "/hub/{everything}", - "DownstreamScheme": "ws", - "DownstreamHostAndPorts": [ - { - "Host": "localhost", - "Port": 5010 - } - ], - "UpstreamPathTemplate": "/hub/{everything}", - "UpstreamHttpMethod": [ "Get", "Post", "Put", "Patch", "Delete", "options" ], - "RateLimitOptions": { - "ClientWhitelist": [], - "EnableRateLimiting": true, - "Period": "1s", - "PeriodTimespan": 1, - "Limit": 100 - }, - "FileCacheOptions": { - "TtlSeconds": 10, - "Region": "VN" - }, - "HttpHandlerOptions": { - "AllowAutoRedirect": true, - "UseCookieContainer": true, - "UseTracing": true, - "MaxConnectionsPerServer": 20 - } - } - ], - "GlobalConfiguration": { - "RateLimitOptions": { - "DisableRateLimitHeaders": false, - "QuotaExceededMessage": "Customize Tips!", - "HttpStatusCode": 999, - "ClientIdHeader": "Test" - }, - "HttpHandlerOptions": { - "AllowAutoRedirect": true, - "UseCookieContainer": true, - "UseTracing": true, - "MaxConnectionsPerServer": 20 - }, - "BaseUrl": "https://localhost:7221" - } -} \ No newline at end of file diff --git a/src/applications/mixcore.host.aspire.AppHost/Program.cs b/src/applications/mixcore.host.aspire.AppHost/Program.cs new file mode 100644 index 000000000..c67370b40 --- /dev/null +++ b/src/applications/mixcore.host.aspire.AppHost/Program.cs @@ -0,0 +1,6 @@ +var builder = DistributedApplication.CreateBuilder(args); + +var mixcore = builder.AddProject("mixcore"); +builder.AddProject("mixcore-gateway").WithReference(mixcore); + +builder.Build().Run(); diff --git a/src/applications/mixcore.host.aspire.AppHost/mixcore.host.aspire.AppHost.csproj b/src/applications/mixcore.host.aspire.AppHost/mixcore.host.aspire.AppHost.csproj new file mode 100644 index 000000000..30102f25b --- /dev/null +++ b/src/applications/mixcore.host.aspire.AppHost/mixcore.host.aspire.AppHost.csproj @@ -0,0 +1,23 @@ + + + + Exe + net8.0 + enable + enable + true + + + + + + + + + + + + + + + diff --git a/src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/Extensions.cs b/src/applications/mixcore.host.aspire.ServiceDefaults/Extensions.cs similarity index 99% rename from src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/Extensions.cs rename to src/applications/mixcore.host.aspire.ServiceDefaults/Extensions.cs index bbe43d57a..cdd1bce48 100644 --- a/src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/Extensions.cs +++ b/src/applications/mixcore.host.aspire.ServiceDefaults/Extensions.cs @@ -25,7 +25,7 @@ public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBu http.AddStandardResilienceHandler(); // Turn on service discovery by default - http.UseServiceDiscovery(); + http.AddServiceDiscovery(); }); return builder; diff --git a/src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj b/src/applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj similarity index 82% rename from src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj rename to src/applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj index 07112a618..a398224f1 100644 --- a/src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj +++ b/src/applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj @@ -13,17 +13,18 @@ - - - + + + - - + + - - - - + + + + + diff --git a/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/Program.cs b/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/Program.cs deleted file mode 100644 index 1f65b47c9..000000000 --- a/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/Program.cs +++ /dev/null @@ -1,10 +0,0 @@ -var builder = DistributedApplication.CreateBuilder(args); - -//var mixmq = builder.AddProject("mix.mq.server"); - -var mixcore = builder.AddProject("mixcore"); - -//builder.AddProject("mix.auth.api"); -builder.AddProject("mixcore.gateway"); - -builder.Build().Run(); diff --git a/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/Properties/launchSettings.json b/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/Properties/launchSettings.json deleted file mode 100644 index 606cc3684..000000000 --- a/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/Properties/launchSettings.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "profiles": { - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:15173", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "DOTNET_ENVIRONMENT": "Development", - "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:16178" - } - } - } -} diff --git a/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/mixcore.host.aspire.AppHost.csproj b/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/mixcore.host.aspire.AppHost.csproj deleted file mode 100644 index 61bf092d4..000000000 --- a/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/mixcore.host.aspire.AppHost.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - Exe - net8.0 - enable - enable - true - - - - - - - - - - - - - - diff --git a/src/applications/mixcore/Controllers/SecurityController.cs b/src/applications/mixcore/Controllers/SecurityController.cs index 08f4e6a71..72d5e8c5e 100644 --- a/src/applications/mixcore/Controllers/SecurityController.cs +++ b/src/applications/mixcore/Controllers/SecurityController.cs @@ -7,6 +7,7 @@ using Mix.Heart.Exceptions; using Mix.Lib.Services; using Mix.Shared.Services; +using Quartz.Listener; using System.Security.Claims; namespace Mixcore.Controllers @@ -92,7 +93,7 @@ public async Task> ExternalLoginResultAsync(string returnU var token = await _idService.GetAuthData(user, true, CurrentTenant.Id); return View(new ExternalLoginResultModel() { - Token = token.ToString(Formatting.None), + Token = JObject.FromObject(token).ToString(Formatting.None), ReturnUrl = returnUrl }); } @@ -116,7 +117,7 @@ public async Task> ExternalLoginResultAsync(string returnU var token = await _idService.GetAuthData(user, true, CurrentTenant.Id); return View(new ExternalLoginResultModel() { - Token = token.ToString(Formatting.None), + Token = JObject.FromObject(token).ToString(Formatting.None), ReturnUrl = returnUrl }); } @@ -139,7 +140,7 @@ public async Task> ExternalLoginResultAsync(string returnU var token = await _idService.GetAuthData(user, true, CurrentTenant.Id); return View(new ExternalLoginResultModel() { - Token = token.ToString(Formatting.None), + Token = JObject.FromObject(token).ToString(Formatting.None), ReturnUrl = returnUrl }); } diff --git a/src/applications/mixcore/Dockerfile b/src/applications/mixcore/Dockerfile index fd5628b46..30ea86d2f 100644 --- a/src/applications/mixcore/Dockerfile +++ b/src/applications/mixcore/Dockerfile @@ -8,7 +8,7 @@ EXPOSE 8081 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release COPY ["src/applications/mixcore/mixcore.csproj", "src/applications/mixcore/"] -COPY ["src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "src/applications/mixcore.host.aspire/mixcore.host.aspire.ServiceDefaults/"] +COPY ["src/applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "src/applications/mixcore.host.aspire.ServiceDefaults/"] COPY ["src/platform/mix.identity/mix.identity.csproj", "src/platform/mix.identity/"] COPY ["src/platform/mix.database/mix.database.csproj", "src/platform/mix.database/"] COPY ["src/platform/mix.shared/mix.shared.csproj", "src/platform/mix.shared/"] @@ -20,8 +20,8 @@ COPY ["src/platform/mix.mixdb/mix.mixdb.csproj", "src/platform/mix.mixdb/"] COPY ["src/platform/mix.service/mix.service.csproj", "src/platform/mix.service/"] COPY ["src/platform/mix.quartz/mix.quartz.csproj", "src/platform/mix.quartz/"] COPY ["src/platform/mix.queue/mix.queue.csproj", "src/platform/mix.queue/"] -COPY ["src/services/mix-message-queue/mix.mq.server/mix.mq.server.csproj", "src/services/mix-message-queue/mix.mq/"] -COPY ["src/services/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj", "src/services/mix-message-queue/mix.mq.lib/"] +COPY ["src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj", "src/services/core/mix-message-queue/mix.mq/"] +COPY ["src/services/core/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj", "src/services/core/mix-message-queue/mix.mq.lib/"] COPY ["src/platform/mix.signalr/mix.signalr.csproj", "src/platform/mix.signalr/"] COPY ["src/platform/mix.repodb/mix.repodb.csproj", "src/platform/mix.repodb/"] COPY ["src/platform/mix.communicator/mix.communicator.csproj", "src/platform/mix.communicator/"] diff --git a/src/applications/mixcore/Domain/Services/MixNavigationService.cs b/src/applications/mixcore/Domain/Services/MixNavigationService.cs index 20bad4777..7e6803978 100644 --- a/src/applications/mixcore/Domain/Services/MixNavigationService.cs +++ b/src/applications/mixcore/Domain/Services/MixNavigationService.cs @@ -14,7 +14,7 @@ public MixNavigationService(MixCmsContext context) public Task GetNavigationAsync(string name, string culture, IUrlHelper Url) { - // TODO: Update get nav + // TODO: PUT get nav return default; } } diff --git a/src/applications/mixcore/Domain/StartupServices.cs b/src/applications/mixcore/Domain/StartupServices.cs index d66d94d3c..fcf8ab1d6 100644 --- a/src/applications/mixcore/Domain/StartupServices.cs +++ b/src/applications/mixcore/Domain/StartupServices.cs @@ -1,9 +1,12 @@ using Microsoft.Extensions.DependencyInjection.Extensions; +using Mix.Lib.Middlewares; using Mix.Lib.Publishers; using Mix.Lib.Subscribers; +using Mix.Log.Lib.Interfaces; +using Mix.Log.Lib.Models; using Mix.Log.Lib.Publishers; +using Mix.Log.Lib.Services; using Mix.Log.Lib.Subscribers; -using Mix.Quartz.Interfaces; using Mix.Quartz.Services; using Mix.RepoDb.Publishers; using Mix.RepoDb.Subscribers; @@ -30,12 +33,14 @@ public void AddServices(IServiceCollection services, IConfiguration configuratio services.AddHostedService(); services.AddHostedService(); - services.AddMixQuartzServices(configuration); + services.AddHostedService(); services.AddHostedService(); if (!globalConfigs!.IsInit) { - services.AddHostedService(); + services.TryAddSingleton(); + services.TryAddScoped(); + services.AddHostedService(); } services.AddMixRateLimiter(configuration); @@ -43,6 +48,8 @@ public void AddServices(IServiceCollection services, IConfiguration configuratio public void UseApps(IApplicationBuilder app, IConfiguration configuration, bool isDevelop) { + // auditlog middleware must go after auth + app.UseMiddleware(); app.UseMixRateLimiter(); } diff --git a/src/applications/mixcore/Domain/ViewModels/PostContentViewModel.cs b/src/applications/mixcore/Domain/ViewModels/PostContentViewModel.cs index 2dcd8b678..2ccce7963 100644 --- a/src/applications/mixcore/Domain/ViewModels/PostContentViewModel.cs +++ b/src/applications/mixcore/Domain/ViewModels/PostContentViewModel.cs @@ -87,7 +87,7 @@ public async Task LoadAdditionalDataAsync( if (isChanged) { - await cacheService.SetAsync($"{Id}/{GetType().FullName}", this, typeof(MixPostContent).FullName, "full"); + await cacheService.SetAsync($"{Id}/{GetType().Name}", this, $"{typeof(MixPostContent).Assembly.GetName().Name}_{typeof(MixPostContent).Name}", "full"); } } diff --git a/src/applications/mixcore/Program.cs b/src/applications/mixcore/Program.cs index 59feb2a2f..114be4664 100644 --- a/src/applications/mixcore/Program.cs +++ b/src/applications/mixcore/Program.cs @@ -4,81 +4,128 @@ using System.Text.Encodings.Web; using System.Text.Unicode; using Mix.Log.Lib; -using Microsoft.Extensions.FileProviders; using Mix.Lib.Middlewares; -using Mix.Shared.Services; using Mix.Shared.Models.Configurations; using Mix.Queue.Extensions; -var builder = MixCmsHelper.CreateWebApplicationBuilder(args); - -if (builder.Environment.IsDevelopment()) -{ - builder.AddServiceDefaults(); -} -// Add services to the container. -builder.Services.AddControllersWithViews(); - - -builder.Services.AddWebEncoders(options => -{ - options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All); -}); -var globalConfig = builder.Configuration.GetSection(MixAppSettingsSection.GlobalSettings) - .Get(); -builder.Services.AddEndpointsApiExplorer(); -builder.AddMixQueue(); -builder.Services.AddMixServices(Assembly.GetExecutingAssembly(), builder.Configuration); - -builder.Services.ApplyMigrations(globalConfig); -builder.Services.AddMixCors(); -builder.Services.AddScoped(); -builder.Services.AddMixLog(builder.Configuration); -builder.Services.AddMixAuthorize(builder.Configuration); - -builder.Services.TryAddScoped(); - -var app = builder.Build(); - -Configure(app, builder.Environment, builder.Configuration); - -app.Run(); - - -void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfiguration configuration) +using Mix.Lib.Services; +using Mix.Lib.Publishers; +using Mix.Lib.Subscribers; +using Mix.Quartz.Services; +using Mix.RepoDb.Publishers; +using Mix.RepoDb.Subscribers; +using Mix.Storage.Lib.Subscribers; +using Mix.Log.Lib.Publishers; +using Mix.Log.Lib.Interfaces; +using Mix.Log.Lib.Services; +using Mix.Log.Lib.Models; +internal class Program { - if (!env.IsDevelopment()) + private static void Main(string[] args) { - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); + var builder = MixCmsHelper.CreateWebApplicationBuilder(args); + + if (builder.Environment.IsDevelopment()) + { + builder.AddServiceDefaults(); + } + // Add services to the container. + builder.Services.AddControllersWithViews(); + + + builder.Services.AddWebEncoders(options => + { + options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All); + }); + var globalConfig = builder.Configuration.GetSection(MixAppSettingsSection.GlobalSettings) + .Get(); + builder.Services.AddEndpointsApiExplorer(); + builder.AddMixQueue(); + builder.Services.AddMixServices(Assembly.GetExecutingAssembly(), builder.Configuration); + builder.AddMixLogPublisher(); + builder.Services.ApplyMigrations(globalConfig); + builder.Services.AddMixCors(); + builder.Services.AddScoped(); + builder.Services.AddMixLogSubscriber(builder.Configuration); + builder.Services.AddMixAuthorize(builder.Configuration); + builder.Services.AddScoped(); + builder.Services.TryAddScoped(); + + AddPortalServices(builder.Services, builder.Configuration); + var app = builder.Build(); + + if (builder.Environment.IsDevelopment()) + { + app.MapDefaultEndpoints(); + } + + Configure(app, builder.Environment, builder.Configuration); + + app.Run(); + + + void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfiguration configuration) + { + if (!env.IsDevelopment()) + { + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + app.UseHttpsRedirection(); + app.UseMixTenant(); + app.UseRouting(); + + // Typically, UseStaticFiles is called before UseCors. Apps that use JavaScript to retrieve static files cross site must call UseCors before UseStaticFiles. + app.UseMixStaticFiles(env.ContentRootPath); + + + // UseCors must be placed after UseRouting and before UseAuthorization. This is to ensure that CORS headers are included in the response for both authorized and unauthorized calls. + app.UseMixCors(); + + // must go between app.UseRouting() and app.UseEndpoints. + app.UseMixAuth(); + // auditlog middleware must go after auth + app.UseMiddleware(); + app.UseMixRateLimiter(); + app.UseMixApps(Assembly.GetExecutingAssembly(), configuration, env.ContentRootPath, env.IsDevelopment()); + app.UseMixSwaggerApps(env.IsDevelopment(), Assembly.GetExecutingAssembly()); + app.UseResponseCompression(); + app.UseMixResponseCaching(); + + + + //if (GlobalConfigService.Instance.AppSettings.IsHttps) + //{ + // app.UseHttpsRedirection(); + //} + + + } + + void AddPortalServices(IServiceCollection services, IConfiguration configuration) + { + var globalConfigs = configuration.GetSection(MixAppSettingsSection.GlobalSettings).Get()!; + services.AddMixRoutes(); + + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + services.AddHostedService(); + + services.AddHostedService(); + services.AddHostedService(); + + if (!globalConfigs!.IsInit) + { + services.TryAddSingleton(); + services.TryAddScoped(); + services.AddHostedService(); + } + + } } - app.UseHttpsRedirection(); - app.UseMixTenant(); - - app.UseMiddleware(); - - app.UseRouting(); - - // Typically, UseStaticFiles is called before UseCors. Apps that use JavaScript to retrieve static files cross site must call UseCors before UseStaticFiles. - app.UseMixStaticFiles(env.ContentRootPath); - - - // UseCors must be placed after UseRouting and before UseAuthorization. This is to ensure that CORS headers are included in the response for both authorized and unauthorized calls. - app.UseMixCors(); - - // must go between app.UseRouting() and app.UseEndpoints. - app.UseMixAuth(); - - app.UseMixApps(Assembly.GetExecutingAssembly(), configuration, env.ContentRootPath, env.IsDevelopment()); - app.UseMixSwaggerApps(env.IsDevelopment(), Assembly.GetExecutingAssembly()); - app.UseResponseCompression(); - app.UseMixResponseCaching(); - - - - //if (GlobalConfigService.Instance.AppSettings.IsHttps) - //{ - // app.UseHttpsRedirection(); - //} - - } \ No newline at end of file diff --git a/src/applications/mixcore/Properties/launchSettings.json b/src/applications/mixcore/Properties/launchSettings.json index 044c36913..2023ea7b1 100644 --- a/src/applications/mixcore/Properties/launchSettings.json +++ b/src/applications/mixcore/Properties/launchSettings.json @@ -8,33 +8,7 @@ }, "dotnetRunMessages": true, "applicationUrl": "https://localhost:5010;http://localhost:5011" - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Docker": { - "commandName": "Docker", - "launchBrowser": true, - "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}", - "environmentVariables": { - "ASPNETCORE_HTTPS_PORTS": "5010", - "ASPNETCORE_HTTP_PORTS": "5011" - }, - "publishAllPorts": true, - "useSSL": true } }, - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:38453", - "sslPort": 44372 - } - } + "$schema": "http://json.schemastore.org/launchsettings.json" } \ No newline at end of file diff --git a/src/applications/mixcore/mixcore.csproj b/src/applications/mixcore/mixcore.csproj index fba68cdab..2417efe9c 100644 --- a/src/applications/mixcore/mixcore.csproj +++ b/src/applications/mixcore/mixcore.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -14,10 +14,6 @@ - - - - @@ -27,7 +23,10 @@ + + + @@ -62,38 +61,15 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + - - - PreserveNewest - true - PreserveNewest - - - PreserveNewest - true - PreserveNewest - - - PreserveNewest - true - PreserveNewest - - - PreserveNewest - - - - - diff --git a/src/applications/mixcore/p4ps.csproj b/src/applications/mixcore/p4ps.csproj new file mode 100644 index 000000000..f09c6261a --- /dev/null +++ b/src/applications/mixcore/p4ps.csproj @@ -0,0 +1,97 @@ + + + + net8.0 + false + en + disable + enable + aeea975a-4fec-4193-846d-3a3d92606bd7 + Linux + ..\.. + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + PreserveNewest + true + PreserveNewest + + + PreserveNewest + true + PreserveNewest + + + PreserveNewest + true + PreserveNewest + + + + + + diff --git a/src/applications/mixcore/wwwroot/default-mixcontent/default.zip b/src/applications/mixcore/wwwroot/default-mixcontent/default.zip index f72166bec..41cec9936 100644 Binary files a/src/applications/mixcore/wwwroot/default-mixcontent/default.zip and b/src/applications/mixcore/wwwroot/default-mixcontent/default.zip differ diff --git a/src/applications/mixcore/wwwroot/default-mixcontent/shared/json/system-databases.json b/src/applications/mixcore/wwwroot/default-mixcontent/shared/json/system-databases.json index 3bcee2755..72b6135d0 100644 --- a/src/applications/mixcore/wwwroot/default-mixcontent/shared/json/system-databases.json +++ b/src/applications/mixcore/wwwroot/default-mixcontent/shared/json/system-databases.json @@ -2372,8 +2372,8 @@ "isDeleted": false }, { - "systemName": "title", - "displayName": "Title", + "systemName": "DisplayName", + "displayName": "Display Name", "mixDatabaseName": "sysPermission", "dataType": "Text", "configurations": { @@ -2399,10 +2399,10 @@ "isDeleted": false }, { - "systemName": "icon", - "displayName": "Icon", + "systemName": "Group", + "displayName": "Group", "mixDatabaseName": "sysPermission", - "dataType": "Icon", + "dataType": "Text", "configurations": { "IsRequire": false, "IsEncrypt": false, @@ -2426,8 +2426,8 @@ "isDeleted": false }, { - "systemName": "type", - "displayName": "Type", + "systemName": "Key", + "displayName": "Key", "mixDatabaseName": "sysPermission", "dataType": "Text", "configurations": { diff --git a/src/applications/mixcore/wwwroot/favicon.ico b/src/applications/mixcore/wwwroot/favicon.ico index 63e859b47..b28e85df3 100644 Binary files a/src/applications/mixcore/wwwroot/favicon.ico and b/src/applications/mixcore/wwwroot/favicon.ico differ diff --git a/src/applications/mixcore/wwwroot/jquery.js b/src/applications/mixcore/wwwroot/jquery.js index e69de29bb..7f37b5d99 100644 --- a/src/applications/mixcore/wwwroot/jquery.js +++ b/src/applications/mixcore/wwwroot/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (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(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=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))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(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&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(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&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(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 U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);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&&C){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=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(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(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===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]||I.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]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(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(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(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=I.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 T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.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 ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(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 Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.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)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.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),v(t)&&(t=t.call(e,n,ce.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)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.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"===ce.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"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(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)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(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?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.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.on("mouseenter",e).on("mouseleave",t||e)}}),ce.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){ce.fn[n]=function(e,t){return 0div{background-color:red;height:100%;width:6px;margin-right:5px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.haiyen-loader .spinner .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.haiyen-loader .spinner .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.haiyen-loader .spinner .rect4{-webkit-animation-delay:-.9s;animation-delay:-.9s}.haiyen-loader .spinner .rect5{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-stretchdelay{0%,100%,40%{-webkit-transform:scaleY(.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,100%,40%{transform:scaleY(.4);-webkit-transform:scaleY(.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}} \ No newline at end of file +/* Sat Sep 09 2023 14:09:16 GMT+0700 (Indochina Time) */.haiyen-loader{position:fixed;left:0;top:0;width:100%;height:100%;z-index:999999;background:rgba(255,255,255,.78)}.haiyen-loader .spinner{width:55px;height:70px;position:absolute;top:50%;left:50%;margin-top:-70px;margin-left:-65px}.haiyen-loader .spinner>div{background-color:red;height:100%;width:6px;margin-right:5px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.haiyen-loader .spinner .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.haiyen-loader .spinner .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.haiyen-loader .spinner .rect4{-webkit-animation-delay:-.9s;animation-delay:-.9s}.haiyen-loader .spinner .rect5{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-stretchdelay{0%,100%,40%{-webkit-transform:scaleY(.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,100%,40%{transform:scaleY(.4);-webkit-transform:scaleY(.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}} \ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/css/app-vendor-scss.min.css b/src/applications/mixcore/wwwroot/mix-app/css/app-vendor-scss.min.css index c0945d800..e4b998e46 100644 --- a/src/applications/mixcore/wwwroot/mix-app/css/app-vendor-scss.min.css +++ b/src/applications/mixcore/wwwroot/mix-app/css/app-vendor-scss.min.css @@ -1,4 +1,4 @@ -/* Sun Feb 04 2024 20:54:58 GMT+0700 (Indochina Time) */qr-code .qr-output canvas { +/* Sat Sep 09 2023 14:08:55 GMT+0700 (Indochina Time) */qr-code .qr-output canvas { max-width: 100%; } fb-login { @@ -33,6 +33,9 @@ mix-module-data-table .preview-container { max-height: 4em; overflow: hidden; } +qr-code .qr-output canvas { + max-width: 100%; } + #dlg-preview-popup .modal-body img { display: block; margin: 0 auto; @@ -42,9 +45,6 @@ mix-module-data-table .preview-container { #dlg-preview-popup pre { overflow: visible; } -qr-code .qr-output canvas { - max-width: 100%; } - /* PROPORTIONALLY resize the canvas to the intended viewing size */ /* canvas{width:300px; height:380px;} */ upload-croppie .cr-boundary { @@ -127,10 +127,6 @@ div[dnd-list] .dnd-item.selected { background-color: #dff0d8; color: #3c763d; } -.table-data td.preview { - max-width: 120px; - overflow: hidden; } - .mouse { z-index: 9999999; width: 70px; @@ -192,14 +188,15 @@ mix-database-nav-values mix-column-preview .rowx { max-height: 110px; overflow: hidden; } -.attr-set-value-item:last-child { - border-bottom: 0 !important; } - @media (min-width: 992px) { #modal-content-filter .modal-lg, #modal-content-filter .modal-xl { max-width: 80vw; } } +.table-data td.preview { + max-width: 120px; + overflow: hidden; } + .content { width: 100%; display: flex; diff --git a/src/applications/mixcore/wwwroot/mix-app/css/app-vendor.min.css b/src/applications/mixcore/wwwroot/mix-app/css/app-vendor.min.css index 98db64148..116460f48 100644 --- a/src/applications/mixcore/wwwroot/mix-app/css/app-vendor.min.css +++ b/src/applications/mixcore/wwwroot/mix-app/css/app-vendor.min.css @@ -1,7 +1,7 @@ -/* Sun Feb 04 2024 20:54:58 GMT+0700 (Indochina Time) */@charset "UTF-8";.tui-editor-contents .task-list-item:before,.tui-editor-contents ol li.task-list-item:before,.tui-editor-contents pre ul li:before,.tui-editor-contents ul li.task-list-item:before,.youtube .play-button:before{content:""}#return-to-top{position:fixed;bottom:20px;right:20px;background:#000;background:rgba(0,0,0,.7);width:50px;height:50px;text-decoration:none;-webkit-border-radius:35px;-moz-border-radius:35px;border-radius:35px;display:none;-webkit-transition:all .3s linear;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease;z-index:9}#return-to-top:hover{background:rgba(0,0,0,.9)}#return-to-top i{color:#fff;margin:0;position:relative;left:4px;top:0;font-size:30px;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}#return-to-top:hover i{color:#fff;top:5px}@media (min-width:992px){.language-switcher{display:inline;position:absolute;right:150px;bottom:15px}.language-switcher.portal{bottom:0}.language-switcher .dropdown-menu{right:0}}@media screen and (max-width:991px){.language-switcher{display:inline;position:absolute;left:20px}.language-switcher .dropdown-menu{left:0}}.language-switcher .dropdown-menu{width:250px;overflow:hidden!important}.navbar-collapse .dropdown-menu .dropdown-item{color:#444}.dialogdemoThemeInheritance .container{text-align:center}.data-table .header{padding:10px;font-weight:700;background:#d3d3d3}.mix-loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#21252987;opacity:.97;z-index:9999;display:flex;justify-content:center;align-items:center}.mix-loader-container .spinner{margin:100px auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-rotate 2s infinite linear;animation:sk-rotate 2s infinite linear}.mix-loader-container .dot1,.mix-loader-container .dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#fff;border-radius:100%;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.mix-loader-container .dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-rotate{100%{-webkit-transform:rotate(360deg)}}@keyframes sk-rotate{100%{transform:rotate(360deg);-webkit-transform:rotate(360deg)}}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.lds-ellipsis{display:inline-block;position:relative;width:80px;height:80px}.lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}@keyframes lds-ellipsis1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}#dlg-preview-popup .modal-body .img{max-width:100%}quill-editor .ql-container{min-height:300px;overflow:auto}quill-editor .ql-toolbar{position:sticky!important;top:3.9rem;z-index:12;background-color:#fff}#modal-shopping-cart .modal-title{margin-top:0}#modal-shopping-cart .cart-item{margin:10px 0}#modal-shopping-cart .modal-dialog{max-width:unset;margin:20px}#modal-shopping-cart{color:#5c4b43;z-index:1060}#modal-shopping-cart .modal-footer button{margin:0 10px}.snowflake{display:block;position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:-webkit-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-moz-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-ms-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%)}#snow{position:fixed;width:100%;height:100%}.star-rating{margin:0;padding:0;display:inline-block}.star-rating .star{padding:1px;color:#ddd;font-size:12px;text-shadow:.05em .05em #aaa;list-style-type:none;display:inline-block;cursor:pointer}.star-rating .star.filled{color:#fd0}.star-rating.readonly .star.filled{color:#666}.youtube{background-color:#000;margin-bottom:30px;position:relative;padding-top:56.25%;overflow:hidden;cursor:pointer}.youtube img{width:100%;top:-16.82%;left:0;opacity:.7}.youtube .play-button{width:90px;height:60px;background-color:#333;box-shadow:0 0 30px rgba(0,0,0,.6);z-index:1;opacity:.8;border-radius:6px}.now-ui-icons.circle,tags-input[disabled] .tags,tags-input[disabled] .tags .input{background-color:#eee}.youtube .play-button:before{border-style:solid;border-width:15px 0 15px 26px;border-color:transparent transparent transparent #fff}.youtube .play-button,.youtube img{cursor:pointer}.youtube .play-button,.youtube .play-button:before,.youtube iframe,.youtube img{position:absolute}.youtube .play-button,.youtube .play-button:before{top:50%;left:50%;transform:translate3d(-50%,-50%,0)}.youtube iframe{height:100%;width:100%;top:0;left:0}tags-input{box-shadow:none;border:none;padding:0;min-height:34px}tags-input .tags{border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}tags-input .tags .tag-item{color:#000}tags-input .tags .tag-item.selected{color:#fff;border:1px solid #d43f3a}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags.focused{border:1px solid #66afe9}tags-input .autocomplete{border-radius:4px}tags-input.ng-invalid .tags{border-color:#843534}.input-group tags-input{padding:0;display:table-cell}.input-group tags-input:not(:first-child) .tags{border-top-left-radius:0;border-bottom-left-radius:0}.input-group tags-input:not(:last-child) .tags{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-lg tags-input:first-child .tags{border-top-left-radius:6px;border-bottom-left-radius:6px}.input-group-lg tags-input:last-child .tags{border-top-right-radius:6px;border-bottom-right-radius:6px}.input-group-sm tags-input:first-child .tags{border-top-left-radius:3px;border-bottom-left-radius:3px}.input-group-sm tags-input:last-child .tags{border-top-right-radius:3px;border-bottom-right-radius:3px}.input-group-lg tags-input,tags-input.ti-input-lg{min-height:46px}.input-group-lg tags-input .tags,tags-input.ti-input-lg .tags{border-radius:6px}.input-group-lg tags-input .tags .tag-item,tags-input.ti-input-lg .tags .tag-item{height:38px;line-height:37px;font-size:18px;border-radius:6px}.input-group-lg tags-input .tags .tag-item .remove-button,tags-input.ti-input-lg .tags .tag-item .remove-button{font-size:20px}.input-group-lg tags-input .tags .input,tags-input.ti-input-lg .tags .input{height:38px;font-size:18px}.input-group-sm tags-input,tags-input.ti-input-sm{min-height:30px}.input-group-sm tags-input .tags,tags-input.ti-input-sm .tags{border-radius:3px}.input-group-sm tags-input .tags .tag-item,tags-input.ti-input-sm .tags .tag-item{height:22px;line-height:21px;font-size:12px;border-radius:3px}.input-group-sm tags-input .tags .tag-item .remove-button,tags-input.ti-input-sm .tags .tag-item .remove-button{font-size:16px}.input-group-sm tags-input .tags .input,tags-input.ti-input-sm .tags .input{height:22px;font-size:12px}.has-feedback tags-input .tags{padding-right:30px}.has-success tags-input .tags{border-color:#3c763d}.has-success tags-input .tags.focused{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-error tags-input .tags{border-color:#a94442}.has-error tags-input .tags.focused{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-warning tags-input .tags{border-color:#8a6d3b}.has-warning tags-input .tags.focused{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{margin:5px 0;position:relative;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;background:-webkit-linear-gradient(top,#f0f9ff 0,#cbebff 47%,#a1dbff 100%);background:linear-gradient(to bottom,#f0f9ff 0,#cbebff 47%,#a1dbff 100%)}tags-input .tags .tag-item.selected{background:-webkit-linear-gradient(top,#febbbb 0,#fe9090 45%,#ff5c5c 100%);background:linear-gradient(to bottom,#febbbb 0,#fe9090 45%,#ff5c5c 100%)}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input[disabled] .tags,tags-input[disabled] .tags .input,tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.alertify .ajs-dimmer,.alertify .ajs-modal{position:fixed;z-index:1981;top:0;right:0;bottom:0;left:0}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}.portal-menus .handle{cursor:move}.alertify .ajs-dimmer{padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{padding:0;overflow-y:auto}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button,.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;right:0;bottom:0;left:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593d2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;right:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center center;background-color:rgba(0,0,0,.5);border-top-right-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0}.alertify-notifier.ajs-center{left:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{left:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0}.ajs-no-transition.alertify .ajs-dialog,.ajs-no-transition.alertify .ajs-dimmer,.ajs-no-transition.alertify .ajs-modal,.ajs-no-transition.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}@media (prefers-reduced-motion:reduce){.alertify .ajs-dialog,.alertify .ajs-dimmer,.alertify .ajs-modal,.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}}#trumbowyg-icons,#trumbowyg-icons svg{height:0;width:0}#trumbowyg-icons{overflow:hidden;visibility:hidden}.trumbowyg-box *,.trumbowyg-box ::after,.trumbowyg-box ::before,.trumbowyg-modal *,.trumbowyg-modal ::after,.trumbowyg-modal ::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,.trumbowyg-editor,.trumbowyg-textarea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.trumbowyg-box svg,.trumbowyg-modal svg{width:17px;height:100%;fill:#222}.trumbowyg-box,.trumbowyg-editor{display:block;position:relative;border:1px solid #DDD;width:100%;min-height:300px}.trumbowyg-box .trumbowyg-editor{margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#FEFEFE;border:none!important}.trumbowyg-editor,.trumbowyg-textarea{position:relative;box-sizing:border-box;padding:20px;min-height:300px;width:100%;border-style:none;resize:none;outline:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.trumbowyg-editor.trumbowyg-autogrow-on-enter,.trumbowyg-textarea.trumbowyg-autogrow-on-enter{-webkit-transition:height .3s ease-out;-o-transition:height .3s ease-out;transition:height .3s ease-out}.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:transparent!important;text-shadow:0 0 7px #333}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}.trumbowyg-box-blur .trumbowyg-editor hr,.trumbowyg-box-blur .trumbowyg-editor img{opacity:.2}.trumbowyg-textarea{position:relative;display:block;overflow:auto;border:none;font-size:14px;font-family:Inconsolata,Consolas,Courier,"Courier New",sans-serif;line-height:18px}.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea{height:1px!important;width:25%;min-height:0!important;padding:0!important;background:0 0;opacity:0!important}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea{display:block;margin-bottom:1px}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none;white-space:break-spaces}.trumbowyg-button-pane{width:100%;min-height:36px;background:#ecf0f1;border-bottom:1px solid #d7e0e2;margin:0;padding:0 5px;position:relative;list-style-type:none;line-height:10px;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:11}.trumbowyg-button-pane::after{content:" ";display:block;position:absolute;top:36px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane .trumbowyg-button-group{display:inline-block}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group::after{content:" ";display:inline-block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.bootstrap-tagsinput,.fa-stack,.md-avatar,.mi-stack,.trumbowyg-button-pane button{vertical-align:middle}.trumbowyg-button-pane .trumbowyg-button-group:last-child::after{content:none}.trumbowyg-button-pane button{display:inline-block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;-webkit-transition:background-color 150ms,opacity 150ms;-o-transition:background-color 150ms,opacity 150ms;transition:background-color 150ms,opacity 150ms}.trumbowyg-button-pane button.trumbowyg-textual-button{width:auto;line-height:35px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.trumbowyg-button-pane button.trumbowyg-disable,.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),.trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button){opacity:.2;cursor:default;pointer-events:none}.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,.trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before{background:#e3e9eb}.trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#FFF;outline:0}.trumbowyg-button-pane .trumbowyg-open-dropdown::after{display:block;content:" ";position:absolute;top:25px;right:3px;height:0;width:0;border:3px solid transparent;border-top-color:#555}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button{padding-left:10px!important;padding-right:18px!important}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after{top:17px;right:7px}.trumbowyg-button-pane .trumbowyg-right{float:right}.trumbowyg-dropdown{max-width:300px;max-height:250px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;border:1px solid #ecf0f1;padding:5px 0;border-top:none;background:#FFF;margin-left:-1px;-webkit-box-shadow:rgba(0,0,0,.1) 0 2px 3px;box-shadow:rgba(0,0,0,.1) 0 2px 3px;z-index:12}.trumbowyg-dropdown button{display:block;width:100%;height:35px;line-height:35px;text-decoration:none;background:#FFF;padding:0 20px 0 10px;color:#333!important;border:none;cursor:pointer;text-align:left;font-size:15px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-dropdown button:focus,.trumbowyg-dropdown button:hover{background:#ecf0f1}.trumbowyg-dropdown button svg{float:left;margin-right:14px}.trumbowyg-modal{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:520px;width:100%;height:350px;z-index:12;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:500px;width:calc(100% - 20px);padding-bottom:45px;z-index:1;background-color:#FFF;text-align:center;font-size:14px;-webkit-box-shadow:rgba(0,0,0,.2) 0 2px 3px;box-shadow:rgba(0,0,0,.2) 0 2px 3px;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box .trumbowyg-modal-title{font-size:24px;font-weight:700;margin:0 0 20px;padding:15px 0 13px;display:block;border-bottom:1px solid #EEE;color:#333;background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-progress{width:100%;height:3px;position:absolute;top:58px}.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar{background:#2BC06A;width:0;height:100%;-webkit-transition:width 150ms linear;-o-transition:width 150ms linear;transition:width 150ms linear}.trumbowyg-modal-box .trumbowyg-input-row{position:relative;margin:15px 12px;border:1px solid #DEDEDE;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos{text-align:left;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;width:150px;border-right:1px solid #DEDEDE;padding:0 7px;background-color:#fbfcfc;position:absolute;left:0;top:0;bottom:0}.trumbowyg-modal-box .trumbowyg-input-infos label{color:#69878f;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos label,.trumbowyg-modal-box .trumbowyg-input-infos label span{display:block;height:27px;line-height:27px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error{color:#e74c3c}.trumbowyg-modal-box .trumbowyg-input-html{padding:1px 1px 1px 152px}.trumbowyg-modal-box .trumbowyg-input-html,.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{font-size:14px}.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;height:27px;line-height:27px;border:0;width:100%;padding:0 7px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html input:hover,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html select:hover,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:hover{outline:#95a5a6 solid 1px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus{background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-input-html input[type=checkbox]{width:16px;height:16px;padding:0}.trumbowyg-modal-box .trumbowyg-input-html-with-checkbox{text-align:left;padding:3px 1px 1px 3px}.trumbowyg-modal-box .trumbowyg-input-error input,.trumbowyg-modal-box .trumbowyg-input-error select,.trumbowyg-modal-box .trumbowyg-input-error textarea{outline:#e74c3c solid 1px}.trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child{margin-top:-27px}.trumbowyg-modal-box .error{margin-top:25px;display:block;color:red}.trumbowyg-modal-box .trumbowyg-modal-button{position:absolute;bottom:10px;right:0;text-decoration:none;color:#FFF;display:block;width:100px;height:35px;line-height:33px;margin:0 10px;background-color:#333;border:none;cursor:pointer;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;font-size:16px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{right:110px;background:#2bc06a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#40d47e;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#25a25a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{color:#555;background:#e6e6e6}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#fbfbfb;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#d5d5d5}.trumbowyg-overlay{position:absolute;background-color:rgba(255,255,255,.5);height:100%;width:100%;left:0;display:none;top:0;z-index:10}body.trumbowyg-body-fullscreen{overflow:hidden}.trumbowyg-fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;margin:0;padding:0;z-index:99999}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen .trumbowyg-textarea{height:calc(100% - 37px)!important;overflow:auto}.trumbowyg-fullscreen .trumbowyg-overlay{height:100%!important}.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#222;fill:transparent}.trumbowyg-editor embed,.trumbowyg-editor img,.trumbowyg-editor object,.trumbowyg-editor video{max-width:100%}.trumbowyg-editor img,.trumbowyg-editor video{height:auto}.trumbowyg-editor img{cursor:move}.trumbowyg-editor canvas:focus{outline:0}.trumbowyg-editor.trumbowyg-reset-css{background:#FEFEFE!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;line-height:1.45em!important;color:#333}.trumbowyg-editor.trumbowyg-reset-css a{color:#15c!important;text-decoration:underline!important}.trumbowyg-editor.trumbowyg-reset-css blockquote,.trumbowyg-editor.trumbowyg-reset-css div,.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css p,.trumbowyg-editor.trumbowyg-reset-css ul{-webkit-box-shadow:none!important;box-shadow:none!important;background:0 0!important;margin:0 0 15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none}.trumbowyg-editor.trumbowyg-reset-css hr,.trumbowyg-editor.trumbowyg-reset-css iframe,.trumbowyg-editor.trumbowyg-reset-css object{margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css blockquote{margin-left:32px!important;font-style:italic!important;color:#555}.trumbowyg-editor.trumbowyg-reset-css ul{list-style:disc}.trumbowyg-editor.trumbowyg-reset-css ol{list-style:decimal}.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css ul{padding-left:20px!important}.trumbowyg-editor.trumbowyg-reset-css ol ol,.trumbowyg-editor.trumbowyg-reset-css ol ul,.trumbowyg-editor.trumbowyg-reset-css ul ol,.trumbowyg-editor.trumbowyg-reset-css ul ul{border:none;margin:2px!important;padding:0 0 0 24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block;height:1px;border:none;border-top:1px solid #CCC}.trumbowyg-editor.trumbowyg-reset-css h1,.trumbowyg-editor.trumbowyg-reset-css h2,.trumbowyg-editor.trumbowyg-reset-css h3,.trumbowyg-editor.trumbowyg-reset-css h4{color:#111;background:0 0;margin:0!important;padding:0!important;font-weight:700}.trumbowyg-editor.trumbowyg-reset-css h1{font-size:32px!important;line-height:38px!important;margin-bottom:20px!important}.trumbowyg-editor.trumbowyg-reset-css h2{font-size:26px!important;line-height:34px!important;margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css h3{font-size:22px!important;line-height:28px!important;margin-bottom:7px!important}.trumbowyg-editor.trumbowyg-reset-css h4{font-size:16px!important;line-height:22px!important;margin-bottom:7px!important}.trumbowyg-dark .trumbowyg-textarea{background:#111;color:#ddd}.trumbowyg-dark .trumbowyg-box{border:1px solid #343434}.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen{background:#111}.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{text-shadow:0 0 7px #ccc}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}.trumbowyg-dark .trumbowyg-box svg{fill:#ecf0f1;color:#ecf0f1}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after{background:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after{background-color:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after{background-color:#2a2a2a}.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#333}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after{border-top-color:#fff}.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:#ecf0f1;fill:transparent}.trumbowyg-dark .trumbowyg-dropdown{border-color:#222;background:#333;-webkit-box-shadow:rgba(0,0,0,.3) 0 2px 3px;box-shadow:rgba(0,0,0,.3) 0 2px 3px}.trumbowyg-dark .trumbowyg-dropdown button{background:#333;color:#fff!important}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:27px;line-height:27px;overflow:hidden}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#222}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label input{border-color:#222;color:#eee;background:#333}.trumbowyg-dark .trumbowyg-modal-box label input:focus,.trumbowyg-dark .trumbowyg-modal-box label input:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box label input:focus{background-color:#2f2f2f}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{background:#1b7943}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#25a25a}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#176437}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{background:#333;color:#ccc}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#444}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#111}.trumbowyg-dark .trumbowyg-overlay{background-color:rgba(15,15,15,.6)}.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list),.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list){max-width:276px;padding:7px 5px;overflow:initial}#dlg-preview-popup .modal-body img,.custom-file-img,mix-column-preview img,qr-code .qr-output canvas{max-width:100%}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button{display:block;position:relative;float:left;text-indent:-9999px;height:20px;width:20px;border:1px solid #333;padding:0;margin:2px}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:hover::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:hover::after{content:" ";display:block;position:absolute;top:-5px;left:-5px;width:27px;height:27px;background:inherit;border:1px solid #fff;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button){position:relative;color:#fff!important}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):focus::after,.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):hover::after{content:" ";display:block;position:absolute;top:13px;left:0;width:0;height:0;border:5px solid transparent;border-left-color:#fff}.trumbowyg-dropdown-emoji{width:265px;padding:7px 0 7px 5px}.trumbowyg-dropdown-emoji svg{display:none!important}.trumbowyg-dropdown-emoji button{display:block;position:relative;float:left;height:26px;width:26px;padding:0;margin:2px;line-height:24px;text-align:center}.trumbowyg-dropdown-emoji button:focus::after,.trumbowyg-dropdown-emoji button:hover::after{display:block;position:absolute;top:-5px;left:-5px;height:27px;width:27px;background:inherit;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10;background-color:transparent}.trumbowyg .emoji{width:22px;height:22px;display:inline-block}.md-avatar{width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important;margin-left:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}#modal-posts img{height:30px}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}*{box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative;overflow:hidden}.user .username{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{height:100%;width:100%;border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}fb-login{background-color:#0ff}medias .modal{z-index:1049}medias #modal-files .modal-body .table img{height:30px}medias #modal-files .modal-body .table img.preview{height:auto}mix-column-preview .row{max-height:120px;margin:10px 0;overflow:hidden}mix-module-data-table .data-table .header{padding:5px;color:#495057;background-color:hsla(var(--primary-color-hue,211),100%,50%,.075);border-color:#dee2e6;font-weight:400;font-size:small}mix-module-data-table .preview-container{max-height:4em;overflow:hidden}#dlg-preview-popup .modal-body img{display:block;margin:0 auto;height:auto}#dlg-preview-popup pre{overflow:visible}upload-croppie .cr-boundary{overflow:hidden}body,html{height:100%}.btn,.btn-link{cursor:pointer}.content-body{max-width:66vw}.w-85{width:85vw}.display-4{font-size:2rem!important}div[dnd-list],ul[dnd-list]{min-height:42px;padding-left:0}div[dnd-list] .dndDraggingSource,ul[dnd-list] .dndDraggingSource{display:none}div[dnd-list] .dndPlaceholder,ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}div[dnd-list] .dnd-item,ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}div[dnd-list] .dnd-item.selected,ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}.table-data td.preview{max-width:120px;overflow:hidden}.mouse{z-index:9999999;width:70px;height:70px;background-color:transparent;color:#fff;position:absolute}hub-messages .nav-link .new-msg-count,log-stream .nav-link .new-msg-count{color:#fff;top:-5px;right:5px;background-color:red;padding:2px 4px 0;font-weight:700}hub-messages .nav-link{position:relative}hub-messages .nav-link .new-msg-count{position:absolute}log-stream #modal-log-stream .modal-body{max-height:80vh;overflow-y:scroll}log-stream .nav-link{position:relative}log-stream .nav-link .new-msg-count{position:absolute}main-side-bar-dynamic .sw-sidebar .sw-toc-item{position:relative}main-side-bar-dynamic .sw-sidebar .sw-toc-item .sw-toc-link .sw-toc-link{padding-left:0}main-side-bar-dynamic .sw-sidebar .sw-toc-item .btn-group{right:20px;opacity:1}main-side-bar-dynamic .sw-sidebar ul{padding-left:15px}main-side-bar-dynamic .sw-sidebar .sw-toc-sub-link .btn-group{padding:2px 0}.custom-image{max-width:30vw}mix-database-nav-values .row{padding:10px 0}mix-database-nav-values mix-column-preview .rowx{max-height:110px;overflow:hidden}.attr-set-value-item:last-child{border-bottom:0!important}@media (min-width:992px){#modal-content-filter .modal-lg,#modal-content-filter .modal-xl{max-width:80vw}}.img-container>img,.img-preview>img{max-width:100%}.content{width:100%;display:flex;align-items:center;flex-direction:column;background:0 0}.flag-icon,.flag-icon-background{background-size:contain;background-position:50%}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem;overflow:hidden}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor{color:#000}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}.bootstrap-tagsinput,.cm-tab,.cr-rotate-controls i:before,.flag-icon,.now-ui-icons{display:inline-block}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;border-radius:50%}.fa-ul,.nc-icon-ul{padding-left:0;list-style-type:none}.nc-icon-ul{margin-left:2.14285714em}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.flag-icon-background{background-repeat:no-repeat}.flag-icon{background-repeat:no-repeat;position:relative;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{font-style:normal;font-weight:900;font-size:22px}.cm-em,.hljs-comment,.hljs-emphasis,.hljs-quote,.tui-editor-contents address,.tui-editor-contents cite,.tui-editor-contents dfn,.tui-editor-contents em,.tui-editor-contents i,.tui-editor-contents var{font-style:italic}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! +/* Sat Sep 09 2023 14:08:55 GMT+0700 (Indochina Time) */@charset "UTF-8";#return-to-top{position:fixed;bottom:20px;right:20px;background:#000;background:rgba(0,0,0,.7);width:50px;height:50px;text-decoration:none;-webkit-border-radius:35px;-moz-border-radius:35px;border-radius:35px;display:none;-webkit-transition:all .3s linear;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease;z-index:9}#return-to-top:hover{background:rgba(0,0,0,.9)}#return-to-top i{color:#fff;margin:0;position:relative;left:4px;top:0;font-size:30px;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}#return-to-top:hover i{color:#fff;top:5px}@media (min-width:992px){.language-switcher{display:inline;position:absolute;right:150px;bottom:15px}.language-switcher.portal{bottom:0}.language-switcher .dropdown-menu{right:0}}@media screen and (max-width:991px){.language-switcher{display:inline;position:absolute;left:20px}.language-switcher .dropdown-menu{left:0}}.language-switcher .dropdown-menu{width:250px;overflow:hidden!important}.navbar-collapse .dropdown-menu .dropdown-item{color:#444}.dialogdemoThemeInheritance .container{text-align:center}.data-table .header{padding:10px;font-weight:700;background:#d3d3d3}.mix-loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#21252987;opacity:.97;z-index:9999;display:flex;justify-content:center;align-items:center}.mix-loader-container .spinner{margin:100px auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-rotate 2s infinite linear;animation:sk-rotate 2s infinite linear}.mix-loader-container .dot1,.mix-loader-container .dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#fff;border-radius:100%;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.mix-loader-container .dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-rotate{100%{-webkit-transform:rotate(360deg)}}@keyframes sk-rotate{100%{transform:rotate(360deg);-webkit-transform:rotate(360deg)}}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.lds-ellipsis{display:inline-block;position:relative;width:80px;height:80px}.lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}@keyframes lds-ellipsis1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}#dlg-preview-popup .modal-body .img{max-width:100%}quill-editor .ql-container{min-height:300px;overflow:auto}quill-editor .ql-toolbar{position:sticky!important;top:3.9rem;z-index:12;background-color:#fff}#modal-shopping-cart .modal-title{margin-top:0}#modal-shopping-cart .cart-item{margin:10px 0}#modal-shopping-cart .modal-dialog{max-width:unset;margin:20px}#modal-shopping-cart{color:#5c4b43;z-index:1060}#modal-shopping-cart .modal-footer button{margin:0 10px}.snowflake{display:block;position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:-webkit-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-moz-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-ms-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%)}#snow{position:fixed;width:100%;height:100%}.star-rating{margin:0;padding:0;display:inline-block}.star-rating .star{padding:1px;color:#ddd;font-size:12px;text-shadow:.05em .05em #aaa;list-style-type:none;display:inline-block;cursor:pointer}.star-rating .star.filled{color:#fd0}.star-rating.readonly .star.filled{color:#666}.youtube{background-color:#000;margin-bottom:30px;position:relative;padding-top:56.25%;overflow:hidden;cursor:pointer}.youtube img{width:100%;top:-16.82%;left:0;opacity:.7}.youtube .play-button{width:90px;height:60px;background-color:#333;box-shadow:0 0 30px rgba(0,0,0,.6);z-index:1;opacity:.8;border-radius:6px}.now-ui-icons.circle,tags-input[disabled] .tags,tags-input[disabled] .tags .input{background-color:#eee}.youtube .play-button:before{content:"";border-style:solid;border-width:15px 0 15px 26px;border-color:transparent transparent transparent #fff}.youtube .play-button,.youtube img{cursor:pointer}.youtube .play-button,.youtube .play-button:before,.youtube iframe,.youtube img{position:absolute}.youtube .play-button,.youtube .play-button:before{top:50%;left:50%;transform:translate3d(-50%,-50%,0)}.youtube iframe{height:100%;width:100%;top:0;left:0}tags-input{box-shadow:none;border:none;padding:0;min-height:34px}tags-input .tags{border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}tags-input .tags .tag-item{color:#000}tags-input .tags .tag-item.selected{color:#fff;border:1px solid #d43f3a}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags.focused{border:1px solid #66afe9}tags-input .autocomplete{border-radius:4px}tags-input.ng-invalid .tags{border-color:#843534}.input-group tags-input{padding:0;display:table-cell}.input-group tags-input:not(:first-child) .tags{border-top-left-radius:0;border-bottom-left-radius:0}.input-group tags-input:not(:last-child) .tags{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-lg tags-input:first-child .tags{border-top-left-radius:6px;border-bottom-left-radius:6px}.input-group-lg tags-input:last-child .tags{border-top-right-radius:6px;border-bottom-right-radius:6px}.input-group-sm tags-input:first-child .tags{border-top-left-radius:3px;border-bottom-left-radius:3px}.input-group-sm tags-input:last-child .tags{border-top-right-radius:3px;border-bottom-right-radius:3px}.input-group-lg tags-input,tags-input.ti-input-lg{min-height:46px}.input-group-lg tags-input .tags,tags-input.ti-input-lg .tags{border-radius:6px}.input-group-lg tags-input .tags .tag-item,tags-input.ti-input-lg .tags .tag-item{height:38px;line-height:37px;font-size:18px;border-radius:6px}.input-group-lg tags-input .tags .tag-item .remove-button,tags-input.ti-input-lg .tags .tag-item .remove-button{font-size:20px}.input-group-lg tags-input .tags .input,tags-input.ti-input-lg .tags .input{height:38px;font-size:18px}.input-group-sm tags-input,tags-input.ti-input-sm{min-height:30px}.input-group-sm tags-input .tags,tags-input.ti-input-sm .tags{border-radius:3px}.input-group-sm tags-input .tags .tag-item,tags-input.ti-input-sm .tags .tag-item{height:22px;line-height:21px;font-size:12px;border-radius:3px}.input-group-sm tags-input .tags .tag-item .remove-button,tags-input.ti-input-sm .tags .tag-item .remove-button{font-size:16px}.input-group-sm tags-input .tags .input,tags-input.ti-input-sm .tags .input{height:22px;font-size:12px}.has-feedback tags-input .tags{padding-right:30px}.has-success tags-input .tags{border-color:#3c763d}.has-success tags-input .tags.focused{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-error tags-input .tags{border-color:#a94442}.has-error tags-input .tags.focused{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-warning tags-input .tags{border-color:#8a6d3b}.has-warning tags-input .tags.focused{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{margin:5px 0;position:relative;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;background:-webkit-linear-gradient(top,#f0f9ff 0,#cbebff 47%,#a1dbff 100%);background:linear-gradient(to bottom,#f0f9ff 0,#cbebff 47%,#a1dbff 100%)}tags-input .tags .tag-item.selected{background:-webkit-linear-gradient(top,#febbbb 0,#fe9090 45%,#ff5c5c 100%);background:linear-gradient(to bottom,#febbbb 0,#fe9090 45%,#ff5c5c 100%)}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input[disabled] .tags,tags-input[disabled] .tags .input,tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.alertify .ajs-dimmer,.alertify .ajs-modal{position:fixed;z-index:1981;top:0;right:0;bottom:0;left:0}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}.portal-menus .handle{cursor:move}.alertify .ajs-dimmer{padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{padding:0;overflow-y:auto}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button,.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;right:0;bottom:0;left:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593d2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;right:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center center;background-color:rgba(0,0,0,.5);border-top-right-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0}.alertify-notifier.ajs-center{left:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{left:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0}.ajs-no-transition.alertify .ajs-dialog,.ajs-no-transition.alertify .ajs-dimmer,.ajs-no-transition.alertify .ajs-modal,.ajs-no-transition.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}@media (prefers-reduced-motion:reduce){.alertify .ajs-dialog,.alertify .ajs-dimmer,.alertify .ajs-modal,.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}}#trumbowyg-icons,#trumbowyg-icons svg{height:0;width:0}#trumbowyg-icons{overflow:hidden;visibility:hidden}.trumbowyg-box *,.trumbowyg-box ::after,.trumbowyg-box ::before,.trumbowyg-modal *,.trumbowyg-modal ::after,.trumbowyg-modal ::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.trumbowyg-box svg,.trumbowyg-modal svg{width:17px;height:100%;fill:#222}.trumbowyg-box,.trumbowyg-editor{display:block;position:relative;border:1px solid #DDD;width:100%;min-height:300px}.trumbowyg-box .trumbowyg-editor{margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#FEFEFE;border:none!important}.trumbowyg-editor,.trumbowyg-textarea{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:20px;min-height:300px;width:100%;border-style:none;resize:none;outline:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.trumbowyg-editor.trumbowyg-autogrow-on-enter,.trumbowyg-textarea.trumbowyg-autogrow-on-enter{-webkit-transition:height .3s ease-out;-o-transition:height .3s ease-out;transition:height .3s ease-out}.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:transparent!important;text-shadow:0 0 7px #333}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}.trumbowyg-box-blur .trumbowyg-editor hr,.trumbowyg-box-blur .trumbowyg-editor img{opacity:.2}.trumbowyg-textarea{position:relative;display:block;overflow:auto;border:none;font-size:14px;font-family:Inconsolata,Consolas,Courier,"Courier New",sans-serif;line-height:18px}.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea{height:1px!important;width:25%;min-height:0!important;padding:0!important;background:0 0;opacity:0!important}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea{display:block;margin-bottom:1px}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none;white-space:break-spaces}.trumbowyg-button-pane{width:100%;min-height:36px;background:#ecf0f1;border-bottom:1px solid #d7e0e2;margin:0;padding:0 5px;position:relative;list-style-type:none;line-height:10px;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:11}.trumbowyg-button-pane::after{content:" ";display:block;position:absolute;top:36px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane .trumbowyg-button-group{display:inline-block}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group::after{content:" ";display:inline-block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.bootstrap-tagsinput,.fa-stack,.md-avatar,.mi-stack,.trumbowyg-button-pane button{vertical-align:middle}.trumbowyg-button-pane .trumbowyg-button-group:last-child::after{content:none}.trumbowyg-button-pane button{display:inline-block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;-webkit-transition:background-color 150ms,opacity 150ms;-o-transition:background-color 150ms,opacity 150ms;transition:background-color 150ms,opacity 150ms}.trumbowyg-button-pane button.trumbowyg-textual-button{width:auto;line-height:35px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.trumbowyg-button-pane button.trumbowyg-disable,.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),.trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button){opacity:.2;cursor:default;pointer-events:none}.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,.trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before{background:#e3e9eb}.trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#FFF;outline:0}.trumbowyg-button-pane .trumbowyg-open-dropdown::after{display:block;content:" ";position:absolute;top:25px;right:3px;height:0;width:0;border:3px solid transparent;border-top-color:#555}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button{padding-left:10px!important;padding-right:18px!important}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after{top:17px;right:7px}.trumbowyg-button-pane .trumbowyg-right{float:right}.trumbowyg-dropdown{max-width:300px;max-height:250px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;border:1px solid #ecf0f1;padding:5px 0;border-top:none;background:#FFF;margin-left:-1px;-webkit-box-shadow:rgba(0,0,0,.1) 0 2px 3px;box-shadow:rgba(0,0,0,.1) 0 2px 3px;z-index:12}.trumbowyg-dropdown button{display:block;width:100%;height:35px;line-height:35px;text-decoration:none;background:#FFF;padding:0 20px 0 10px;color:#333!important;border:none;cursor:pointer;text-align:left;font-size:15px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-dropdown button:focus,.trumbowyg-dropdown button:hover{background:#ecf0f1}.trumbowyg-dropdown button svg{float:left;margin-right:14px}.trumbowyg-modal{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:520px;width:100%;height:350px;z-index:12;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:500px;width:calc(100% - 20px);padding-bottom:45px;z-index:1;background-color:#FFF;text-align:center;font-size:14px;-webkit-box-shadow:rgba(0,0,0,.2) 0 2px 3px;box-shadow:rgba(0,0,0,.2) 0 2px 3px;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box .trumbowyg-modal-title{font-size:24px;font-weight:700;margin:0 0 20px;padding:15px 0 13px;display:block;border-bottom:1px solid #EEE;color:#333;background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-progress{width:100%;height:3px;position:absolute;top:58px}.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar{background:#2BC06A;width:0;height:100%;-webkit-transition:width 150ms linear;-o-transition:width 150ms linear;transition:width 150ms linear}.trumbowyg-modal-box .trumbowyg-input-row{position:relative;margin:15px 12px;border:1px solid #DEDEDE;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos{text-align:left;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;width:150px;border-right:1px solid #DEDEDE;padding:0 7px;background-color:#fbfcfc;position:absolute;left:0;top:0;bottom:0}.trumbowyg-modal-box .trumbowyg-input-infos label{color:#69878f;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos label,.trumbowyg-modal-box .trumbowyg-input-infos label span{display:block;height:27px;line-height:27px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error{color:#e74c3c}.trumbowyg-modal-box .trumbowyg-input-html{padding:1px 1px 1px 152px}.trumbowyg-modal-box .trumbowyg-input-html,.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{font-size:14px}.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;height:27px;line-height:27px;border:0;width:100%;padding:0 7px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html input:hover,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html select:hover,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:hover{outline:#95a5a6 solid 1px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus{background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-input-html input[type=checkbox]{width:16px;height:16px;padding:0}.trumbowyg-modal-box .trumbowyg-input-html-with-checkbox{text-align:left;padding:3px 1px 1px 3px}.trumbowyg-modal-box .trumbowyg-input-error input,.trumbowyg-modal-box .trumbowyg-input-error select,.trumbowyg-modal-box .trumbowyg-input-error textarea{outline:#e74c3c solid 1px}.trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child{margin-top:-27px}.trumbowyg-modal-box .error{margin-top:25px;display:block;color:red}.trumbowyg-modal-box .trumbowyg-modal-button{position:absolute;bottom:10px;right:0;text-decoration:none;color:#FFF;display:block;width:100px;height:35px;line-height:33px;margin:0 10px;background-color:#333;border:none;cursor:pointer;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;font-size:16px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{right:110px;background:#2bc06a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#40d47e;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#25a25a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{color:#555;background:#e6e6e6}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#fbfbfb;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#d5d5d5}.trumbowyg-overlay{position:absolute;background-color:rgba(255,255,255,.5);height:100%;width:100%;left:0;display:none;top:0;z-index:10}body.trumbowyg-body-fullscreen{overflow:hidden}.trumbowyg-fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;margin:0;padding:0;z-index:99999}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen .trumbowyg-textarea{height:calc(100% - 37px)!important;overflow:auto}.trumbowyg-fullscreen .trumbowyg-overlay{height:100%!important}.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#222;fill:transparent}.trumbowyg-editor embed,.trumbowyg-editor img,.trumbowyg-editor object,.trumbowyg-editor video{max-width:100%}.trumbowyg-editor img,.trumbowyg-editor video{height:auto}.trumbowyg-editor img{cursor:move}.trumbowyg-editor canvas:focus{outline:0}.trumbowyg-editor.trumbowyg-reset-css{background:#FEFEFE!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;line-height:1.45em!important;color:#333}.trumbowyg-editor.trumbowyg-reset-css a{color:#15c!important;text-decoration:underline!important}.trumbowyg-editor.trumbowyg-reset-css blockquote,.trumbowyg-editor.trumbowyg-reset-css div,.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css p,.trumbowyg-editor.trumbowyg-reset-css ul{-webkit-box-shadow:none!important;box-shadow:none!important;background:0 0!important;margin:0 0 15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none}.trumbowyg-editor.trumbowyg-reset-css hr,.trumbowyg-editor.trumbowyg-reset-css iframe,.trumbowyg-editor.trumbowyg-reset-css object{margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css blockquote{margin-left:32px!important;font-style:italic!important;color:#555}.trumbowyg-editor.trumbowyg-reset-css ul{list-style:disc}.trumbowyg-editor.trumbowyg-reset-css ol{list-style:decimal}.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css ul{padding-left:20px!important}.trumbowyg-editor.trumbowyg-reset-css ol ol,.trumbowyg-editor.trumbowyg-reset-css ol ul,.trumbowyg-editor.trumbowyg-reset-css ul ol,.trumbowyg-editor.trumbowyg-reset-css ul ul{border:none;margin:2px!important;padding:0 0 0 24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block;height:1px;border:none;border-top:1px solid #CCC}.trumbowyg-editor.trumbowyg-reset-css h1,.trumbowyg-editor.trumbowyg-reset-css h2,.trumbowyg-editor.trumbowyg-reset-css h3,.trumbowyg-editor.trumbowyg-reset-css h4{color:#111;background:0 0;margin:0!important;padding:0!important;font-weight:700}.trumbowyg-editor.trumbowyg-reset-css h1{font-size:32px!important;line-height:38px!important;margin-bottom:20px!important}.trumbowyg-editor.trumbowyg-reset-css h2{font-size:26px!important;line-height:34px!important;margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css h3{font-size:22px!important;line-height:28px!important;margin-bottom:7px!important}.trumbowyg-editor.trumbowyg-reset-css h4{font-size:16px!important;line-height:22px!important;margin-bottom:7px!important}.trumbowyg-dark .trumbowyg-textarea{background:#111;color:#ddd}.trumbowyg-dark .trumbowyg-box{border:1px solid #343434}.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen{background:#111}.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{text-shadow:0 0 7px #ccc}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}.trumbowyg-dark .trumbowyg-box svg{fill:#ecf0f1;color:#ecf0f1}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after{background:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after{background-color:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after{background-color:#2a2a2a}.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#333}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after{border-top-color:#fff}.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:#ecf0f1;fill:transparent}.trumbowyg-dark .trumbowyg-dropdown{border-color:#222;background:#333;-webkit-box-shadow:rgba(0,0,0,.3) 0 2px 3px;box-shadow:rgba(0,0,0,.3) 0 2px 3px}.trumbowyg-dark .trumbowyg-dropdown button{background:#333;color:#fff!important}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:27px;line-height:27px;overflow:hidden}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#222}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label input{border-color:#222;color:#eee;background:#333}.trumbowyg-dark .trumbowyg-modal-box label input:focus,.trumbowyg-dark .trumbowyg-modal-box label input:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box label input:focus{background-color:#2f2f2f}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{background:#1b7943}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#25a25a}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#176437}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{background:#333;color:#ccc}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#444}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#111}.trumbowyg-dark .trumbowyg-overlay{background-color:rgba(15,15,15,.6)}.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list),.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list){max-width:276px;padding:7px 5px;overflow:initial}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button{display:block;position:relative;float:left;text-indent:-9999px;height:20px;width:20px;border:1px solid #333;padding:0;margin:2px}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:hover::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:hover::after{content:" ";display:block;position:absolute;top:-5px;left:-5px;width:27px;height:27px;background:inherit;border:1px solid #fff;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button){position:relative;color:#fff!important}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):focus::after,.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):hover::after{content:" ";display:block;position:absolute;top:13px;left:0;width:0;height:0;border:5px solid transparent;border-left-color:#fff}.trumbowyg-dropdown-emoji{width:265px;padding:7px 0 7px 5px}.trumbowyg-dropdown-emoji svg{display:none!important}.trumbowyg-dropdown-emoji button{display:block;position:relative;float:left;height:26px;width:26px;padding:0;margin:2px;line-height:24px;text-align:center}.trumbowyg-dropdown-emoji button:focus::after,.trumbowyg-dropdown-emoji button:hover::after{display:block;position:absolute;top:-5px;left:-5px;height:27px;width:27px;background:inherit;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10;background-color:transparent}.trumbowyg .emoji{width:22px;height:22px;display:inline-block}.custom-file-img{max-width:100%}.md-avatar{width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important;margin-left:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}#modal-posts img{height:30px}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative;overflow:hidden}.user .username{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{height:100%;width:100%;border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}fb-login{background-color:#0ff}medias .modal{z-index:1049}medias #modal-files .modal-body .table img{height:30px}medias #modal-files .modal-body .table img.preview{height:auto}mix-column-preview .row{max-height:120px;margin:10px 0;overflow:hidden}mix-column-preview img{max-width:100%}mix-module-data-table .data-table .header{padding:5px;color:#495057;background-color:hsla(var(--primary-color-hue,211),100%,50%,.075);border-color:#dee2e6;font-weight:400;font-size:small}mix-module-data-table .preview-container{max-height:4em;overflow:hidden}qr-code .qr-output canvas{max-width:100%}#dlg-preview-popup .modal-body img{display:block;margin:0 auto;max-width:100%;height:auto}#dlg-preview-popup pre{overflow:visible}upload-croppie .cr-boundary{overflow:hidden}body,html{height:100%}.btn,.btn-link{cursor:pointer}.content-body{max-width:66vw}.w-85{width:85vw}.display-4{font-size:2rem!important}div[dnd-list],ul[dnd-list]{min-height:42px;padding-left:0}div[dnd-list] .dndDraggingSource,ul[dnd-list] .dndDraggingSource{display:none}div[dnd-list] .dndPlaceholder,ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}div[dnd-list] .dnd-item,ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}div[dnd-list] .dnd-item.selected,ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}.mouse{z-index:9999999;width:70px;height:70px;background-color:transparent;color:#fff;position:absolute}hub-messages .nav-link .new-msg-count,log-stream .nav-link .new-msg-count{color:#fff;top:-5px;right:5px;background-color:red;padding:2px 4px 0;font-weight:700}hub-messages .nav-link{position:relative}hub-messages .nav-link .new-msg-count{position:absolute}log-stream #modal-log-stream .modal-body{max-height:80vh;overflow-y:scroll}log-stream .nav-link{position:relative}log-stream .nav-link .new-msg-count{position:absolute}main-side-bar-dynamic .sw-sidebar .sw-toc-item{position:relative}main-side-bar-dynamic .sw-sidebar .sw-toc-item .sw-toc-link .sw-toc-link{padding-left:0}main-side-bar-dynamic .sw-sidebar .sw-toc-item .btn-group{right:20px;opacity:1}main-side-bar-dynamic .sw-sidebar ul{padding-left:15px}main-side-bar-dynamic .sw-sidebar .sw-toc-sub-link .btn-group{padding:2px 0}.custom-image{max-width:30vw}.attr-set-value-item:last-child{border-bottom:0!important}mix-database-nav-values .row{padding:10px 0}mix-database-nav-values mix-column-preview .rowx{max-height:110px;overflow:hidden}@media (min-width:992px){#modal-content-filter .modal-lg,#modal-content-filter .modal-xl{max-width:80vw}}.table-data td.preview{max-width:120px;overflow:hidden}.img-container>img,.img-preview>img{max-width:100%}.content{width:100%;display:flex;align-items:center;flex-direction:column;background:0 0}.flag-icon,.flag-icon-background{background-size:contain;background-position:50%}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem;overflow:hidden}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor{color:#000}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}.bootstrap-tagsinput,.cm-tab,.cr-rotate-controls i:before,.flag-icon,.now-ui-icons{display:inline-block}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;border-radius:50%}.fa-ul,.nc-icon-ul{padding-left:0;list-style-type:none}.nc-icon-ul{margin-left:2.14285714em}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.flag-icon-background{background-repeat:no-repeat}.flag-icon{background-repeat:no-repeat;position:relative;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{font-style:normal;font-weight:900;font-size:22px}.cm-em,.hljs-comment,.hljs-emphasis,.hljs-quote,.tui-editor-contents address,.tui-editor-contents cite,.tui-editor-contents dfn,.tui-editor-contents em,.tui-editor-contents i,.tui-editor-contents var{font-style:italic}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.CodeMirror{height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{text-decoration:inherit}.cm-link,.tui-editor-contents a{text-decoration:underline}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror,.te-input-language input,.te-ww-block-overlay.code-block-header,.tui-editor-defaultUI{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-strong{font-weight:700}.tui-editor-contents :not(table){line-height:160%;box-sizing:content-box}.tui-editor-contents strong{font-weight:700}.tui-editor-contents p{margin:10px 0;color:#555}.tui-editor-contents>div>div:first-of-type h1,.tui-editor-contents>h1:first-of-type{margin-top:14px}.tui-editor-contents h1,.tui-editor-contents h2,.tui-editor-contents h3,.tui-editor-contents h5{font-weight:700}.tui-editor-contents h1{font-size:1.6rem;line-height:28px;border-bottom:3px double #999;margin:52px 0 15px;padding-bottom:7px;color:#000}.tui-editor-contents h2{font-size:1.3rem;line-height:23px;border-bottom:1px solid #dbdbdb;margin:30px 0 13px;padding-bottom:7px;color:#333}.tui-editor-contents h3,.tui-editor-contents h4{font-size:1.2rem;line-height:18px;margin:20px 0 2px;color:#333}.tui-editor-contents h5,.tui-editor-contents h6{font-size:1rem;line-height:17px;margin:10px 0 -4px;color:#333}.tui-editor-contents blockquote{margin:15px 0;border-left:4px solid #ddd;padding:0 15px;color:#777}.tui-editor-contents blockquote>:first-child{margin-top:0}.tui-editor-contents blockquote>:last-child{margin-bottom:0}.tui-editor-contents code,.tui-editor-contents pre{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;border:0;border-radius:0}.tui-editor-contents pre{margin:2px 0 8px;padding:18px;background-color:#f5f7f8}.tui-editor-contents code{color:#c1788b;padding:4px 4px 2px 0;letter-spacing:-.3px}.tui-editor-contents pre code{padding:0;color:inherit;white-space:pre-wrap;background-color:transparent}.tui-editor-contents pre.addon{border:1px solid #e8ebed;background-color:#fff}.tui-editor-contents img{margin:4px 0 10px;box-sizing:border-box;vertical-align:top;max-width:100%}.tui-editor-contents table{margin:2px 0 14px;color:#555;width:auto;border-collapse:collapse;box-sizing:border-box}.tui-editor-contents table td,.tui-editor-contents table th{height:32px;padding:5px 14px 5px 12px}.tui-editor-contents table td{border:1px solid #eaeaea}.tui-editor-contents table th{border:1px solid #72777b;border-top:0;background-color:#7b8184;font-weight:300;color:#fff;padding-top:6px}.tui-editor-contents dir,.tui-editor-contents menu,.tui-editor-contents ol,.tui-editor-contents ul{display:block;list-style-type:disc;padding-left:17px;margin:6px 0 10px;color:#555}.tui-editor-contents ol{list-style-type:decimal}.tui-editor-contents ol ol,.tui-editor-contents ol ul,.tui-editor-contents ul ol,.tui-editor-contents ul ul{margin-top:0!important;margin-bottom:0!important}.tui-editor-contents ol li,.tui-editor-contents ul li{position:relative}.tui-editor-contents ul p,ol p{margin:0}.tui-editor-contents hr{border-top:1px solid #eee;margin:16px 0}.tui-editor-contents a{color:#5286bc}.tui-editor-contents a:hover{color:#007cff}.tui-editor-contents{font-size:13px;margin:0;padding:0}.tui-editor-contents .task-list-item{border:0;list-style:none;padding-left:22px;margin-left:-22px}.tui-editor-contents .task-list-item:before{background-repeat:no-repeat;background-size:16px 16px;background-position:center;height:18px;width:18px;position:absolute;left:0;top:1px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item.checked:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item .task-list-item-checkbox,.tui-editor-contents .task-list-item input[type=checkbox]{margin-left:-17px;margin-right:3.8px;margin-top:3px}.tui-editor-contents-placeholder:before{content:attr(data-placeholder);color:grey;line-height:160%;position:absolute}.auto-height,.auto-height .tui-editor-defaultUI{height:auto}.auto-height .tui-editor{position:relative}:not(.auto-height)>.tui-editor-defaultUI,:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{-ms-flex:1;flex:1}.tui-editor-defaultUI-toolbar:after,.tui-editor:after{content:"";display:block;height:0;clear:both}.tui-editor{position:absolute;line-height:1;color:#181818;width:100%;height:inherit}.te-editor-section{min-height:0;position:relative;height:inherit}.te-md-container{display:none;overflow:hidden;height:100%}.te-md-container .te-editor{line-height:1.5}.te-md-container .te-editor,.te-md-container .te-preview{box-sizing:border-box;padding:0;height:inherit}.te-md-container .CodeMirror{font-size:13px;height:inherit}.te-md-container .te-preview{overflow:auto;padding:0 25px;height:100%}.te-md-container .te-preview>p:first-child{margin-top:0!important}.te-md-container .te-preview .tui-editor-contents{padding-top:11px}.tui-editor .te-preview-style-tab>.te-editor,.tui-editor .te-preview-style-tab>.te-preview{float:left;width:100%;display:none}.tui-editor .te-preview-style-tab>.te-tab-active{display:block}.tui-editor .te-preview-style-vertical>.te-tab-section{display:none}.tui-editor .te-preview-style-tab>.te-tab-section{display:block}.tui-editor .te-preview-style-vertical .te-editor,.tui-editor .te-preview-style-vertical .te-preview{float:left;width:50%}.tui-editor .te-md-splitter{display:none;position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #e5e5e5}.tui-editor .te-preview-style-vertical .te-md-splitter{display:block}.te-ww-container{display:none;overflow:hidden;z-index:10;height:inherit;background-color:#fff}.te-ww-container>.te-editor{overflow:auto;height:inherit}.te-ww-container .tui-editor-contents:focus{outline:0}.te-ww-container .tui-editor-contents{padding:0 25px}.te-ww-container .tui-editor-contents:first-child{box-sizing:border-box;margin:0;padding:16px 25px 0;height:inherit}.te-ww-container .tui-editor-contents:last-child{margin-bottom:16px}.te-md-mode .te-md-container,.te-ww-mode .te-ww-container{display:block;z-index:100}.tui-editor-defaultUI.te-hide,.tui-editor.te-hide{display:none}.tui-editor-defaultUI .CodeMirror-lines{padding-top:13px;padding-bottom:13px}.tui-editor-defaultUI .CodeMirror-line{padding-left:25px;padding-right:25px}.tui-editor-defaultUI .CodeMirror pre.CodeMirror-placeholder{padding-left:25px;color:grey}.tui-editor-defaultUI .CodeMirror-scroll{cursor:text}.tui-editor-contents td.te-cell-selected{background-color:#d8dfec}.tui-editor-contents td.te-cell-selected::selection{background-color:#d8dfec}.tui-editor-contents th.te-cell-selected{background-color:#908f8f}.tui-editor-contents th.te-cell-selected::selection{background-color:#908f8f}.tui-editor-defaultUI{position:relative;border:1px solid #e5e5e5;height:100%}.tui-editor-defaultUI button{color:#fff;padding:0 14px 0 15px;height:28px;font-size:12px;border:none;cursor:pointer;outline:0}.tui-editor-defaultUI button.te-ok-button{background-color:#4b96e6}.tui-editor-defaultUI button.te-close-button{background-color:#777}.tui-editor-defaultUI-toolbar{padding:0 25px;height:31px;background-color:#fff;border:0;overflow:hidden}.tui-toolbar-divider{float:left;display:inline-block;width:1px;height:14px;background-color:#ddd;margin:9px 6px}.tui-toolbar-button-group{height:28px;border-right:1px solid #d9d9d9;float:left}.te-toolbar-section{height:32px;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.tui-editor-defaultUI-toolbar button{float:left;box-sizing:border-box;outline:0;cursor:pointer;background-color:#fff;width:22px;height:22px;padding:3px;border-radius:0;margin:5px 3px;border:1px solid #fff}.tui-editor-defaultUI-toolbar button.active,.tui-editor-defaultUI-toolbar button:active,.tui-editor-defaultUI-toolbar button:hover{border:1px solid #aaa;background-color:#fff}.tui-editor-defaultUI-toolbar button:first-child{margin-left:0}.tui-editor-defaultUI-toolbar button:last-child{margin-right:0}.tui-editor-defaultUI-toolbar button.tui-scrollsync{width:auto;color:#777;border:0}.tui-editor-defaultUI button.tui-scrollsync:after{content:"Scroll off"}.tui-editor-defaultUI button.tui-scrollsync.active{color:#125de6;font-weight:700}.tui-editor-defaultUI button.tui-scrollsync.active:after{content:"Scroll on"}.tui-editor-defaultUI .te-mode-switch-section{background-color:#f9f9f9;border-top:1px solid #e5e5e5;height:20px;font-size:12px}.tui-editor-defaultUI .te-mode-switch{float:right;height:100%}.tui-editor-defaultUI .te-switch-button{width:92px;height:inherit;background:#e5e5e5;outline:0;color:#a0aabf;cursor:pointer;border:0;border-left:1px solid #ddd;border-right:1px solid #ddd}.tui-editor-defaultUI .te-switch-button.active{background-color:#fff;color:#000}.tui-editor-defaultUI .te-markdown-tab-section{float:left;height:31px;background:#fff}.te-markdown-tab-section .te-tab{margin:0 -7px 0 24px;background:#fff}.tui-editor-defaultUI .te-tab button{box-sizing:border-box;line-height:100%;position:relative;cursor:pointer;z-index:1;font-size:13px;background-color:#f9f9f9;border:1px solid #e5e5e5;border-top:0;padding:0 9px;color:#777;border-radius:0;outline:0}.te-markdown-tab-section .te-tab button:last-child{margin-left:-1px}.te-markdown-tab-section .te-tab button.te-tab-active,.te-markdown-tab-section .te-tab button:hover.te-tab-active{background-color:#fff;color:#333;border-bottom:1px solid #fff;z-index:2}.te-markdown-tab-section .te-tab button:hover{background-color:#fff;color:#333}.tui-popup-modal-background{background-color:rgba(202,202,202,.6);position:fixed;margin:0;left:0;top:0;width:100%;height:100%;z-index:9999}.tui-popup-modal-background.fit-window .tui-popup-wrapper,.tui-popup-wrapper.fit-window{width:100%;height:100%}.tui-popup-wrapper{width:500px;margin-right:auto;border:1px solid #cacaca;background:#fff;z-index:9999}.tui-popup-modal-background .tui-popup-wrapper{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0}.tui-popup-header{padding:10px;height:auto;line-height:normal;position:relative;border-bottom:1px solid #cacaca}.tui-popup-header .tui-popup-header-buttons{float:right}.tui-popup-header .tui-popup-header-buttons button{padding:0;background-color:transparent;background-size:cover;float:left}.tui-popup-header .tui-popup-close-button{margin:3px;width:13px;height:13px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMHB4IiBoZWlnaHQ9IjEwcHgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5GMjc2Qzc4MC0zM0JBLTQ3MTItQTM3OC04RkQwQUNDOTFDRTk8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImxuYi1mb2xkZXItZGVsIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM3Nzc3NzciPiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LDMuNTg1Nzg2NDQgTDEuNzA3MTA2NzgsMC4yOTI4OTMyMTkgTDAuMjkyODkzMjE5LDEuNzA3MTA2NzggTDMuNTg1Nzg2NDQsNSBMMC4yOTI4OTMyMTksOC4yOTI4OTMyMiBMMS43MDcxMDY3OCw5LjcwNzEwNjc4IEw1LDYuNDE0MjEzNTYgTDguMjkyODkzMjIsOS43MDcxMDY3OCBMOS43MDcxMDY3OCw4LjI5Mjg5MzIyIEw2LjQxNDIxMzU2LDUgTDkuNzA3MTA2NzgsMS43MDcxMDY3OCBMOC4yOTI4OTMyMiwwLjI5Mjg5MzIxOSBMNSwzLjU4NTc4NjQ0IFoiIGlkPSJDb21iaW5lZC1TaGFwZSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-header .tui-popup-title{font-size:13px;font-weight:700;color:#333;vertical-align:bottom}.tui-popup-body{padding:15px;font-size:12px}.tui-editor-popup{position:absolute;top:30px;left:50%;margin-left:-250px}.tui-editor-popup.tui-popup-modal-background{position:fixed;top:0;left:0;margin:0}.tui-editor-popup .tui-popup-body label{font-weight:700;color:#666;display:block;margin:10px 0 5px}.tui-editor-popup .tui-popup-body .te-button-section{margin-top:15px}.tui-editor-popup .tui-popup-body input[type=file],.tui-editor-popup .tui-popup-body input[type=text]{padding:4px 10px;border:1px solid #bfbfbf;box-sizing:border-box;width:100%}.tui-editor-popup .tui-popup-body input.wrong{border-color:red}.te-popup-add-link .tui-popup-wrapper{height:219px}.te-popup-add-image .tui-popup-wrapper{height:243px}.te-popup-add-image .te-tab{display:block;background:0 0;border-bottom:1px solid #ebebeb;margin-bottom:8px}.te-dropdown-toolbar .tui-toolbar-divider,.te-popup-add-image .te-file-type,.te-popup-add-image .te-url-type,.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-toggle-slider{display:none}.te-popup-add-image div.te-tab-active,.te-popup-add-image form.te-tab-active{display:block}.te-popup-add-image .te-tab button{border:1px solid #ccc;background:#eee;min-width:100px;margin-left:-1px;border-bottom:0;border-radius:3px 3px 0 0}.te-popup-add-image .te-tab button.te-tab-active{background:#fff}.te-popup-add-table .te-table-selection{position:relative}.te-popup-add-table .te-table-body{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZmspKREMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgAMSwQgckFvTgAAAABJRU5ErkJggg==)}.te-popup-add-table .te-table-header{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZksLCxMMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgDxKwPzTeWPdAAAAABJRU5ErkJggg==)}.te-popup-add-table .te-selection-area{position:absolute;top:0;left:0;background:#80d2ff;opacity:.3;z-index:999}.te-popup-add-table .te-description{margin:10px 0 0;text-align:center}.te-popup-table-utils{width:120px}.te-popup-table-utils .tui-popup-body{padding:0}.te-popup-table-utils button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:28px;text-align:left;color:#777}.fa-inverse,.mi-inverse,.tui-tooltip{color:#fff}.te-popup-table-utils button:hover{background-color:#f4f4f4}.te-popup-table-utils hr{background-color:#cacaca;border-style:none;height:1px}.te-heading-add{width:auto}.te-heading-add .tui-popup-body{padding:0}.te-heading-add h1,.te-heading-add h2,.te-heading-add h3,.te-heading-add h4,.te-heading-add h5,.te-heading-add h6,.te-heading-add p,.te-heading-add ul{padding:0;margin:0}.te-heading-add ul{list-style:none}.te-heading-add ul li{padding:2px 10px;cursor:pointer}.te-dropdown-toolbar .tui-popup-body,.tui-popup-color{padding:0}.te-heading-add ul li:hover{background-color:#eee}.te-heading-add h1{font-size:24px}.te-heading-add h2{font-size:22px}.te-heading-add h3{font-size:20px}.te-heading-add h4{font-size:18px}.te-heading-add h5{font-size:16px}.te-heading-add h6{font-size:14px}.te-dropdown-toolbar{position:absolute;width:auto}.tui-popup-color .tui-colorpicker-container,.tui-popup-color .tui-colorpicker-palette-container{width:144px}.tui-popup-color .tui-colorpicker-container ul{width:144px;margin-bottom:8px}.tui-popup-color .tui-colorpicker-container li{padding:0 1px 1px 0}.tui-popup-color .tui-colorpicker-container li .tui-colorpicker-palette-button{border:0;width:17px;height:17px}.tui-popup-color .tui-popup-body{padding:10px}.tui-popup-color .te-apply-button,.tui-popup-color .tui-colorpicker-palette-hex{float:right}.tui-popup-color .te-apply-button{height:21px;width:35px;background:#fff;border:1px solid #efefef;position:absolute;bottom:141px;right:10px}.tui-tooltip,.tui-tooltip .arrow{background-color:#222;position:absolute}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-hex{border:1px solid #E1E1E1;padding:3px 14px;margin-left:-1px}.tui-popup-color .tui-colorpicker-container div.tui-colorpicker-clearfix{display:inline-block}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-preview{width:19px;height:19px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-slider-right{width:22px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-huebar-handle{display:none}.tui-tooltip{z-index:999;opacity:.8;padding:2px 5px;font-size:10px}.tui-tooltip .arrow{content:"";display:inline-block;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:6px;z-index:-1}.tui-toolbar-icons{background:url(tui-editor.png);background-size:218px 188px;display:inline-block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.tui-toolbar-icons{background:url(tui-editor-2x.png);background-size:218px 188px;display:inline-block}}.tui-toolbar-icons.tui-heading{background-position:-172px -48px}.tui-toolbar-icons.tui-heading:disabled{background-position:-193px -48px}.tui-toolbar-icons.tui-bold{background-position:-4px -4px}.tui-toolbar-icons.tui-bold:disabled{background-position:-25px -4px}.tui-toolbar-icons.tui-italic{background-position:-4px -48px}.tui-toolbar-icons.tui-italic:disabled{background-position:-25px -48px}.tui-toolbar-icons.tui-color{background-position:-172px -70px}.tui-toolbar-icons.tui-color:disabled{background-position:-193px -70px}.tui-toolbar-icons.tui-strike{background-position:-4px -26px}.tui-toolbar-icons.tui-strike:disabled{background-position:-25px -26px}.tui-toolbar-icons.tui-hrline{background-position:-46px -92px}.tui-toolbar-icons.tui-hrline:disabled{background-position:-67px -92px}.tui-toolbar-icons.tui-quote{background-position:-4px -114px}.tui-toolbar-icons.tui-quote:disabled{background-position:-25px -114px}.tui-toolbar-icons.tui-ul{background-position:-46px -4px}.tui-toolbar-icons.tui-ul:disabled{background-position:-67px -4px}.tui-toolbar-icons.tui-ol{background-position:-46px -26px}.tui-toolbar-icons.tui-ol:disabled{background-position:-67px -26px}.tui-toolbar-icons.tui-task{background-position:-130px -48px}.tui-toolbar-icons.tui-task:disabled{background-position:-151px -48px}.tui-toolbar-icons.tui-indent{background-position:-46px -48px}.tui-toolbar-icons.tui-indent:disabled{background-position:-67px -48px}.tui-toolbar-icons.tui-outdent{background-position:-46px -70px}.tui-toolbar-icons.tui-outdent:disabled{background-position:-67px -70px}.tui-toolbar-icons.tui-table{background-position:-88px -92px}.tui-toolbar-icons.tui-table:disabled{background-position:-109px -92px}.tui-toolbar-icons.tui-image{background-position:-130px -4px}.tui-toolbar-icons.tui-image:disabled{background-position:-151px -4px}.tui-toolbar-icons.tui-link{background-position:-130px -26px}.tui-toolbar-icons.tui-link:disabled{background-position:-151px -26px}.tui-toolbar-icons.tui-code{background-position:-130px -92px}.tui-toolbar-icons.tui-code:disabled{background-position:-151px -92px}.tui-toolbar-icons.tui-codeblock{background-position:-130px -70px}.tui-toolbar-icons.tui-codeblock:disabled{background-position:-151px -70px}.tui-toolbar-icons.tui-more{background-position:-172px -92px}.tui-toolbar-icons.tui-more:disabled{background-position:-193px -92px}.tui-colorpicker-svg-huebar,.tui-colorpicker-svg-slider,.tui-colorpicker-vml-slider{border:1px solid #ebebeb}.CodeMirror-sizer{margin-top:6px}.CodeMirror .cm-header{font-weight:700;color:inherit}.CodeMirror .cm-header-1{font-size:24px}.CodeMirror .cm-header-2{font-size:22px}.CodeMirror .cm-header-3{font-size:20px}.CodeMirror .cm-header-4{font-size:18px}.CodeMirror .cm-header-5{font-size:16px}.CodeMirror .cm-header-6{font-size:14px}.CodeMirror .cm-variable-2{color:inherit}.tui-editor-pseudo-clipboard{position:fixed;left:-1000px;top:-1000px;width:100px;height:100px}.te-ww-block-overlay.code-block-header{text-align:right}.te-ww-block-overlay.code-block-header span{font-size:10px;font-weight:600;padding:0 10px;color:#333;cursor:default}.te-ww-block-overlay.code-block-header button{margin:8px;font-size:10px;color:#333;background-color:#f9f9f9;border:1px solid #ddd;padding:4px;height:auto}.te-popup-code-block-languages{position:fixed;box-sizing:border-box;width:130px}.te-popup-code-block-languages .tui-popup-body{max-height:169px;overflow:auto;padding:0}.te-popup-code-block-languages button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:24px;text-align:left;color:#777}.te-popup-code-block-languages button.active{background-color:#f4f4f4}.tui-popup-code-block-editor .tui-popup-wrapper{width:70%;height:70%;margin:auto;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.te-input-language{position:relative;margin-left:15px;cursor:pointer}.te-input-language input{font-size:10px;padding:3px 5px;border:1px solid #ddd;background-color:#f9f9f9;box-sizing:border-box;width:130px;outline:0}.te-input-language input::-ms-clear{display:none}.te-input-language::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT42Q0NBRDk2QS0yMjYxLTRFNDAtOTk1RC1DRUUyQUREQUQ3NkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLWQtc2lkZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS03IiBwb2ludHM9IjIgNSAxMCA1IDYgMTAiPjwvcG9seWdvbj4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);position:absolute;top:1px;right:3px}.te-input-language.active::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BNEZDRkIzMy0zNjdBLTREMjAtOEEyNC1DQ0I2ODFBMDZDODg8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLXVwLXNpZGUiIGZpbGw9IiM1NTU1NTUiPiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJSZWN0YW5nbGUtNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC02LjAwMDAwMCwgLTYuNTAwMDAwKSAiIHBvaW50cz0iMiA0IDEwIDQgNiA5Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor button{margin:-1px 3px}.tui-popup-code-block-editor .tui-popup-header-buttons{height:20px}.tui-popup-code-block-editor .popup-editor-toggle-preview::after{content:'Preview off';color:#777;margin-right:22px}.tui-popup-code-block-editor .popup-editor-toggle-preview.active::after{content:'Preview on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-scroll::after{content:'Scroll off';color:#777;margin-right:16px}.tui-popup-code-block-editor .popup-editor-toggle-scroll.active::after{content:'Scroll on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-fit{width:18px;height:18px;margin-top:4px;margin-right:14px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT40OUQ4RTYyMy1GRTAyLTQ1RUUtQkQ5Ri0xMjUyQjEzRTU1MkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLWV4cGFuZCIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBhdGggZD0iTTMsMyBMOSwzIEw5LDUgTDUsNSBMNSw5IEwzLDkgTDMsMyBaIE0xNSwxNSBMOSwxNSBMOSwxMyBMMTMsMTMgTDEzLDkgTDE1LDkgTDE1LDE1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC05LjAwMDAwMCwgLTkuMDAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZSIgZmlsbC1ydWxlPSJub256ZXJvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS41MDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMS41MDAwMDAsIC02LjUwMDAwMCkgIiBwb2ludHM9IjkuMDg1Nzg2NDQgNS41IDEyLjUgOC45MTQyMTM1NiAxMy45MTQyMTM2IDcuNSAxMC41IDQuMDg1Nzg2NDQiPjwvcG9seWdvbj4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZS1Db3B5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuNTAwMDAwLCAxMS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTYuNTAwMDAwLCAtMTEuNTAwMDAwKSAiIHBvaW50cz0iNC4wODU3ODY0NCAxMC41IDcuNSAxMy45MTQyMTM2IDguOTE0MjEzNTYgMTIuNSA1LjUgOS4wODU3ODY0NCI+PC9wb2x5Z29uPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-code-block-editor .popup-editor-toggle-fit.active{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT4wN0Q1MjlCRi1GNTIzLTREN0EtQTlGNi05NTUzNTU5RDNEMUE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLXJlZHVjZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDEyLjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNS41MDAwMDAsIC0xMi41MDAwMDApICIgcG9pbnRzPSIzLjA4NTc4NjQ0IDExLjUgNi41IDE0LjkxNDIxMzYgNy45MTQyMTM1NiAxMy41IDQuNSAxMC4wODU3ODY0Ij48L3BvbHlnb24+ICAgICAgICAgICAgPHBhdGggZD0iTTksOSBMMTUsOSBMMTUsMTEgTDExLDExIEwxMSwxNSBMOSwxNSBMOSw5IFogTTksOSBMMyw5IEwzLDcgTDcsNyBMNywzIEw5LDMgTDksOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCA5LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOS4wMDAwMDAsIC05LjAwMDAwMCkgIj48L3BhdGg+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzMiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNTAwMDAwLCA1LjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTIuNTAwMDAwLCAtNS41MDAwMDApICIgcG9pbnRzPSIxNC45MTQyMTM2IDYuNSAxMS41IDMuMDg1Nzg2NDQgMTAuMDg1Nzg2NCA0LjUgMTMuNSA3LjkxNDIxMzU2Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor .tui-popup-close-button{margin-top:6px}.tui-popup-code-block-editor .tui-popup-body{z-index:-1;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1;flex:1}.tui-split-scroll.single-content .tui-split-content-right,.tui-split-scroll.single-content .tui-splitter,.tui-split-scroll.single-content button.tui-scrollsync{display:none}.tui-popup-code-block-editor .popup-editor-body{position:relative;-ms-flex:1;flex:1;border-bottom:1px solid #cacaca}.tui-popup-code-block-editor .te-button-section{padding:15px}.tui-popup-code-block-editor .te-button-section button{float:left}.tui-popup-code-block-editor .tui-editor-contents pre{margin:0;background-color:transparent}.tui-popup-code-block-editor .CodeMirror{height:auto}.tui-popup-code-block-editor .CodeMirror-line{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;font-size:13px;line-height:160%;letter-spacing:-.3px}.tui-popup-code-block-editor .popup-editor-editor-wrapper{min-height:100%}.tui-split-scroll-wrapper{position:relative}.tui-split-scroll{position:absolute}.tui-split-scroll,.tui-split-scroll-wrapper{width:100%;height:100%}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{position:absolute;top:0;width:50%;box-sizing:border-box}.tui-split-scroll .tui-split-content-left{left:0}.tui-split-scroll .tui-split-content-right{left:50%}.tui-split-scroll .tui-splitter{position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #cacaca}.tui-split-scroll .tui-split-scroll-content{width:100%;height:100%;overflow:hidden;position:relative}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{height:100%;overflow-x:hidden;overflow-y:auto}.tui-split-scroll button.tui-scrollsync{top:10px;opacity:.2}.tui-split-scroll button.tui-scrollsync::after{content:"scroll off"}.tui-split-scroll.scroll-sync button.tui-scrollsync{opacity:.5}.tui-split-scroll.scroll-sync .tui-split-content-left,.tui-split-scroll.scroll-sync .tui-split-content-right{height:auto;overflow:initial}.tui-split-scroll.scroll-sync button.tui-scrollsync::after{content:"scroll on"}.tui-split-scroll.scroll-sync .tui-split-scroll-content{overflow-y:auto}.tui-split-scroll.single-content .tui-split-content-left{width:100%}.fa,.fa-stack,.fab,.fad,.fal,.far,.fas,.mi,.mi-stack{display:inline-block}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@supports (-ms-accelerator:true){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@media screen and (max-width:480px){.tui-popup-wrapper{max-width:300px}.tui-editor-popup{margin-left:-150px}.te-dropdown-toolbar{max-width:none}}/*! + */@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.CodeMirror{height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{text-decoration:inherit}.cm-link,.tui-editor-contents a{text-decoration:underline}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror,.te-input-language input,.te-ww-block-overlay.code-block-header,.tui-editor-defaultUI{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-strong{font-weight:700}.tui-editor-contents :not(table){line-height:160%;box-sizing:content-box}.tui-editor-contents strong{font-weight:700}.tui-editor-contents p{margin:10px 0;color:#555}.tui-editor-contents>div>div:first-of-type h1,.tui-editor-contents>h1:first-of-type{margin-top:14px}.tui-editor-contents h1,.tui-editor-contents h2,.tui-editor-contents h3,.tui-editor-contents h5{font-weight:700}.tui-editor-contents h1{font-size:1.6rem;line-height:28px;border-bottom:3px double #999;margin:52px 0 15px;padding-bottom:7px;color:#000}.tui-editor-contents h2{font-size:1.3rem;line-height:23px;border-bottom:1px solid #dbdbdb;margin:30px 0 13px;padding-bottom:7px;color:#333}.tui-editor-contents h3,.tui-editor-contents h4{font-size:1.2rem;line-height:18px;margin:20px 0 2px;color:#333}.tui-editor-contents h5,.tui-editor-contents h6{font-size:1rem;line-height:17px;margin:10px 0 -4px;color:#333}.tui-editor-contents blockquote{margin:15px 0;border-left:4px solid #ddd;padding:0 15px;color:#777}.tui-editor-contents blockquote>:first-child{margin-top:0}.tui-editor-contents blockquote>:last-child{margin-bottom:0}.tui-editor-contents code,.tui-editor-contents pre{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;border:0;border-radius:0}.tui-editor-contents pre{margin:2px 0 8px;padding:18px;background-color:#f5f7f8}.tui-editor-contents code{color:#c1788b;padding:4px 4px 2px 0;letter-spacing:-.3px}.tui-editor-contents pre code{padding:0;color:inherit;white-space:pre-wrap;background-color:transparent}.tui-editor-contents pre.addon{border:1px solid #e8ebed;background-color:#fff}.tui-editor-contents img{margin:4px 0 10px;box-sizing:border-box;vertical-align:top;max-width:100%}.tui-editor-contents table{margin:2px 0 14px;color:#555;width:auto;border-collapse:collapse;box-sizing:border-box}.tui-editor-contents table td,.tui-editor-contents table th{height:32px;padding:5px 14px 5px 12px}.tui-editor-contents table td{border:1px solid #eaeaea}.tui-editor-contents table th{border:1px solid #72777b;border-top:0;background-color:#7b8184;font-weight:300;color:#fff;padding-top:6px}.tui-editor-contents dir,.tui-editor-contents menu,.tui-editor-contents ol,.tui-editor-contents ul{display:block;list-style-type:disc;padding-left:17px;margin:6px 0 10px;color:#555}.tui-editor-contents ol{list-style-type:decimal}.tui-editor-contents ol ol,.tui-editor-contents ol ul,.tui-editor-contents ul ol,.tui-editor-contents ul ul{margin-top:0!important;margin-bottom:0!important}.tui-editor-contents ol li,.tui-editor-contents ul li{position:relative}.tui-editor-contents ul p,ol p{margin:0}.tui-editor-contents ol li.task-list-item:before,.tui-editor-contents pre ul li:before,.tui-editor-contents ul li.task-list-item:before{content:""}.tui-editor-contents hr{border-top:1px solid #eee;margin:16px 0}.tui-editor-contents a{color:#5286bc}.tui-editor-contents a:hover{color:#007cff}.tui-editor-contents{font-size:13px;margin:0;padding:0}.tui-editor-contents .task-list-item{border:0;list-style:none;padding-left:22px;margin-left:-22px}.tui-editor-contents .task-list-item:before{background-repeat:no-repeat;background-size:16px 16px;background-position:center;content:"";height:18px;width:18px;position:absolute;left:0;top:1px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item.checked:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item .task-list-item-checkbox,.tui-editor-contents .task-list-item input[type=checkbox]{margin-left:-17px;margin-right:3.8px;margin-top:3px}.tui-editor-contents-placeholder:before{content:attr(data-placeholder);color:grey;line-height:160%;position:absolute}.auto-height,.auto-height .tui-editor-defaultUI{height:auto}.auto-height .tui-editor{position:relative}:not(.auto-height)>.tui-editor-defaultUI,:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{-ms-flex:1;flex:1}.tui-editor-defaultUI-toolbar:after,.tui-editor:after{content:"";display:block;height:0;clear:both}.tui-editor{position:absolute;line-height:1;color:#181818;width:100%;height:inherit}.te-editor-section{min-height:0;position:relative;height:inherit}.te-md-container{display:none;overflow:hidden;height:100%}.te-md-container .te-editor{line-height:1.5}.te-md-container .te-editor,.te-md-container .te-preview{box-sizing:border-box;padding:0;height:inherit}.te-md-container .CodeMirror{font-size:13px;height:inherit}.te-md-container .te-preview{overflow:auto;padding:0 25px;height:100%}.te-md-container .te-preview>p:first-child{margin-top:0!important}.te-md-container .te-preview .tui-editor-contents{padding-top:11px}.tui-editor .te-preview-style-tab>.te-editor,.tui-editor .te-preview-style-tab>.te-preview{float:left;width:100%;display:none}.tui-editor .te-preview-style-tab>.te-tab-active{display:block}.tui-editor .te-preview-style-vertical>.te-tab-section{display:none}.tui-editor .te-preview-style-tab>.te-tab-section{display:block}.tui-editor .te-preview-style-vertical .te-editor,.tui-editor .te-preview-style-vertical .te-preview{float:left;width:50%}.tui-editor .te-md-splitter{display:none;position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #e5e5e5}.tui-editor .te-preview-style-vertical .te-md-splitter{display:block}.te-ww-container{display:none;overflow:hidden;z-index:10;height:inherit;background-color:#fff}.te-ww-container>.te-editor{overflow:auto;height:inherit}.te-ww-container .tui-editor-contents:focus{outline:0}.te-ww-container .tui-editor-contents{padding:0 25px}.te-ww-container .tui-editor-contents:first-child{box-sizing:border-box;margin:0;padding:16px 25px 0;height:inherit}.te-ww-container .tui-editor-contents:last-child{margin-bottom:16px}.te-md-mode .te-md-container,.te-ww-mode .te-ww-container{display:block;z-index:100}.tui-editor-defaultUI.te-hide,.tui-editor.te-hide{display:none}.tui-editor-defaultUI .CodeMirror-lines{padding-top:13px;padding-bottom:13px}.tui-editor-defaultUI .CodeMirror-line{padding-left:25px;padding-right:25px}.tui-editor-defaultUI .CodeMirror pre.CodeMirror-placeholder{padding-left:25px;color:grey}.tui-editor-defaultUI .CodeMirror-scroll{cursor:text}.tui-editor-contents td.te-cell-selected{background-color:#d8dfec}.tui-editor-contents td.te-cell-selected::selection{background-color:#d8dfec}.tui-editor-contents th.te-cell-selected{background-color:#908f8f}.tui-editor-contents th.te-cell-selected::selection{background-color:#908f8f}.tui-editor-defaultUI{position:relative;border:1px solid #e5e5e5;height:100%}.tui-editor-defaultUI button{color:#fff;padding:0 14px 0 15px;height:28px;font-size:12px;border:none;cursor:pointer;outline:0}.tui-editor-defaultUI button.te-ok-button{background-color:#4b96e6}.tui-editor-defaultUI button.te-close-button{background-color:#777}.tui-editor-defaultUI-toolbar{padding:0 25px;height:31px;background-color:#fff;border:0;overflow:hidden}.tui-toolbar-divider{float:left;display:inline-block;width:1px;height:14px;background-color:#ddd;margin:9px 6px}.tui-toolbar-button-group{height:28px;border-right:1px solid #d9d9d9;float:left}.te-toolbar-section{height:32px;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.tui-editor-defaultUI-toolbar button{float:left;box-sizing:border-box;outline:0;cursor:pointer;background-color:#fff;width:22px;height:22px;padding:3px;border-radius:0;margin:5px 3px;border:1px solid #fff}.tui-editor-defaultUI-toolbar button.active,.tui-editor-defaultUI-toolbar button:active,.tui-editor-defaultUI-toolbar button:hover{border:1px solid #aaa;background-color:#fff}.tui-editor-defaultUI-toolbar button:first-child{margin-left:0}.tui-editor-defaultUI-toolbar button:last-child{margin-right:0}.tui-editor-defaultUI-toolbar button.tui-scrollsync{width:auto;color:#777;border:0}.tui-editor-defaultUI button.tui-scrollsync:after{content:"Scroll off"}.tui-editor-defaultUI button.tui-scrollsync.active{color:#125de6;font-weight:700}.tui-editor-defaultUI button.tui-scrollsync.active:after{content:"Scroll on"}.tui-editor-defaultUI .te-mode-switch-section{background-color:#f9f9f9;border-top:1px solid #e5e5e5;height:20px;font-size:12px}.tui-editor-defaultUI .te-mode-switch{float:right;height:100%}.tui-editor-defaultUI .te-switch-button{width:92px;height:inherit;background:#e5e5e5;outline:0;color:#a0aabf;cursor:pointer;border:0;border-left:1px solid #ddd;border-right:1px solid #ddd}.tui-editor-defaultUI .te-switch-button.active{background-color:#fff;color:#000}.tui-editor-defaultUI .te-markdown-tab-section{float:left;height:31px;background:#fff}.te-markdown-tab-section .te-tab{margin:0 -7px 0 24px;background:#fff}.tui-editor-defaultUI .te-tab button{box-sizing:border-box;line-height:100%;position:relative;cursor:pointer;z-index:1;font-size:13px;background-color:#f9f9f9;border:1px solid #e5e5e5;border-top:0;padding:0 9px;color:#777;border-radius:0;outline:0}.te-markdown-tab-section .te-tab button:last-child{margin-left:-1px}.te-markdown-tab-section .te-tab button.te-tab-active,.te-markdown-tab-section .te-tab button:hover.te-tab-active{background-color:#fff;color:#333;border-bottom:1px solid #fff;z-index:2}.te-markdown-tab-section .te-tab button:hover{background-color:#fff;color:#333}.tui-popup-modal-background{background-color:rgba(202,202,202,.6);position:fixed;margin:0;left:0;top:0;width:100%;height:100%;z-index:9999}.tui-popup-modal-background.fit-window .tui-popup-wrapper,.tui-popup-wrapper.fit-window{width:100%;height:100%}.tui-popup-wrapper{width:500px;margin-right:auto;border:1px solid #cacaca;background:#fff;z-index:9999}.tui-popup-modal-background .tui-popup-wrapper{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0}.tui-popup-header{padding:10px;height:auto;line-height:normal;position:relative;border-bottom:1px solid #cacaca}.tui-popup-header .tui-popup-header-buttons{float:right}.tui-popup-header .tui-popup-header-buttons button{padding:0;background-color:transparent;background-size:cover;float:left}.tui-popup-header .tui-popup-close-button{margin:3px;width:13px;height:13px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMHB4IiBoZWlnaHQ9IjEwcHgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5GMjc2Qzc4MC0zM0JBLTQ3MTItQTM3OC04RkQwQUNDOTFDRTk8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImxuYi1mb2xkZXItZGVsIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM3Nzc3NzciPiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LDMuNTg1Nzg2NDQgTDEuNzA3MTA2NzgsMC4yOTI4OTMyMTkgTDAuMjkyODkzMjE5LDEuNzA3MTA2NzggTDMuNTg1Nzg2NDQsNSBMMC4yOTI4OTMyMTksOC4yOTI4OTMyMiBMMS43MDcxMDY3OCw5LjcwNzEwNjc4IEw1LDYuNDE0MjEzNTYgTDguMjkyODkzMjIsOS43MDcxMDY3OCBMOS43MDcxMDY3OCw4LjI5Mjg5MzIyIEw2LjQxNDIxMzU2LDUgTDkuNzA3MTA2NzgsMS43MDcxMDY3OCBMOC4yOTI4OTMyMiwwLjI5Mjg5MzIxOSBMNSwzLjU4NTc4NjQ0IFoiIGlkPSJDb21iaW5lZC1TaGFwZSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-header .tui-popup-title{font-size:13px;font-weight:700;color:#333;vertical-align:bottom}.tui-popup-body{padding:15px;font-size:12px}.tui-editor-popup{position:absolute;top:30px;left:50%;margin-left:-250px}.tui-editor-popup.tui-popup-modal-background{position:fixed;top:0;left:0;margin:0}.tui-editor-popup .tui-popup-body label{font-weight:700;color:#666;display:block;margin:10px 0 5px}.tui-editor-popup .tui-popup-body .te-button-section{margin-top:15px}.tui-editor-popup .tui-popup-body input[type=file],.tui-editor-popup .tui-popup-body input[type=text]{padding:4px 10px;border:1px solid #bfbfbf;box-sizing:border-box;width:100%}.tui-editor-popup .tui-popup-body input.wrong{border-color:red}.te-popup-add-link .tui-popup-wrapper{height:219px}.te-popup-add-image .tui-popup-wrapper{height:243px}.te-popup-add-image .te-tab{display:block;background:0 0;border-bottom:1px solid #ebebeb;margin-bottom:8px}.te-dropdown-toolbar .tui-toolbar-divider,.te-popup-add-image .te-file-type,.te-popup-add-image .te-url-type,.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-toggle-slider{display:none}.te-popup-add-image div.te-tab-active,.te-popup-add-image form.te-tab-active{display:block}.te-popup-add-image .te-tab button{border:1px solid #ccc;background:#eee;min-width:100px;margin-left:-1px;border-bottom:0;border-radius:3px 3px 0 0}.te-popup-add-image .te-tab button.te-tab-active{background:#fff}.te-popup-add-table .te-table-selection{position:relative}.te-popup-add-table .te-table-body{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZmspKREMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgAMSwQgckFvTgAAAABJRU5ErkJggg==)}.te-popup-add-table .te-table-header{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZksLCxMMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgDxKwPzTeWPdAAAAABJRU5ErkJggg==)}.te-popup-add-table .te-selection-area{position:absolute;top:0;left:0;background:#80d2ff;opacity:.3;z-index:999}.te-popup-add-table .te-description{margin:10px 0 0;text-align:center}.te-popup-table-utils{width:120px}.te-popup-table-utils .tui-popup-body{padding:0}.te-popup-table-utils button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:28px;text-align:left;color:#777}.fa-inverse,.mi-inverse,.tui-tooltip{color:#fff}.te-popup-table-utils button:hover{background-color:#f4f4f4}.te-popup-table-utils hr{background-color:#cacaca;border-style:none;height:1px}.te-heading-add{width:auto}.te-heading-add .tui-popup-body{padding:0}.te-heading-add h1,.te-heading-add h2,.te-heading-add h3,.te-heading-add h4,.te-heading-add h5,.te-heading-add h6,.te-heading-add p,.te-heading-add ul{padding:0;margin:0}.te-heading-add ul{list-style:none}.te-heading-add ul li{padding:2px 10px;cursor:pointer}.te-dropdown-toolbar .tui-popup-body,.tui-popup-color{padding:0}.te-heading-add ul li:hover{background-color:#eee}.te-heading-add h1{font-size:24px}.te-heading-add h2{font-size:22px}.te-heading-add h3{font-size:20px}.te-heading-add h4{font-size:18px}.te-heading-add h5{font-size:16px}.te-heading-add h6{font-size:14px}.te-dropdown-toolbar{position:absolute;width:auto}.tui-popup-color .tui-colorpicker-container,.tui-popup-color .tui-colorpicker-palette-container{width:144px}.tui-popup-color .tui-colorpicker-container ul{width:144px;margin-bottom:8px}.tui-popup-color .tui-colorpicker-container li{padding:0 1px 1px 0}.tui-popup-color .tui-colorpicker-container li .tui-colorpicker-palette-button{border:0;width:17px;height:17px}.tui-popup-color .tui-popup-body{padding:10px}.tui-popup-color .te-apply-button,.tui-popup-color .tui-colorpicker-palette-hex{float:right}.tui-popup-color .te-apply-button{height:21px;width:35px;background:#fff;border:1px solid #efefef;position:absolute;bottom:141px;right:10px}.tui-tooltip,.tui-tooltip .arrow{background-color:#222;position:absolute}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-hex{border:1px solid #E1E1E1;padding:3px 14px;margin-left:-1px}.tui-popup-color .tui-colorpicker-container div.tui-colorpicker-clearfix{display:inline-block}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-preview{width:19px;height:19px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-slider-right{width:22px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-huebar-handle{display:none}.tui-tooltip{z-index:999;opacity:.8;padding:2px 5px;font-size:10px}.tui-tooltip .arrow{content:"";display:inline-block;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:6px;z-index:-1}.tui-toolbar-icons{background:url(tui-editor.png);background-size:218px 188px;display:inline-block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.tui-toolbar-icons{background:url(tui-editor-2x.png);background-size:218px 188px;display:inline-block}}.tui-toolbar-icons.tui-heading{background-position:-172px -48px}.tui-toolbar-icons.tui-heading:disabled{background-position:-193px -48px}.tui-toolbar-icons.tui-bold{background-position:-4px -4px}.tui-toolbar-icons.tui-bold:disabled{background-position:-25px -4px}.tui-toolbar-icons.tui-italic{background-position:-4px -48px}.tui-toolbar-icons.tui-italic:disabled{background-position:-25px -48px}.tui-toolbar-icons.tui-color{background-position:-172px -70px}.tui-toolbar-icons.tui-color:disabled{background-position:-193px -70px}.tui-toolbar-icons.tui-strike{background-position:-4px -26px}.tui-toolbar-icons.tui-strike:disabled{background-position:-25px -26px}.tui-toolbar-icons.tui-hrline{background-position:-46px -92px}.tui-toolbar-icons.tui-hrline:disabled{background-position:-67px -92px}.tui-toolbar-icons.tui-quote{background-position:-4px -114px}.tui-toolbar-icons.tui-quote:disabled{background-position:-25px -114px}.tui-toolbar-icons.tui-ul{background-position:-46px -4px}.tui-toolbar-icons.tui-ul:disabled{background-position:-67px -4px}.tui-toolbar-icons.tui-ol{background-position:-46px -26px}.tui-toolbar-icons.tui-ol:disabled{background-position:-67px -26px}.tui-toolbar-icons.tui-task{background-position:-130px -48px}.tui-toolbar-icons.tui-task:disabled{background-position:-151px -48px}.tui-toolbar-icons.tui-indent{background-position:-46px -48px}.tui-toolbar-icons.tui-indent:disabled{background-position:-67px -48px}.tui-toolbar-icons.tui-outdent{background-position:-46px -70px}.tui-toolbar-icons.tui-outdent:disabled{background-position:-67px -70px}.tui-toolbar-icons.tui-table{background-position:-88px -92px}.tui-toolbar-icons.tui-table:disabled{background-position:-109px -92px}.tui-toolbar-icons.tui-image{background-position:-130px -4px}.tui-toolbar-icons.tui-image:disabled{background-position:-151px -4px}.tui-toolbar-icons.tui-link{background-position:-130px -26px}.tui-toolbar-icons.tui-link:disabled{background-position:-151px -26px}.tui-toolbar-icons.tui-code{background-position:-130px -92px}.tui-toolbar-icons.tui-code:disabled{background-position:-151px -92px}.tui-toolbar-icons.tui-codeblock{background-position:-130px -70px}.tui-toolbar-icons.tui-codeblock:disabled{background-position:-151px -70px}.tui-toolbar-icons.tui-more{background-position:-172px -92px}.tui-toolbar-icons.tui-more:disabled{background-position:-193px -92px}.tui-colorpicker-svg-huebar,.tui-colorpicker-svg-slider,.tui-colorpicker-vml-slider{border:1px solid #ebebeb}.CodeMirror-sizer{margin-top:6px}.CodeMirror .cm-header{font-weight:700;color:inherit}.CodeMirror .cm-header-1{font-size:24px}.CodeMirror .cm-header-2{font-size:22px}.CodeMirror .cm-header-3{font-size:20px}.CodeMirror .cm-header-4{font-size:18px}.CodeMirror .cm-header-5{font-size:16px}.CodeMirror .cm-header-6{font-size:14px}.CodeMirror .cm-variable-2{color:inherit}.tui-editor-pseudo-clipboard{position:fixed;left:-1000px;top:-1000px;width:100px;height:100px}.te-ww-block-overlay.code-block-header{text-align:right}.te-ww-block-overlay.code-block-header span{font-size:10px;font-weight:600;padding:0 10px;color:#333;cursor:default}.te-ww-block-overlay.code-block-header button{margin:8px;font-size:10px;color:#333;background-color:#f9f9f9;border:1px solid #ddd;padding:4px;height:auto}.te-popup-code-block-languages{position:fixed;box-sizing:border-box;width:130px}.te-popup-code-block-languages .tui-popup-body{max-height:169px;overflow:auto;padding:0}.te-popup-code-block-languages button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:24px;text-align:left;color:#777}.te-popup-code-block-languages button.active{background-color:#f4f4f4}.tui-popup-code-block-editor .tui-popup-wrapper{width:70%;height:70%;margin:auto;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.te-input-language{position:relative;margin-left:15px;cursor:pointer}.te-input-language input{font-size:10px;padding:3px 5px;border:1px solid #ddd;background-color:#f9f9f9;box-sizing:border-box;width:130px;outline:0}.te-input-language input::-ms-clear{display:none}.te-input-language::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT42Q0NBRDk2QS0yMjYxLTRFNDAtOTk1RC1DRUUyQUREQUQ3NkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLWQtc2lkZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS03IiBwb2ludHM9IjIgNSAxMCA1IDYgMTAiPjwvcG9seWdvbj4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);position:absolute;top:1px;right:3px}.te-input-language.active::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BNEZDRkIzMy0zNjdBLTREMjAtOEEyNC1DQ0I2ODFBMDZDODg8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLXVwLXNpZGUiIGZpbGw9IiM1NTU1NTUiPiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJSZWN0YW5nbGUtNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC02LjAwMDAwMCwgLTYuNTAwMDAwKSAiIHBvaW50cz0iMiA0IDEwIDQgNiA5Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor button{margin:-1px 3px}.tui-popup-code-block-editor .tui-popup-header-buttons{height:20px}.tui-popup-code-block-editor .popup-editor-toggle-preview::after{content:'Preview off';color:#777;margin-right:22px}.tui-popup-code-block-editor .popup-editor-toggle-preview.active::after{content:'Preview on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-scroll::after{content:'Scroll off';color:#777;margin-right:16px}.tui-popup-code-block-editor .popup-editor-toggle-scroll.active::after{content:'Scroll on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-fit{width:18px;height:18px;margin-top:4px;margin-right:14px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT40OUQ4RTYyMy1GRTAyLTQ1RUUtQkQ5Ri0xMjUyQjEzRTU1MkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLWV4cGFuZCIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBhdGggZD0iTTMsMyBMOSwzIEw5LDUgTDUsNSBMNSw5IEwzLDkgTDMsMyBaIE0xNSwxNSBMOSwxNSBMOSwxMyBMMTMsMTMgTDEzLDkgTDE1LDkgTDE1LDE1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC05LjAwMDAwMCwgLTkuMDAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZSIgZmlsbC1ydWxlPSJub256ZXJvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS41MDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMS41MDAwMDAsIC02LjUwMDAwMCkgIiBwb2ludHM9IjkuMDg1Nzg2NDQgNS41IDEyLjUgOC45MTQyMTM1NiAxMy45MTQyMTM2IDcuNSAxMC41IDQuMDg1Nzg2NDQiPjwvcG9seWdvbj4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZS1Db3B5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuNTAwMDAwLCAxMS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTYuNTAwMDAwLCAtMTEuNTAwMDAwKSAiIHBvaW50cz0iNC4wODU3ODY0NCAxMC41IDcuNSAxMy45MTQyMTM2IDguOTE0MjEzNTYgMTIuNSA1LjUgOS4wODU3ODY0NCI+PC9wb2x5Z29uPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-code-block-editor .popup-editor-toggle-fit.active{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT4wN0Q1MjlCRi1GNTIzLTREN0EtQTlGNi05NTUzNTU5RDNEMUE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLXJlZHVjZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDEyLjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNS41MDAwMDAsIC0xMi41MDAwMDApICIgcG9pbnRzPSIzLjA4NTc4NjQ0IDExLjUgNi41IDE0LjkxNDIxMzYgNy45MTQyMTM1NiAxMy41IDQuNSAxMC4wODU3ODY0Ij48L3BvbHlnb24+ICAgICAgICAgICAgPHBhdGggZD0iTTksOSBMMTUsOSBMMTUsMTEgTDExLDExIEwxMSwxNSBMOSwxNSBMOSw5IFogTTksOSBMMyw5IEwzLDcgTDcsNyBMNywzIEw5LDMgTDksOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCA5LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOS4wMDAwMDAsIC05LjAwMDAwMCkgIj48L3BhdGg+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzMiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNTAwMDAwLCA1LjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTIuNTAwMDAwLCAtNS41MDAwMDApICIgcG9pbnRzPSIxNC45MTQyMTM2IDYuNSAxMS41IDMuMDg1Nzg2NDQgMTAuMDg1Nzg2NCA0LjUgMTMuNSA3LjkxNDIxMzU2Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor .tui-popup-close-button{margin-top:6px}.tui-popup-code-block-editor .tui-popup-body{z-index:-1;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1;flex:1}.tui-split-scroll.single-content .tui-split-content-right,.tui-split-scroll.single-content .tui-splitter,.tui-split-scroll.single-content button.tui-scrollsync{display:none}.tui-popup-code-block-editor .popup-editor-body{position:relative;-ms-flex:1;flex:1;border-bottom:1px solid #cacaca}.tui-popup-code-block-editor .te-button-section{padding:15px}.tui-popup-code-block-editor .te-button-section button{float:left}.tui-popup-code-block-editor .tui-editor-contents pre{margin:0;background-color:transparent}.tui-popup-code-block-editor .CodeMirror{height:auto}.tui-popup-code-block-editor .CodeMirror-line{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;font-size:13px;line-height:160%;letter-spacing:-.3px}.tui-popup-code-block-editor .popup-editor-editor-wrapper{min-height:100%}.tui-split-scroll-wrapper{position:relative}.tui-split-scroll{position:absolute}.tui-split-scroll,.tui-split-scroll-wrapper{width:100%;height:100%}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{position:absolute;top:0;width:50%;box-sizing:border-box}.tui-split-scroll .tui-split-content-left{left:0}.tui-split-scroll .tui-split-content-right{left:50%}.tui-split-scroll .tui-splitter{position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #cacaca}.tui-split-scroll .tui-split-scroll-content{width:100%;height:100%;overflow:hidden;position:relative}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{height:100%;overflow-x:hidden;overflow-y:auto}.tui-split-scroll button.tui-scrollsync{top:10px;opacity:.2}.tui-split-scroll button.tui-scrollsync::after{content:"scroll off"}.tui-split-scroll.scroll-sync button.tui-scrollsync{opacity:.5}.tui-split-scroll.scroll-sync .tui-split-content-left,.tui-split-scroll.scroll-sync .tui-split-content-right{height:auto;overflow:initial}.tui-split-scroll.scroll-sync button.tui-scrollsync::after{content:"scroll on"}.tui-split-scroll.scroll-sync .tui-split-scroll-content{overflow-y:auto}.tui-split-scroll.single-content .tui-split-content-left{width:100%}.fa,.fa-stack,.fab,.fad,.fal,.far,.fas,.mi,.mi-stack{display:inline-block}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@supports (-ms-accelerator:true){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@media screen and (max-width:480px){.tui-popup-wrapper{max-width:300px}.tui-editor-popup{margin-left:-150px}.te-dropdown-toolbar{max-width:none}}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x,.fa-stack-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{margin-left:2.5em}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-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,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{height:2em;line-height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.mi-stack,.mi-ul>li{position:relative}.fa-stack-1x{line-height:inherit}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}/*! diff --git a/src/applications/mixcore/wwwroot/mix-app/css/portal.min.css b/src/applications/mixcore/wwwroot/mix-app/css/portal.min.css index ce6abe130..3ea216b20 100644 --- a/src/applications/mixcore/wwwroot/mix-app/css/portal.min.css +++ b/src/applications/mixcore/wwwroot/mix-app/css/portal.min.css @@ -1,9 +1,9 @@ -/* Sun Feb 04 2024 23:41:10 GMT+0700 (Indochina Time) */@charset "UTF-8";/*! +/* Sun Jun 25 2023 15:07:09 GMT+0700 (Indochina Time) */@charset "UTF-8";/*! * Bootstrap v5.0.2 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */.popover,.tooltip,body{font-family:var(--bs-font-sans-serif);font-weight:400;line-height:1.5}.btn,.btn-link,.dropdown-item,.form-control,.form-select,.input-group-text,.popover,.tooltip,body{font-weight:400}.btn,.col-form-label,.form-control,.form-control-plaintext,.form-select,.input-group-text,.modal-title,.offcanvas-title,.popover,.tooltip,body{line-height:1.5}.table,body{color:#212529}.CodeMirror pre,body{-webkit-tap-highlight-color:transparent}.popover,.tooltip,address{font-style:normal}.btn-link,a{text-decoration:underline}.CodeMirror-wrap pre,.popover,.tooltip,pre code{word-break:normal}.card,.popover,.toast-body,.tooltip,code{word-wrap:break-word}.btn,.btn-group,.btn-group-vertical,.navbar-toggler-icon,img,svg{vertical-align:middle}.CodeMirror pre,select{word-wrap:normal}label,output{display:inline-block}progress,sub,sup{vertical-align:baseline}:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-size:1rem;background-color:#fff;-webkit-text-size-adjust:100%}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}address,dl,ol,p,pre,ul{margin-bottom:1rem}blockquote,figure{margin:0 0 1rem}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}dl,ol,p,ul{margin-top:0}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.alertify .ajs-commands button,.btn,.carousel-indicators [data-bs-target],.form-control-color:not(:disabled):not([readonly]),.form-control[type=file]:not(:disabled):not([readonly]),[role=button],[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled),summary{cursor:pointer}address{line-height:inherit}ol,ul{padding-left:2rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit}code,kbd{font-size:.875em}code{color:#d63384}a>code{color:inherit}kbd{padding:.2rem .4rem;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}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}button{border-radius:0}fieldset,iframe{border: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}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin: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}.display-1,.display-2,.display-3,.display-4,.display-5,.display-6{line-height:1.2;font-weight:300}.form-control,.form-select{-webkit-appearance:none;-moz-appearance:none}summary{display:list-item}[hidden]{display:none!important}.btn,.figure,.form-check-inline,.list-inline-item{display:inline-block}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw)}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw)}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw)}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw)}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw)}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-inline,.list-unstyled{padding-left:0;list-style:none}.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-footer,.figure-caption{font-size:.875em;color:#6c757d}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem}.blockquote-footer::before{content:"— "}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure-img{margin-bottom:.5rem;line-height:1}.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}}.custom-file-img,.invalid-tooltip,.offcanvas,.row>*,.toast,.toast-container,.trumbowyg-editor embed,.trumbowyg-editor img,.trumbowyg-editor object,.trumbowyg-editor video,.valid-tooltip{max-width:100%}.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%;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%}@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%}}@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%}}@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%}}@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%}}@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-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2,.col-3{flex:0 0 auto}.col-2{width:16.66666667%}.col-3{width:25%}.col-4,.col-5{flex:0 0 auto}.col-4{width:33.33333333%}.col-5{width:41.66666667%}.col-6,.col-7{flex:0 0 auto}.col-6{width:50%}.col-7{width:58.33333333%}.col-8,.col-9{flex:0 0 auto}.col-8{width:66.66666667%}.col-9{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-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-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-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-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-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;vertical-align:top;border-color:#dee2e6}.card-title,.form-label{margin-bottom:.5rem}.table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.form-check-input:focus,.form-control:focus,.form-select:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.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}.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}}.collapsing,.dropdown-divider,.form-control[type=file],.progress,.progress-bar{overflow:hidden}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit}.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,.form-control:focus{color:#212529;background-color:#fff}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;background-clip:padding-box;border:1px solid #ced4da;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}}.btn,.form-control::file-selector-button{transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control:focus{border-color:#86b7fe}.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}@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;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{max-width:3rem;height:auto;padding:.375rem}.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(.75rem - 3px);font-size:1rem;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;appearance:none}.form-check-input,.form-range{-webkit-appearance:none;-moz-appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe}.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);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}.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{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;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}.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;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.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.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>: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}.invalid-tooltip,.valid-tooltip{margin-top:.1rem;position:absolute}.valid-tooltip{top:100%;z-index:5;display:none;padding:.25rem .5rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.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,.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}.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: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{top:100%;z-index:5;display:none;padding:.25rem .5rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.accordion-button:hover,.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}.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}.btn,.btn:hover{color:#212529}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.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{text-align:center;text-decoration:none;-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}.dropdown-toggle::after,.dropup .dropdown-toggle::after{vertical-align:.255em;content:""}@media (prefers-reduced-motion:reduce){.btn,.form-floating>label{transition:none}}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-check:focus+.btn-primary,.btn-primary.active:focus,.btn-primary:active:focus,.btn-primary:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-primary,.btn-primary:focus,.btn-primary:hover{background-color:#0b5ed7;border-color:#0a58ca;color:#fff}.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-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-check:focus+.btn-secondary,.btn-secondary.active:focus,.btn-secondary:active:focus,.btn-secondary:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.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-check:focus+.btn-secondary,.btn-secondary:focus,.btn-secondary:hover{background-color:#5c636a;border-color:#565e64;color:#fff}.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-success:focus,.btn-check:checked+.btn-success:focus,.btn-check:focus+.btn-success,.btn-success.active:focus,.btn-success:active:focus,.btn-success:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.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-check:focus+.btn-success,.btn-success:focus,.btn-success:hover{background-color:#157347;border-color:#146c43;color:#fff}.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-info:focus,.btn-check:checked+.btn-info:focus,.btn-check:focus+.btn-info,.btn-info.active:focus,.btn-info:active:focus,.btn-info:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.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-check:focus+.btn-info,.btn-info:focus,.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.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-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-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-check:focus+.btn-danger,.btn-danger.active:focus,.btn-danger:active:focus,.btn-danger:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.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-check:focus+.btn-danger,.btn-danger:focus,.btn-danger:hover{background-color:#bb2d3b;border-color:#b02a37;color:#fff}.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-light:focus,.btn-check:checked+.btn-light:focus,.btn-check:focus+.btn-light,.btn-light.active:focus,.btn-light:active:focus,.btn-light:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.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-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-check:focus+.btn-light,.btn-light.active,.btn-light:active,.btn-light:focus,.btn-light:hover,.show>.btn-light.dropdown-toggle{background-color:#f9fafb;border-color:#f9fafb;color:#000}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-check:focus+.btn-dark,.btn-dark.active:focus,.btn-dark:active:focus,.btn-dark:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.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-check:focus+.btn-dark,.btn-dark:focus,.btn-dark:hover{background-color:#1c1f23;border-color:#1a1e21;color:#fff}.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-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-check:focus+.btn-outline-primary,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.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,.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.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,.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-check:focus+.btn-outline-success,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.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,.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-check:focus+.btn-outline-info,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.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,.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-check:focus+.btn-outline-warning,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.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,.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-check:focus+.btn-outline-danger,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.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,.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-check:focus+.btn-outline-light,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.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,.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-check:focus+.btn-outline-dark,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.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,.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{color:#0d6efd}.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;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;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;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;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid;vertical-align:0}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent;vertical-align:0}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropdown-divider{height:0;margin:.5rem 0;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-menu-dark,.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.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}.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-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.card>hr,.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.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}.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-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}.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}.card,.navbar-nav{flex-direction:column}.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;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;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}}@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}}@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}}@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}}@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{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.accordion-button,.alert,.btn .badge,.card,.list-group-item,.modal-content,.modal-dialog,.page-link{position:relative}.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-light .navbar-brand,.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,.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{display:flex;min-width:0;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right: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}.card-footer,.card-header{padding:.5rem 1rem;background-color:rgba(0,0,0,.03)}.accordion-header,.card-header,.card-subtitle,.card-text:last-child{margin-bottom:0}.card-subtitle{margin-top:-.25rem}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header-pills,.card-header-tabs{margin-right:-.5rem;margin-left:-.5rem}.card-header{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{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-bottom:-.5rem;border-bottom:0}.card-group>.card,.toast-container>:not(:last-child){margin-bottom:.75rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.accordion-body,.accordion-button{padding:1rem 1.25rem}.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)}@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{display:flex;align-items:center;width:100%;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:focus,.btn-close:focus,.page-link:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.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:focus{z-index:3;border-color:#86b7fe}.alert,.breadcrumb{margin-bottom:1rem}.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-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;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{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;padding:.375rem .75rem}.page-link:focus,.page-link:hover{color:#0a58ca;background-color:#e9ecef}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;border-color:#dee2e6}.page-link:focus{z-index:3}.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-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-sm .page-link,.popover,.toast,.tooltip{font-size:.875rem}.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}.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,.toast.hide{display:none}.btn .badge{top:-1px}.alert{padding:1rem;border:1px solid transparent;border-radius:.25rem}.list-group,.progress{display:flex;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{height:1rem;font-size:.75rem;background-color:#e9ecef}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}.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{transition:none}.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{flex-direction:column;padding-left:0;margin-bottom:0}.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{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;color:#000;background: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}.carousel-indicators [data-bs-target],.modal-content,.offcanvas,.popover,.toast,.toast-header{background-clip:padding-box}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.modal-backdrop.fade,.toast:not(.showing):not(.show){opacity:0}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;pointer-events:auto;background-color:rgba(255,255,255,.85);border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;pointer-events:none}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);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}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{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,.modal-fullscreen .modal-body,.offcanvas-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding: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;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0}.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-footer,.modal-fullscreen .modal-header{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-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-spacing:normal;white-space:normal;line-break:auto;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;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-spacing:normal;white-space:normal;line-break:auto;background-color:#fff;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;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;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}.carousel,.carousel-inner,.carousel-item{position:relative}.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}.offcanvas-top,.popover-header{border-bottom:1px solid rgba(0,0,0,.2)}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem;color:#212529}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{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;background-color:#fff;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}.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}.CodeMirror,.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor,.carousel-dark .carousel-caption{color:#000}.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}@-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}.offcanvas-bottom,.offcanvas-top{right:0;left:0;height:30vh;max-height:100%}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;visibility:hidden;background-color:#fff;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem}.offcanvas-header .btn-close{padding:.5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0}.offcanvas-body{flex-grow:1;padding:1rem}.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;transform:translateY(-100%)}.offcanvas-bottom{border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.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%}.fixed-bottom,.fixed-top{position:fixed;z-index:1030;right:0;left:0}.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{top:0}.fixed-bottom{bottom:0}.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}}.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:""}.alertify .ajs-dialog.ajs-capture:before,.cm-tab-wrap-hack:after{content:''}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.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}.ms-0,.sw-search{margin-left:0!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-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{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body,.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.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-end,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-end{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-start{border-bottom-left-radius:.25rem!important}.rounded-start,.rounded-top{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}.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 (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 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}}.alertify .ajs-dimmer{position:fixed;z-index:1981;top:0;right:0;bottom:0;left:0;padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{position:fixed;top:0;right:0;left:0;bottom:0;padding:0;overflow-y:auto;z-index:1981}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button,.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;right:0;bottom:0;left:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593d2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;right:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center center;background-color:rgba(0,0,0,.5);border-top-right-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0}.alertify-notifier.ajs-center{left:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{left:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0}.ajs-no-transition.alertify .ajs-dialog,.ajs-no-transition.alertify .ajs-dimmer,.ajs-no-transition.alertify .ajs-modal,.ajs-no-transition.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}@media (prefers-reduced-motion:reduce){.alertify .ajs-dialog,.alertify .ajs-dimmer,.alertify .ajs-modal,.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}}#trumbowyg-icons,#trumbowyg-icons svg{height:0;width:0}#trumbowyg-icons{overflow:hidden;visibility:hidden}.trumbowyg-box *,.trumbowyg-box ::after,.trumbowyg-box ::before,.trumbowyg-modal *,.trumbowyg-modal ::after,.trumbowyg-modal ::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,.trumbowyg-editor,.trumbowyg-textarea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.trumbowyg-box svg,.trumbowyg-modal svg{width:17px;height:100%;fill:#222}.trumbowyg-box,.trumbowyg-editor{display:block;position:relative;border:1px solid #DDD;width:100%;min-height:300px}.trumbowyg-box .trumbowyg-editor{margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#FEFEFE;border:none!important}.trumbowyg-editor,.trumbowyg-textarea{position:relative;box-sizing:border-box;padding:20px;min-height:300px;width:100%;border-style:none;resize:none;outline:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.trumbowyg-editor.trumbowyg-autogrow-on-enter,.trumbowyg-textarea.trumbowyg-autogrow-on-enter{-webkit-transition:height .3s ease-out;-o-transition:height .3s ease-out;transition:height .3s ease-out}.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:transparent!important;text-shadow:0 0 7px #333}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}.trumbowyg-box-blur .trumbowyg-editor hr,.trumbowyg-box-blur .trumbowyg-editor img{opacity:.2}.trumbowyg-textarea{position:relative;display:block;overflow:auto;border:none;font-size:14px;font-family:Inconsolata,Consolas,Courier,"Courier New",sans-serif;line-height:18px}.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea{height:1px!important;width:25%;min-height:0!important;padding:0!important;background:0 0;opacity:0!important}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea{display:block;margin-bottom:1px}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none;white-space:break-spaces}.trumbowyg-button-pane{width:100%;min-height:36px;background:#ecf0f1;border-bottom:1px solid #d7e0e2;margin:0;padding:0 5px;position:relative;list-style-type:none;line-height:10px;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:11}.trumbowyg-button-pane::after{content:" ";display:block;position:absolute;top:36px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane .trumbowyg-button-group{display:inline-block}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group::after{content:" ";display:inline-block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.trumbowyg-button-pane .trumbowyg-button-group:last-child::after{content:none}.trumbowyg-button-pane button{display:inline-block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;vertical-align:middle;-webkit-transition:background-color 150ms,opacity 150ms;-o-transition:background-color 150ms,opacity 150ms;transition:background-color 150ms,opacity 150ms}.trumbowyg-button-pane button.trumbowyg-textual-button{width:auto;line-height:35px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.trumbowyg-button-pane button.trumbowyg-disable,.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),.trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button){opacity:.2;cursor:default;pointer-events:none}.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,.trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before{background:#e3e9eb}.trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#FFF;outline:0}.trumbowyg-button-pane .trumbowyg-open-dropdown::after{display:block;content:" ";position:absolute;top:25px;right:3px;height:0;width:0;border:3px solid transparent;border-top-color:#555}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button{padding-left:10px!important;padding-right:18px!important}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after{top:17px;right:7px}.trumbowyg-button-pane .trumbowyg-right{float:right}.trumbowyg-dropdown{max-width:300px;max-height:250px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;border:1px solid #ecf0f1;padding:5px 0;border-top:none;background:#FFF;margin-left:-1px;-webkit-box-shadow:rgba(0,0,0,.1) 0 2px 3px;box-shadow:rgba(0,0,0,.1) 0 2px 3px;z-index:12}.trumbowyg-dropdown button{display:block;width:100%;height:35px;line-height:35px;text-decoration:none;background:#FFF;padding:0 20px 0 10px;color:#333!important;border:none;cursor:pointer;text-align:left;font-size:15px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-dropdown button:focus,.trumbowyg-dropdown button:hover{background:#ecf0f1}.trumbowyg-dropdown button svg{float:left;margin-right:14px}.trumbowyg-modal{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:520px;width:100%;height:350px;z-index:12;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:500px;width:calc(100% - 20px);padding-bottom:45px;z-index:1;background-color:#FFF;text-align:center;font-size:14px;-webkit-box-shadow:rgba(0,0,0,.2) 0 2px 3px;box-shadow:rgba(0,0,0,.2) 0 2px 3px;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box .trumbowyg-modal-title{font-size:24px;font-weight:700;margin:0 0 20px;padding:15px 0 13px;display:block;border-bottom:1px solid #EEE;color:#333;background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-progress{width:100%;height:3px;position:absolute;top:58px}.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar{background:#2BC06A;width:0;height:100%;-webkit-transition:width 150ms linear;-o-transition:width 150ms linear;transition:width 150ms linear}.trumbowyg-modal-box .trumbowyg-input-row{position:relative;margin:15px 12px;border:1px solid #DEDEDE;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos{text-align:left;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;width:150px;border-right:1px solid #DEDEDE;padding:0 7px;background-color:#fbfcfc;position:absolute;left:0;top:0;bottom:0}.trumbowyg-modal-box .trumbowyg-input-infos label{color:#69878f;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos label,.trumbowyg-modal-box .trumbowyg-input-infos label span{display:block;height:27px;line-height:27px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error{color:#e74c3c}.trumbowyg-modal-box .trumbowyg-input-html{padding:1px 1px 1px 152px}.trumbowyg-modal-box .trumbowyg-input-html,.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{font-size:14px}.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;height:27px;line-height:27px;border:0;width:100%;padding:0 7px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html input:hover,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html select:hover,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:hover{outline:#95a5a6 solid 1px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus{background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-input-html input[type=checkbox]{width:16px;height:16px;padding:0}.trumbowyg-modal-box .trumbowyg-input-html-with-checkbox{text-align:left;padding:3px 1px 1px 3px}.trumbowyg-modal-box .trumbowyg-input-error input,.trumbowyg-modal-box .trumbowyg-input-error select,.trumbowyg-modal-box .trumbowyg-input-error textarea{outline:#e74c3c solid 1px}.trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child{margin-top:-27px}.trumbowyg-modal-box .error{margin-top:25px;display:block;color:red}.trumbowyg-modal-box .trumbowyg-modal-button{position:absolute;bottom:10px;right:0;text-decoration:none;color:#FFF;display:block;width:100px;height:35px;line-height:33px;margin:0 10px;background-color:#333;border:none;cursor:pointer;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;font-size:16px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.portal-menus .handle,.trumbowyg-editor img{cursor:move}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{right:110px;background:#2bc06a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#40d47e;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#25a25a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{color:#555;background:#e6e6e6}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#fbfbfb;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#d5d5d5}.trumbowyg-overlay{position:absolute;background-color:rgba(255,255,255,.5);height:100%;width:100%;left:0;display:none;top:0;z-index:10}body.trumbowyg-body-fullscreen{overflow:hidden}.trumbowyg-fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;margin:0;padding:0;z-index:99999}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen .trumbowyg-textarea{height:calc(100% - 37px)!important;overflow:auto}.trumbowyg-fullscreen .trumbowyg-overlay{height:100%!important}.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#222;fill:transparent}.trumbowyg-editor img,.trumbowyg-editor video{height:auto}.trumbowyg-editor canvas:focus{outline:0}.trumbowyg-editor.trumbowyg-reset-css{background:#FEFEFE!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;line-height:1.45em!important;color:#333}.trumbowyg-editor.trumbowyg-reset-css a{color:#15c!important;text-decoration:underline!important}.trumbowyg-editor.trumbowyg-reset-css blockquote,.trumbowyg-editor.trumbowyg-reset-css div,.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css p,.trumbowyg-editor.trumbowyg-reset-css ul{-webkit-box-shadow:none!important;box-shadow:none!important;background:0 0!important;margin:0 0 15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none}.trumbowyg-editor.trumbowyg-reset-css hr,.trumbowyg-editor.trumbowyg-reset-css iframe,.trumbowyg-editor.trumbowyg-reset-css object{margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css blockquote{margin-left:32px!important;font-style:italic!important;color:#555}.trumbowyg-editor.trumbowyg-reset-css ul{list-style:disc}.trumbowyg-editor.trumbowyg-reset-css ol{list-style:decimal}.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css ul{padding-left:20px!important}.trumbowyg-editor.trumbowyg-reset-css ol ol,.trumbowyg-editor.trumbowyg-reset-css ol ul,.trumbowyg-editor.trumbowyg-reset-css ul ol,.trumbowyg-editor.trumbowyg-reset-css ul ul{border:none;margin:2px!important;padding:0 0 0 24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block;height:1px;border:none;border-top:1px solid #CCC}.trumbowyg-editor.trumbowyg-reset-css h1,.trumbowyg-editor.trumbowyg-reset-css h2,.trumbowyg-editor.trumbowyg-reset-css h3,.trumbowyg-editor.trumbowyg-reset-css h4{color:#111;background:0 0;margin:0!important;padding:0!important;font-weight:700}.trumbowyg-editor.trumbowyg-reset-css h1{font-size:32px!important;line-height:38px!important;margin-bottom:20px!important}.trumbowyg-editor.trumbowyg-reset-css h2{font-size:26px!important;line-height:34px!important;margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css h3{font-size:22px!important;line-height:28px!important;margin-bottom:7px!important}.trumbowyg-editor.trumbowyg-reset-css h4{font-size:16px!important;line-height:22px!important;margin-bottom:7px!important}.trumbowyg-dark .trumbowyg-textarea{background:#111;color:#ddd}.trumbowyg-dark .trumbowyg-box{border:1px solid #343434}.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen{background:#111}.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{text-shadow:0 0 7px #ccc}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}.trumbowyg-dark .trumbowyg-box svg{fill:#ecf0f1;color:#ecf0f1}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after{background:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after{background-color:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after{background-color:#2a2a2a}.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#333}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after{border-top-color:#fff}.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:#ecf0f1;fill:transparent}.trumbowyg-dark .trumbowyg-dropdown{border-color:#222;background:#333;-webkit-box-shadow:rgba(0,0,0,.3) 0 2px 3px;box-shadow:rgba(0,0,0,.3) 0 2px 3px}.trumbowyg-dark .trumbowyg-dropdown button{background:#333;color:#fff!important}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:27px;line-height:27px;overflow:hidden}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#222}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label input{border-color:#222;color:#eee;background:#333}.trumbowyg-dark .trumbowyg-modal-box label input:focus,.trumbowyg-dark .trumbowyg-modal-box label input:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box label input:focus{background-color:#2f2f2f}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{background:#1b7943}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#25a25a}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#176437}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{background:#333;color:#ccc}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#444}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#111}.trumbowyg-dark .trumbowyg-overlay{background-color:rgba(15,15,15,.6)}.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list),.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list){max-width:276px;padding:7px 5px;overflow:initial}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button{display:block;position:relative;float:left;text-indent:-9999px;height:20px;width:20px;border:1px solid #333;padding:0;margin:2px}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:hover::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:hover::after{content:" ";display:block;position:absolute;top:-5px;left:-5px;width:27px;height:27px;background:inherit;border:1px solid #fff;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button){position:relative;color:#fff!important}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):focus::after,.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):hover::after{content:" ";display:block;position:absolute;top:13px;left:0;width:0;height:0;border:5px solid transparent;border-left-color:#fff}.trumbowyg-dropdown-emoji{width:265px;padding:7px 0 7px 5px}.trumbowyg-dropdown-emoji svg{display:none!important}.trumbowyg-dropdown-emoji button{display:block;position:relative;float:left;height:26px;width:26px;padding:0;margin:2px;line-height:24px;text-align:center}.trumbowyg-dropdown-emoji button:focus::after,.trumbowyg-dropdown-emoji button:hover::after{display:block;position:absolute;top:-5px;left:-5px;height:27px;width:27px;background:inherit;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10;background-color:transparent}.trumbowyg .emoji{width:22px;height:22px;display:inline-block}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}.md-avatar{vertical-align:middle;width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.attr-set-value-item:last-child{border-bottom:0!important}.custom-image{max-width:30vw}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}.img-preview,.sr-only,.user .username,.user a{overflow:hidden}#modal-posts img{height:30px}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}*{box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative}.user .username{white-space:nowrap;text-overflow:ellipsis;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{height:100%;width:100%;border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.img-container>img{max-width:100%}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem}.img-preview>img{max-width:100%}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#041323;opacity:.2;z-index:9999}#loader,.cm-fat-cursor div.CodeMirror-cursors{z-index:1}#loader{position:absolute;left:50%;top:50%;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{display:inline-block;font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;background-color:#eee;border-radius:50%}.bootstrap-tagsinput,.fa-stack{vertical-align:middle;display:inline-block}.nc-icon-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.fa-stack,.fa-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! + */.popover,.tooltip,body{font-family:var(--bs-font-sans-serif)}.table,body{color:#212529}.CodeMirror pre,body{-webkit-tap-highlight-color:transparent}.popover,.tooltip,address{font-style:normal}.btn-link,a{text-decoration:underline}.CodeMirror-wrap pre,.popover,.tooltip,pre code{word-break:normal}.card,.popover,.toast-body,.tooltip,code{word-wrap:break-word}.btn,.btn-group,.btn-group-vertical,.navbar-toggler-icon,img,svg{vertical-align:middle}.CodeMirror pre,select{word-wrap:normal}label,output{display:inline-block}.badge,progress,sub,sup{vertical-align:baseline}.input-group,.row{flex-wrap:wrap;display:flex}:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-size:1rem;font-weight:400;line-height:1.5;background-color:#fff;-webkit-text-size-adjust:100%}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}address,dl,ol,p,pre,ul{margin-bottom:1rem}blockquote,figure{margin:0 0 1rem}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}dl,ol,p,ul{margin-top:0}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.alertify .ajs-commands button,.btn,.carousel-indicators [data-bs-target],.form-control-color:not(:disabled):not([readonly]),.form-control[type=file]:not(:disabled):not([readonly]),[role=button],[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled),summary{cursor:pointer}address{line-height:inherit}ol,ul{padding-left:2rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}b,strong{font-weight:bolder}.alert-link,.badge,kbd kbd{font-weight:700}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit}code,kbd{font-size:.875em}code{color:#d63384}a>code{color:inherit}kbd{padding:.2rem .4rem;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em}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}button{border-radius:0}fieldset,iframe{border: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}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin: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}.display-1,.display-2,.display-3,.display-4,.display-5,.display-6{line-height:1.2;font-weight:300}.form-control,.form-select{-webkit-appearance:none;-moz-appearance:none}summary{display:list-item}[hidden]{display:none!important}.btn,.figure,.form-check-inline,.list-inline-item{display:inline-block}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw)}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw)}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw)}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw)}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw)}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-inline,.list-unstyled{padding-left:0;list-style:none}.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-footer,.figure-caption{font-size:.875em;color:#6c757d}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem}.blockquote-footer::before{content:"— "}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure-img{margin-bottom:.5rem;line-height:1}.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}}.custom-file-img,.invalid-tooltip,.offcanvas,.row>*,.toast,.toast-container,.trumbowyg-editor embed,.trumbowyg-editor img,.trumbowyg-editor object,.trumbowyg-editor video,.valid-tooltip{max-width:100%}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;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%;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%}@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%}}@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%}}@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%}}@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%}}@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-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2,.col-3{flex:0 0 auto}.col-2{width:16.66666667%}.col-3{width:25%}.col-4,.col-5{flex:0 0 auto}.col-4{width:33.33333333%}.col-5{width:41.66666667%}.col-6,.col-7{flex:0 0 auto}.col-6{width:50%}.col-7{width:58.33333333%}.col-8,.col-9{flex:0 0 auto}.col-8{width:66.66666667%}.col-9{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-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-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-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-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-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;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.form-check-input:focus,.form-control:focus,.form-select:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.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}.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}}.collapsing,.dropdown-divider,.form-control[type=file],.progress,.progress-bar{overflow:hidden}.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,.form-control:focus{color:#212529;background-color:#fff}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;background-clip:padding-box;border:1px solid #ced4da;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}}.btn,.form-control::file-selector-button{transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control:focus{border-color:#86b7fe}.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}@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-select,.input-group-text{font-size:1rem;font-weight:400}.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{max-width:3rem;height:auto;padding:.375rem}.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(.75rem - 3px);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;appearance:none}.form-check-input,.form-range{-webkit-appearance:none;-moz-appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe}.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);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}.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{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;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}.invalid-tooltip,.valid-tooltip{position:absolute;border-radius:.25rem}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.btn,.input-group-text,.modal-title,.offcanvas-title,.popover,.tooltip{line-height:1.5}.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}.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;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;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.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.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>: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{top:100%;z-index:5;display:none;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9)}.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,.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}.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: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{top:100%;z-index:5;display:none;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9)}.dropdown-header,.dropdown-item,.dropdown-item-text,.dropdown-menu.show,.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}.btn,.btn:hover{color:#212529}.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{font-weight:400;text-align:center;text-decoration:none;-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}.dropdown-toggle::after,.dropup .dropdown-toggle::after{vertical-align:.255em;content:""}@media (prefers-reduced-motion:reduce){.btn,.form-floating>label{transition:none}}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-check:focus+.btn-primary,.btn-primary.active:focus,.btn-primary:active:focus,.btn-primary:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-primary,.btn-primary:focus,.btn-primary:hover{background-color:#0b5ed7;border-color:#0a58ca;color:#fff}.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-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-check:focus+.btn-secondary,.btn-secondary.active:focus,.btn-secondary:active:focus,.btn-secondary:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.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-check:focus+.btn-secondary,.btn-secondary:focus,.btn-secondary:hover{background-color:#5c636a;border-color:#565e64;color:#fff}.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-success:focus,.btn-check:checked+.btn-success:focus,.btn-check:focus+.btn-success,.btn-success.active:focus,.btn-success:active:focus,.btn-success:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.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-check:focus+.btn-success,.btn-success:focus,.btn-success:hover{background-color:#157347;border-color:#146c43;color:#fff}.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-info:focus,.btn-check:checked+.btn-info:focus,.btn-check:focus+.btn-info,.btn-info.active:focus,.btn-info:active:focus,.btn-info:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.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-check:focus+.btn-info,.btn-info:focus,.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.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-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-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-check:focus+.btn-danger,.btn-danger.active:focus,.btn-danger:active:focus,.btn-danger:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.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-check:focus+.btn-danger,.btn-danger:focus,.btn-danger:hover{background-color:#bb2d3b;border-color:#b02a37;color:#fff}.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-light:focus,.btn-check:checked+.btn-light:focus,.btn-check:focus+.btn-light,.btn-light.active:focus,.btn-light:active:focus,.btn-light:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.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-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-check:focus+.btn-light,.btn-light.active,.btn-light:active,.btn-light:focus,.btn-light:hover,.show>.btn-light.dropdown-toggle{background-color:#f9fafb;border-color:#f9fafb;color:#000}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-check:focus+.btn-dark,.btn-dark.active:focus,.btn-dark:active:focus,.btn-dark:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.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-check:focus+.btn-dark,.btn-dark:focus,.btn-dark:hover{background-color:#1c1f23;border-color:#1a1e21;color:#fff}.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-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-check:focus+.btn-outline-primary,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.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,.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.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,.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-check:focus+.btn-outline-success,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.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,.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-check:focus+.btn-outline-info,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.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,.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-check:focus+.btn-outline-warning,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.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,.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-check:focus+.btn-outline-danger,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.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,.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-check:focus+.btn-outline-light,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.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,.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-check:focus+.btn-outline-dark,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.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,.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd}.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;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;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;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;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid;vertical-align:0}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent;vertical-align:0}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropdown-divider{height:0;margin:.5rem 0;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{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-menu-dark,.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.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-header{padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40}.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-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.card>hr,.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.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}.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-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}.page-link:focus,.page-link:hover{color:#0a58ca;background-color:#e9ecef}@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}.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;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}}@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}}@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}}@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}}@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{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}.card,.progress-bar{flex-direction:column}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.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,.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;min-width:0;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right: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}.card-footer,.card-header{padding:.5rem 1rem;background-color:rgba(0,0,0,.03)}.card-title{margin-bottom:.5rem}.card-header,.card-subtitle,.card-text:last-child{margin-bottom:0}.card-subtitle{margin-top:-.25rem}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header-pills,.card-header-tabs{margin-right:-.5rem;margin-left:-.5rem}.card-header{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{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-bottom:-.5rem;border-bottom:0}.card-group>.card,.toast-container>:not(:last-child){margin-bottom:.75rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.accordion-button,.alert,.btn .badge,.list-group-item,.page-link{position:relative}.accordion-body,.accordion-button{padding:1rem 1.25rem}.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)}@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{display:flex;align-items:center;width:100%;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:focus,.btn-close:focus,.page-link:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.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}.accordion-header{margin-bottom:0}.alert,.breadcrumb{margin-bottom:1rem}.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-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;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{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;padding:.375rem .75rem}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;border-color:#dee2e6}.page-link:focus{z-index:3}.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-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-sm .page-link,.popover,.toast,.tooltip{font-size:.875rem}.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}.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;line-height:1;color:#fff;text-align:center;white-space:nowrap;border-radius:.25rem}.badge:empty,.toast.hide{display:none}.btn .badge{top:-1px}.alert{padding:1rem;border:1px solid transparent;border-radius:.25rem}.list-group,.progress,.tooltip-inner{border-radius:.25rem}.alert-heading{color:inherit}.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;font-size:.75rem;background-color:#e9ecef}.progress-bar{display:flex;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}.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{transition:none}.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.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{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;color:#000;background: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}.toast,.toast-header{background-color:rgba(255,255,255,.85)}.carousel-indicators [data-bs-target],.modal-content,.offcanvas,.popover,.toast,.toast-header{background-clip:padding-box}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.modal-backdrop.fade,.toast:not(.showing):not(.show){opacity:0}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;pointer-events:auto;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;pointer-events:none}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;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}.modal{position:fixed;top:0;left:0;z-index:1060;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}.alertify .ajs-modal,.modal-dialog-scrollable .modal-body,.modal-fullscreen .modal-body,.offcanvas-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;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding: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;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0}.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-footer,.modal-fullscreen .modal-header{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-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-weight:400;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-spacing:normal;white-space:normal;line-break:auto;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}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-weight:400;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-spacing:normal;white-space:normal;line-break:auto;background-color:#fff;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;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;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}.carousel,.carousel-inner,.carousel-item{position:relative}.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;color:#212529}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{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;background-color:#fff;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}.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}.CodeMirror,.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor,.carousel-dark .carousel-caption{color:#000}.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}@-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}.offcanvas-bottom,.offcanvas-top{right:0;left:0;height:30vh;max-height:100%}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;visibility:hidden;background-color:#fff;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem}.offcanvas-header .btn-close{padding:.5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0}.offcanvas-body{flex-grow:1;padding:1rem}.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;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.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:""}.alertify .ajs-reset,.d-inline{display:inline!important}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.fixed-bottom,.fixed-top{position:fixed;z-index:1030;right:0;left:0}.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{top:0}.fixed-bottom{bottom:0}.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}}.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:""}.alertify .ajs-dialog.ajs-capture:before,.cm-tab-wrap-hack:after{content:''}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!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{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body,.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.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-end,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-end{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-start{border-bottom-left-radius:.25rem!important}.rounded-start,.rounded-top{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}.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 (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}}.alertify .ajs-dimmer,.alertify .ajs-modal{position:fixed;padding:0;z-index:1981;top:0;right:0;bottom:0;left:0}@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}}.alertify .ajs-dimmer{margin:0;background-color:#252525;opacity:.5}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px -24px 0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button,.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;right:0;bottom:0;left:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:#3593d2 dotted 1px}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;right:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center center;background-color:rgba(0,0,0,.5);border-top-right-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0}.alertify-notifier.ajs-center{left:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{left:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0}.ajs-no-transition.alertify .ajs-dialog,.ajs-no-transition.alertify .ajs-dimmer,.ajs-no-transition.alertify .ajs-modal,.ajs-no-transition.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}@media (prefers-reduced-motion:reduce){.alertify .ajs-dialog,.alertify .ajs-dimmer,.alertify .ajs-modal,.alertify-notifier .ajs-message{-webkit-transition:none!important;transition:none!important;-webkit-animation:none!important;animation:none!important}}#trumbowyg-icons,#trumbowyg-icons svg{height:0;width:0}#trumbowyg-icons{overflow:hidden;visibility:hidden}.trumbowyg-box *,.trumbowyg-box ::after,.trumbowyg-box ::before,.trumbowyg-modal *,.trumbowyg-modal ::after,.trumbowyg-modal ::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,.trumbowyg-editor,.trumbowyg-textarea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.trumbowyg-box svg,.trumbowyg-modal svg{width:17px;height:100%;fill:#222}.trumbowyg-box,.trumbowyg-editor{display:block;position:relative;border:1px solid #DDD;width:100%;min-height:300px}.trumbowyg-box .trumbowyg-editor{margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#FEFEFE;border:none!important}.trumbowyg-editor,.trumbowyg-textarea{position:relative;box-sizing:border-box;padding:20px;min-height:300px;width:100%;border-style:none;resize:none;outline:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.trumbowyg-editor.trumbowyg-autogrow-on-enter,.trumbowyg-textarea.trumbowyg-autogrow-on-enter{-webkit-transition:height .3s ease-out;-o-transition:height .3s ease-out;transition:height .3s ease-out}.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:transparent!important;text-shadow:0 0 7px #333}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}.trumbowyg-box-blur .trumbowyg-editor hr,.trumbowyg-box-blur .trumbowyg-editor img{opacity:.2}.trumbowyg-textarea{position:relative;display:block;overflow:auto;border:none;font-size:14px;font-family:Inconsolata,Consolas,Courier,"Courier New",sans-serif;line-height:18px}.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea{height:1px!important;width:25%;min-height:0!important;padding:0!important;background:0 0;opacity:0!important}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea{display:block;margin-bottom:1px}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none;white-space:break-spaces}.trumbowyg-button-pane{width:100%;min-height:36px;background:#ecf0f1;border-bottom:1px solid #d7e0e2;margin:0;padding:0 5px;position:relative;list-style-type:none;line-height:10px;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:11}.trumbowyg-button-pane::after{content:" ";display:block;position:absolute;top:36px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane .trumbowyg-button-group{display:inline-block}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group::after{content:" ";display:inline-block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.trumbowyg-button-pane .trumbowyg-button-group:last-child::after{content:none}.trumbowyg-button-pane button{display:inline-block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;vertical-align:middle;-webkit-transition:background-color 150ms,opacity 150ms;-o-transition:background-color 150ms,opacity 150ms;transition:background-color 150ms,opacity 150ms}.trumbowyg-button-pane button.trumbowyg-textual-button{width:auto;line-height:35px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.trumbowyg-button-pane button.trumbowyg-disable,.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),.trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button){opacity:.2;cursor:default;pointer-events:none}.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,.trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before{background:#e3e9eb}.trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#FFF;outline:0}.trumbowyg-button-pane .trumbowyg-open-dropdown::after{display:block;content:" ";position:absolute;top:25px;right:3px;height:0;width:0;border:3px solid transparent;border-top-color:#555}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button{padding-left:10px!important;padding-right:18px!important}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after{top:17px;right:7px}.trumbowyg-button-pane .trumbowyg-right{float:right}.trumbowyg-dropdown{max-width:300px;max-height:250px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;border:1px solid #ecf0f1;padding:5px 0;border-top:none;background:#FFF;margin-left:-1px;-webkit-box-shadow:rgba(0,0,0,.1) 0 2px 3px;box-shadow:rgba(0,0,0,.1) 0 2px 3px;z-index:12}.trumbowyg-dropdown button{display:block;width:100%;height:35px;line-height:35px;text-decoration:none;background:#FFF;padding:0 20px 0 10px;color:#333!important;border:none;cursor:pointer;text-align:left;font-size:15px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-dropdown button:focus,.trumbowyg-dropdown button:hover{background:#ecf0f1}.trumbowyg-dropdown button svg{float:left;margin-right:14px}.trumbowyg-modal{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:520px;width:100%;height:350px;z-index:12;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:500px;width:calc(100% - 20px);padding-bottom:45px;z-index:1;background-color:#FFF;text-align:center;font-size:14px;-webkit-box-shadow:rgba(0,0,0,.2) 0 2px 3px;box-shadow:rgba(0,0,0,.2) 0 2px 3px;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box .trumbowyg-modal-title{font-size:24px;font-weight:700;margin:0 0 20px;padding:15px 0 13px;display:block;border-bottom:1px solid #EEE;color:#333;background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-progress{width:100%;height:3px;position:absolute;top:58px}.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar{background:#2BC06A;width:0;height:100%;-webkit-transition:width 150ms linear;-o-transition:width 150ms linear;transition:width 150ms linear}.trumbowyg-modal-box .trumbowyg-input-row{position:relative;margin:15px 12px;border:1px solid #DEDEDE;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos{text-align:left;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;width:150px;border-right:1px solid #DEDEDE;padding:0 7px;background-color:#fbfcfc;position:absolute;left:0;top:0;bottom:0}.trumbowyg-modal-box .trumbowyg-input-infos label{color:#69878f;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos label,.trumbowyg-modal-box .trumbowyg-input-infos label span{display:block;height:27px;line-height:27px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error{color:#e74c3c}.trumbowyg-modal-box .trumbowyg-input-html{padding:1px 1px 1px 152px}.trumbowyg-modal-box .trumbowyg-input-html,.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{font-size:14px}.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;height:27px;line-height:27px;border:0;width:100%;padding:0 7px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html input:hover,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html select:hover,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:hover{outline:#95a5a6 solid 1px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus{background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-input-html input[type=checkbox]{width:16px;height:16px;padding:0}.trumbowyg-modal-box .trumbowyg-input-html-with-checkbox{text-align:left;padding:3px 1px 1px 3px}.trumbowyg-modal-box .trumbowyg-input-error input,.trumbowyg-modal-box .trumbowyg-input-error select,.trumbowyg-modal-box .trumbowyg-input-error textarea{outline:#e74c3c solid 1px}.trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child{margin-top:-27px}.trumbowyg-modal-box .error{margin-top:25px;display:block;color:red}.trumbowyg-modal-box .trumbowyg-modal-button{position:absolute;bottom:10px;right:0;text-decoration:none;color:#FFF;display:block;width:100px;height:35px;line-height:33px;margin:0 10px;background-color:#333;border:none;cursor:pointer;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;font-size:16px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{right:110px;background:#2bc06a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#40d47e;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#25a25a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{color:#555;background:#e6e6e6}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#fbfbfb;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#d5d5d5}.trumbowyg-overlay{position:absolute;background-color:rgba(255,255,255,.5);height:100%;width:100%;left:0;display:none;top:0;z-index:10}body.trumbowyg-body-fullscreen{overflow:hidden}.trumbowyg-fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;margin:0;padding:0;z-index:99999}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen .trumbowyg-textarea{height:calc(100% - 37px)!important;overflow:auto}.trumbowyg-fullscreen .trumbowyg-overlay{height:100%!important}.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#222;fill:transparent}.trumbowyg-editor img,.trumbowyg-editor video{height:auto}.trumbowyg-editor img{cursor:move}.trumbowyg-editor canvas:focus{outline:0}.trumbowyg-editor.trumbowyg-reset-css{background:#FEFEFE!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;line-height:1.45em!important;color:#333}.trumbowyg-editor.trumbowyg-reset-css a{color:#15c!important;text-decoration:underline!important}.trumbowyg-editor.trumbowyg-reset-css blockquote,.trumbowyg-editor.trumbowyg-reset-css div,.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css p,.trumbowyg-editor.trumbowyg-reset-css ul{-webkit-box-shadow:none!important;box-shadow:none!important;background:0 0!important;margin:0 0 15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none}.trumbowyg-editor.trumbowyg-reset-css hr,.trumbowyg-editor.trumbowyg-reset-css iframe,.trumbowyg-editor.trumbowyg-reset-css object{margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css blockquote{margin-left:32px!important;font-style:italic!important;color:#555}.trumbowyg-editor.trumbowyg-reset-css ul{list-style:disc}.trumbowyg-editor.trumbowyg-reset-css ol{list-style:decimal}.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css ul{padding-left:20px!important}.trumbowyg-editor.trumbowyg-reset-css ol ol,.trumbowyg-editor.trumbowyg-reset-css ol ul,.trumbowyg-editor.trumbowyg-reset-css ul ol,.trumbowyg-editor.trumbowyg-reset-css ul ul{border:none;margin:2px!important;padding:0 0 0 24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block;height:1px;border:none;border-top:1px solid #CCC}.trumbowyg-editor.trumbowyg-reset-css h1,.trumbowyg-editor.trumbowyg-reset-css h2,.trumbowyg-editor.trumbowyg-reset-css h3,.trumbowyg-editor.trumbowyg-reset-css h4{color:#111;background:0 0;margin:0!important;padding:0!important;font-weight:700}.trumbowyg-editor.trumbowyg-reset-css h1{font-size:32px!important;line-height:38px!important;margin-bottom:20px!important}.trumbowyg-editor.trumbowyg-reset-css h2{font-size:26px!important;line-height:34px!important;margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css h3{font-size:22px!important;line-height:28px!important;margin-bottom:7px!important}.trumbowyg-editor.trumbowyg-reset-css h4{font-size:16px!important;line-height:22px!important;margin-bottom:7px!important}.trumbowyg-dark .trumbowyg-textarea{background:#111;color:#ddd}.trumbowyg-dark .trumbowyg-box{border:1px solid #343434}.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen{background:#111}.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{text-shadow:0 0 7px #ccc}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}.trumbowyg-dark .trumbowyg-box svg{fill:#ecf0f1;color:#ecf0f1}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after{background:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after{background-color:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after{background-color:#2a2a2a}.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#333}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after{border-top-color:#fff}.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:#ecf0f1;fill:transparent}.trumbowyg-dark .trumbowyg-dropdown{border-color:#222;background:#333;-webkit-box-shadow:rgba(0,0,0,.3) 0 2px 3px;box-shadow:rgba(0,0,0,.3) 0 2px 3px}.trumbowyg-dark .trumbowyg-dropdown button{background:#333;color:#fff!important}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:27px;line-height:27px;overflow:hidden}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#222}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label input{border-color:#222;color:#eee;background:#333}.trumbowyg-dark .trumbowyg-modal-box label input:focus,.trumbowyg-dark .trumbowyg-modal-box label input:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box label input:focus{background-color:#2f2f2f}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{background:#1b7943}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#25a25a}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#176437}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{background:#333;color:#ccc}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#444}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#111}.trumbowyg-dark .trumbowyg-overlay{background-color:rgba(15,15,15,.6)}.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list),.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list){max-width:276px;padding:7px 5px;overflow:initial}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button{display:block;position:relative;float:left;text-indent:-9999px;height:20px;width:20px;border:1px solid #333;padding:0;margin:2px}.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-backColor:not(.trumbowyg-dropdown--color-list) button:hover::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:focus::after,.trumbowyg-dropdown-foreColor:not(.trumbowyg-dropdown--color-list) button:hover::after{content:" ";display:block;position:absolute;top:-5px;left:-5px;width:27px;height:27px;background:inherit;border:1px solid #fff;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button){position:relative;color:#fff!important}.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):focus::after,.trumbowyg-dropdown-backColor.trumbowyg-dropdown--color-list button:not(.trumbowyg-backColorRemove-dropdown-button):hover::after{content:" ";display:block;position:absolute;top:13px;left:0;width:0;height:0;border:5px solid transparent;border-left-color:#fff}.trumbowyg-dropdown-emoji{width:265px;padding:7px 0 7px 5px}.trumbowyg-dropdown-emoji svg{display:none!important}.trumbowyg-dropdown-emoji button{display:block;position:relative;float:left;height:26px;width:26px;padding:0;margin:2px;line-height:24px;text-align:center}.trumbowyg-dropdown-emoji button:focus::after,.trumbowyg-dropdown-emoji button:hover::after{display:block;position:absolute;top:-5px;left:-5px;height:27px;width:27px;background:inherit;-webkit-box-shadow:#000 0 0 2px;box-shadow:#000 0 0 2px;z-index:10;background-color:transparent}.trumbowyg .emoji{width:22px;height:22px;display:inline-block}.md-avatar{vertical-align:middle;width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important;margin-left:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.attr-set-value-item:last-child{border-bottom:0!important}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}.img-preview,.sr-only,.user .username,.user a{overflow:hidden}.custom-image{max-width:30vw}#modal-posts img{height:30px}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}*{box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative}.user .username{white-space:nowrap;text-overflow:ellipsis;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{height:100%;width:100%;border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}.portal-menus .handle{cursor:move}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.img-container>img{max-width:100%}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem}.img-preview>img{max-width:100%}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#041323;opacity:.2;z-index:9999}#loader,.cm-fat-cursor div.CodeMirror-cursors{z-index:1}#loader{position:absolute;left:50%;top:50%;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{display:inline-block;font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;background-color:#eee;border-radius:50%}.bootstrap-tagsinput,.fa-stack{vertical-align:middle;display:inline-block}.nc-icon-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.fa-stack,.fa-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x,.fa-stack-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-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,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{height:2em;line-height:2em;width:2.5em}.CodeMirror pre,.fa-stack-1x{line-height:inherit}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}.CodeMirror{height:300px;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.cm-link,.tui-editor-contents a{text-decoration:underline}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.tui-editor-contents .task-list-item:before,.tui-editor-contents ol li.task-list-item:before,.tui-editor-contents pre ul li:before,.tui-editor-contents ul li.task-list-item:before,.tui-editor-defaultUI-toolbar:after,.tui-editor:after,.tui-tooltip .arrow{content:""}span.CodeMirror-selectedtext{background:0 0}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.CodeMirror{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.tui-editor-contents :not(table){line-height:160%;box-sizing:content-box}.tui-editor-contents address,.tui-editor-contents cite,.tui-editor-contents dfn,.tui-editor-contents em,.tui-editor-contents i,.tui-editor-contents var{font-style:italic}.tui-editor-contents strong{font-weight:700}.tui-editor-contents p{margin:10px 0;color:#555}.tui-editor-contents>div>div:first-of-type h1,.tui-editor-contents>h1:first-of-type{margin-top:14px}.tui-editor-contents h1,.tui-editor-contents h2,.tui-editor-contents h3,.tui-editor-contents h5{font-weight:700}.tui-editor-contents h1{font-size:1.6rem;line-height:28px;border-bottom:3px double #999;margin:52px 0 15px;padding-bottom:7px;color:#000}.tui-editor-contents h2{font-size:1.3rem;line-height:23px;border-bottom:1px solid #dbdbdb;margin:30px 0 13px;padding-bottom:7px;color:#333}.tui-editor-contents h3,.tui-editor-contents h4{font-size:1.2rem;line-height:18px;margin:20px 0 2px;color:#333}.tui-editor-contents h5,.tui-editor-contents h6{font-size:1rem;line-height:17px;margin:10px 0 -4px;color:#333}.tui-editor-contents blockquote{margin:15px 0;border-left:4px solid #ddd;padding:0 15px;color:#777}.tui-editor-contents blockquote>:first-child{margin-top:0}.tui-editor-contents blockquote>:last-child{margin-bottom:0}.tui-editor-contents code,.tui-editor-contents pre{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;border:0;border-radius:0}.te-input-language input,.te-ww-block-overlay.code-block-header,.tui-editor-defaultUI{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.tui-editor-contents pre{margin:2px 0 8px;padding:18px;background-color:#f5f7f8}.tui-editor-contents code{color:#c1788b;padding:4px 4px 2px 0;letter-spacing:-.3px}.tui-editor-contents pre code{padding:0;color:inherit;white-space:pre-wrap;background-color:transparent}.tui-editor-contents pre.addon{border:1px solid #e8ebed;background-color:#fff}.tui-editor-contents img{margin:4px 0 10px;box-sizing:border-box;vertical-align:top;max-width:100%}.tui-editor-contents table{margin:2px 0 14px;color:#555;width:auto;border-collapse:collapse;box-sizing:border-box}.tui-editor-contents table td,.tui-editor-contents table th{height:32px;padding:5px 14px 5px 12px}.tui-editor-contents table td{border:1px solid #eaeaea}.tui-editor-contents table th{border:1px solid #72777b;border-top:0;background-color:#7b8184;font-weight:300;color:#fff;padding-top:6px}.tui-editor-contents dir,.tui-editor-contents menu,.tui-editor-contents ol,.tui-editor-contents ul{display:block;list-style-type:disc;padding-left:17px;margin:6px 0 10px;color:#555}.tui-editor-contents ol{list-style-type:decimal}.tui-editor-contents ol ol,.tui-editor-contents ol ul,.tui-editor-contents ul ol,.tui-editor-contents ul ul{margin-top:0!important;margin-bottom:0!important}.tui-editor-contents ol li,.tui-editor-contents ul li{position:relative}.tui-editor-contents ul p,ol p{margin:0}.tui-editor-contents hr{border-top:1px solid #eee;margin:16px 0}.tui-editor-contents a{color:#5286bc}.tui-editor-contents a:hover{color:#007cff}.tui-editor-contents{font-size:13px;margin:0;padding:0}.tui-editor-contents .task-list-item{border:0;list-style:none;padding-left:22px;margin-left:-22px}.tui-editor-contents .task-list-item:before{background-repeat:no-repeat;background-size:16px 16px;background-position:center;height:18px;width:18px;position:absolute;left:0;top:1px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item.checked:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item .task-list-item-checkbox,.tui-editor-contents .task-list-item input[type=checkbox]{margin-left:-17px;margin-right:3.8px;margin-top:3px}.tui-editor-contents-placeholder:before{content:attr(data-placeholder);color:grey;line-height:160%;position:absolute}.auto-height,.auto-height .tui-editor-defaultUI{height:auto}.auto-height .tui-editor{position:relative}:not(.auto-height)>.tui-editor-defaultUI,:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{-ms-flex:1;flex:1}.tui-editor-defaultUI-toolbar:after,.tui-editor:after{display:block;height:0;clear:both}.tui-editor{position:absolute;line-height:1;color:#181818;width:100%;height:inherit}.te-editor-section{min-height:0;position:relative;height:inherit}.te-md-container{display:none;overflow:hidden;height:100%}.te-md-container .te-editor{line-height:1.5}.te-md-container .te-editor,.te-md-container .te-preview{box-sizing:border-box;padding:0;height:inherit}.te-md-container .CodeMirror{font-size:13px;height:inherit}.te-md-container .te-preview{overflow:auto;padding:0 25px;height:100%}.te-md-container .te-preview>p:first-child{margin-top:0!important}.te-md-container .te-preview .tui-editor-contents{padding-top:11px}.tui-editor .te-preview-style-tab>.te-editor,.tui-editor .te-preview-style-tab>.te-preview{float:left;width:100%;display:none}.tui-editor .te-preview-style-tab>.te-tab-active{display:block}.tui-editor .te-preview-style-vertical>.te-tab-section{display:none}.tui-editor .te-preview-style-tab>.te-tab-section{display:block}.tui-editor .te-preview-style-vertical .te-editor,.tui-editor .te-preview-style-vertical .te-preview{float:left;width:50%}.tui-editor .te-md-splitter{display:none;position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #e5e5e5}.tui-editor .te-preview-style-vertical .te-md-splitter{display:block}.te-ww-container{display:none;overflow:hidden;z-index:10;height:inherit;background-color:#fff}.te-ww-container>.te-editor{overflow:auto;height:inherit}.te-ww-container .tui-editor-contents:focus{outline:0}.te-ww-container .tui-editor-contents{padding:0 25px}.te-ww-container .tui-editor-contents:first-child{box-sizing:border-box;margin:0;padding:16px 25px 0;height:inherit}.te-ww-container .tui-editor-contents:last-child{margin-bottom:16px}.te-md-mode .te-md-container,.te-ww-mode .te-ww-container{display:block;z-index:100}.tui-editor-defaultUI.te-hide,.tui-editor.te-hide{display:none}.tui-editor-defaultUI .CodeMirror-lines{padding-top:13px;padding-bottom:13px}.tui-editor-defaultUI .CodeMirror-line{padding-left:25px;padding-right:25px}.tui-editor-defaultUI .CodeMirror pre.CodeMirror-placeholder{padding-left:25px;color:grey}.tui-editor-defaultUI .CodeMirror-scroll{cursor:text}.tui-editor-contents td.te-cell-selected{background-color:#d8dfec}.tui-editor-contents td.te-cell-selected::selection{background-color:#d8dfec}.tui-editor-contents th.te-cell-selected{background-color:#908f8f}.tui-editor-contents th.te-cell-selected::selection{background-color:#908f8f}.tui-editor-defaultUI{position:relative;border:1px solid #e5e5e5;height:100%}.tui-editor-defaultUI button{color:#fff;padding:0 14px 0 15px;height:28px;font-size:12px;border:none;cursor:pointer;outline:0}.tui-editor-defaultUI button.te-ok-button{background-color:#4b96e6}.tui-editor-defaultUI button.te-close-button{background-color:#777}.tui-editor-defaultUI-toolbar{padding:0 25px;height:31px;background-color:#fff;border:0;overflow:hidden}.tui-toolbar-divider{float:left;display:inline-block;width:1px;height:14px;background-color:#ddd;margin:9px 6px}.tui-toolbar-button-group{height:28px;border-right:1px solid #d9d9d9;float:left}.te-toolbar-section{height:32px;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.tui-editor-defaultUI-toolbar button{float:left;box-sizing:border-box;outline:0;cursor:pointer;background-color:#fff;width:22px;height:22px;padding:3px;border-radius:0;margin:5px 3px;border:1px solid #fff}.tui-editor-defaultUI-toolbar button.active,.tui-editor-defaultUI-toolbar button:active,.tui-editor-defaultUI-toolbar button:hover{border:1px solid #aaa;background-color:#fff}.tui-editor-defaultUI-toolbar button:first-child{margin-left:0}.tui-editor-defaultUI-toolbar button:last-child{margin-right:0}.tui-editor-defaultUI-toolbar button.tui-scrollsync{width:auto;color:#777;border:0}.tui-editor-defaultUI button.tui-scrollsync:after{content:"Scroll off"}.tui-editor-defaultUI button.tui-scrollsync.active{color:#125de6;font-weight:700}.tui-editor-defaultUI button.tui-scrollsync.active:after{content:"Scroll on"}.tui-editor-defaultUI .te-mode-switch-section{background-color:#f9f9f9;border-top:1px solid #e5e5e5;height:20px;font-size:12px}.tui-editor-defaultUI .te-mode-switch{float:right;height:100%}.tui-editor-defaultUI .te-switch-button{width:92px;height:inherit;background:#e5e5e5;outline:0;color:#a0aabf;cursor:pointer;border:0;border-left:1px solid #ddd;border-right:1px solid #ddd}.tui-editor-defaultUI .te-switch-button.active{background-color:#fff;color:#000}.tui-editor-defaultUI .te-markdown-tab-section{float:left;height:31px;background:#fff}.te-markdown-tab-section .te-tab{margin:0 -7px 0 24px;background:#fff}.tui-editor-defaultUI .te-tab button{box-sizing:border-box;line-height:100%;position:relative;cursor:pointer;z-index:1;font-size:13px;background-color:#f9f9f9;border:1px solid #e5e5e5;border-top:0;padding:0 9px;color:#777;border-radius:0;outline:0}.te-markdown-tab-section .te-tab button:last-child{margin-left:-1px}.te-markdown-tab-section .te-tab button.te-tab-active,.te-markdown-tab-section .te-tab button:hover.te-tab-active{background-color:#fff;color:#333;border-bottom:1px solid #fff;z-index:2}.te-markdown-tab-section .te-tab button:hover{background-color:#fff;color:#333}.tui-popup-modal-background{background-color:rgba(202,202,202,.6);position:fixed;margin:0;left:0;top:0;width:100%;height:100%;z-index:9999}.tui-popup-modal-background.fit-window .tui-popup-wrapper,.tui-popup-wrapper.fit-window{width:100%;height:100%}.tui-popup-wrapper{width:500px;margin-right:auto;border:1px solid #cacaca;background:#fff;z-index:9999}.tui-popup-modal-background .tui-popup-wrapper{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0}.tui-popup-header{padding:10px;height:auto;line-height:normal;position:relative;border-bottom:1px solid #cacaca}.tui-popup-header .tui-popup-header-buttons{float:right}.tui-popup-header .tui-popup-header-buttons button{padding:0;background-color:transparent;background-size:cover;float:left}.tui-popup-header .tui-popup-close-button{margin:3px;width:13px;height:13px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMHB4IiBoZWlnaHQ9IjEwcHgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5GMjc2Qzc4MC0zM0JBLTQ3MTItQTM3OC04RkQwQUNDOTFDRTk8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImxuYi1mb2xkZXItZGVsIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM3Nzc3NzciPiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LDMuNTg1Nzg2NDQgTDEuNzA3MTA2NzgsMC4yOTI4OTMyMTkgTDAuMjkyODkzMjE5LDEuNzA3MTA2NzggTDMuNTg1Nzg2NDQsNSBMMC4yOTI4OTMyMTksOC4yOTI4OTMyMiBMMS43MDcxMDY3OCw5LjcwNzEwNjc4IEw1LDYuNDE0MjEzNTYgTDguMjkyODkzMjIsOS43MDcxMDY3OCBMOS43MDcxMDY3OCw4LjI5Mjg5MzIyIEw2LjQxNDIxMzU2LDUgTDkuNzA3MTA2NzgsMS43MDcxMDY3OCBMOC4yOTI4OTMyMiwwLjI5Mjg5MzIxOSBMNSwzLjU4NTc4NjQ0IFoiIGlkPSJDb21iaW5lZC1TaGFwZSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-header .tui-popup-title{font-size:13px;font-weight:700;color:#333;vertical-align:bottom}.tui-popup-body{padding:15px;font-size:12px}.tui-editor-popup{position:absolute;top:30px;left:50%;margin-left:-250px}.tui-editor-popup.tui-popup-modal-background{position:fixed;top:0;left:0;margin:0}.tui-editor-popup .tui-popup-body label{font-weight:700;color:#666;display:block;margin:10px 0 5px}.tui-editor-popup .tui-popup-body .te-button-section{margin-top:15px}.tui-editor-popup .tui-popup-body input[type=file],.tui-editor-popup .tui-popup-body input[type=text]{padding:4px 10px;border:1px solid #bfbfbf;box-sizing:border-box;width:100%}.tui-editor-popup .tui-popup-body input.wrong{border-color:red}.te-popup-add-link .tui-popup-wrapper{height:219px}.te-popup-add-image .tui-popup-wrapper{height:243px}.te-popup-add-image .te-tab{display:block;background:0 0;border-bottom:1px solid #ebebeb;margin-bottom:8px}.te-dropdown-toolbar .tui-toolbar-divider,.te-popup-add-image .te-file-type,.te-popup-add-image .te-url-type,.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-toggle-slider{display:none}.te-popup-add-image div.te-tab-active,.te-popup-add-image form.te-tab-active{display:block}.te-popup-add-image .te-tab button{border:1px solid #ccc;background:#eee;min-width:100px;margin-left:-1px;border-bottom:0;border-radius:3px 3px 0 0}.te-popup-add-image .te-tab button.te-tab-active{background:#fff}.te-popup-add-table .te-table-selection{position:relative}.te-popup-add-table .te-table-body{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZmspKREMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgAMSwQgckFvTgAAAABJRU5ErkJggg==)}.te-popup-add-table .te-table-header{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZksLCxMMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgDxKwPzTeWPdAAAAABJRU5ErkJggg==)}.te-popup-add-table .te-selection-area{position:absolute;top:0;left:0;background:#80d2ff;opacity:.3;z-index:999}.te-popup-add-table .te-description{margin:10px 0 0;text-align:center}.te-popup-table-utils{width:120px}.te-popup-table-utils .tui-popup-body{padding:0}.te-popup-table-utils button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:28px;text-align:left;color:#777}.te-popup-table-utils button:hover{background-color:#f4f4f4}.te-popup-table-utils hr{background-color:#cacaca;border-style:none;height:1px}.te-heading-add{width:auto}.te-heading-add .tui-popup-body{padding:0}.te-heading-add h1,.te-heading-add h2,.te-heading-add h3,.te-heading-add h4,.te-heading-add h5,.te-heading-add h6,.te-heading-add p,.te-heading-add ul{padding:0;margin:0}.te-heading-add ul{list-style:none}.te-heading-add ul li{padding:2px 10px;cursor:pointer}.te-heading-add ul li:hover{background-color:#eee}.te-heading-add h1{font-size:24px}.te-heading-add h2{font-size:22px}.te-heading-add h3{font-size:20px}.te-heading-add h4{font-size:18px}.te-heading-add h5{font-size:16px}.te-heading-add h6{font-size:14px}.te-dropdown-toolbar{position:absolute;width:auto}.te-dropdown-toolbar .tui-popup-body{padding:0}.tui-popup-color{padding:0}.tui-popup-color .tui-colorpicker-container,.tui-popup-color .tui-colorpicker-palette-container{width:144px}.tui-popup-color .tui-colorpicker-container ul{width:144px;margin-bottom:8px}.tui-popup-color .tui-colorpicker-container li{padding:0 1px 1px 0}.tui-popup-color .tui-colorpicker-container li .tui-colorpicker-palette-button{border:0;width:17px;height:17px}.tui-popup-color .tui-popup-body{padding:10px}.tui-popup-color .te-apply-button,.tui-popup-color .tui-colorpicker-palette-hex{float:right}.tui-popup-color .te-apply-button{height:21px;width:35px;background:#fff;border:1px solid #efefef;position:absolute;bottom:141px;right:10px}.tui-tooltip,.tui-tooltip .arrow{background-color:#222;position:absolute}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-hex{border:1px solid #E1E1E1;padding:3px 14px;margin-left:-1px}.tui-popup-color .tui-colorpicker-container div.tui-colorpicker-clearfix{display:inline-block}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-preview{width:19px;height:19px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-slider-right{width:22px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-huebar-handle{display:none}.tui-tooltip{z-index:999;opacity:.8;color:#fff;padding:2px 5px;font-size:10px}.tui-tooltip .arrow{display:inline-block;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:6px;z-index:-1}.tui-toolbar-icons{background:url(tui-editor.png);background-size:218px 188px;display:inline-block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.tui-toolbar-icons{background:url(tui-editor-2x.png);background-size:218px 188px;display:inline-block}}.tui-toolbar-icons.tui-heading{background-position:-172px -48px}.tui-toolbar-icons.tui-heading:disabled{background-position:-193px -48px}.tui-toolbar-icons.tui-bold{background-position:-4px -4px}.tui-toolbar-icons.tui-bold:disabled{background-position:-25px -4px}.tui-toolbar-icons.tui-italic{background-position:-4px -48px}.tui-toolbar-icons.tui-italic:disabled{background-position:-25px -48px}.tui-toolbar-icons.tui-color{background-position:-172px -70px}.tui-toolbar-icons.tui-color:disabled{background-position:-193px -70px}.tui-toolbar-icons.tui-strike{background-position:-4px -26px}.tui-toolbar-icons.tui-strike:disabled{background-position:-25px -26px}.tui-toolbar-icons.tui-hrline{background-position:-46px -92px}.tui-toolbar-icons.tui-hrline:disabled{background-position:-67px -92px}.tui-toolbar-icons.tui-quote{background-position:-4px -114px}.tui-toolbar-icons.tui-quote:disabled{background-position:-25px -114px}.tui-toolbar-icons.tui-ul{background-position:-46px -4px}.tui-toolbar-icons.tui-ul:disabled{background-position:-67px -4px}.tui-toolbar-icons.tui-ol{background-position:-46px -26px}.tui-toolbar-icons.tui-ol:disabled{background-position:-67px -26px}.tui-toolbar-icons.tui-task{background-position:-130px -48px}.tui-toolbar-icons.tui-task:disabled{background-position:-151px -48px}.tui-toolbar-icons.tui-indent{background-position:-46px -48px}.tui-toolbar-icons.tui-indent:disabled{background-position:-67px -48px}.tui-toolbar-icons.tui-outdent{background-position:-46px -70px}.tui-toolbar-icons.tui-outdent:disabled{background-position:-67px -70px}.tui-toolbar-icons.tui-table{background-position:-88px -92px}.tui-toolbar-icons.tui-table:disabled{background-position:-109px -92px}.tui-toolbar-icons.tui-image{background-position:-130px -4px}.tui-toolbar-icons.tui-image:disabled{background-position:-151px -4px}.tui-toolbar-icons.tui-link{background-position:-130px -26px}.tui-toolbar-icons.tui-link:disabled{background-position:-151px -26px}.tui-toolbar-icons.tui-code{background-position:-130px -92px}.tui-toolbar-icons.tui-code:disabled{background-position:-151px -92px}.tui-toolbar-icons.tui-codeblock{background-position:-130px -70px}.tui-toolbar-icons.tui-codeblock:disabled{background-position:-151px -70px}.tui-toolbar-icons.tui-more{background-position:-172px -92px}.tui-toolbar-icons.tui-more:disabled{background-position:-193px -92px}.tui-colorpicker-svg-huebar,.tui-colorpicker-svg-slider,.tui-colorpicker-vml-slider{border:1px solid #ebebeb}.CodeMirror-sizer{margin-top:6px}.CodeMirror .cm-header{font-weight:700;color:inherit}.CodeMirror .cm-header-1{font-size:24px}.CodeMirror .cm-header-2{font-size:22px}.CodeMirror .cm-header-3{font-size:20px}.CodeMirror .cm-header-4{font-size:18px}.CodeMirror .cm-header-5{font-size:16px}.CodeMirror .cm-header-6{font-size:14px}.CodeMirror .cm-variable-2{color:inherit}.tui-editor-pseudo-clipboard{position:fixed;left:-1000px;top:-1000px;width:100px;height:100px}.te-ww-block-overlay.code-block-header{text-align:right}.te-ww-block-overlay.code-block-header span{font-size:10px;font-weight:600;padding:0 10px;color:#333;cursor:default}.te-ww-block-overlay.code-block-header button{margin:8px;font-size:10px;color:#333;background-color:#f9f9f9;border:1px solid #ddd;padding:4px;height:auto}.te-popup-code-block-languages{position:fixed;box-sizing:border-box;width:130px}.te-popup-code-block-languages .tui-popup-body{max-height:169px;overflow:auto;padding:0}.te-popup-code-block-languages button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:24px;text-align:left;color:#777}.te-popup-code-block-languages button.active{background-color:#f4f4f4}.tui-popup-code-block-editor .tui-popup-wrapper{width:70%;height:70%;margin:auto;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.te-input-language{position:relative;margin-left:15px;cursor:pointer}.te-input-language input{font-size:10px;padding:3px 5px;border:1px solid #ddd;background-color:#f9f9f9;box-sizing:border-box;width:130px;outline:0}.te-input-language input::-ms-clear{display:none}.te-input-language::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT42Q0NBRDk2QS0yMjYxLTRFNDAtOTk1RC1DRUUyQUREQUQ3NkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLWQtc2lkZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS03IiBwb2ludHM9IjIgNSAxMCA1IDYgMTAiPjwvcG9seWdvbj4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);position:absolute;top:1px;right:3px}.te-input-language.active::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BNEZDRkIzMy0zNjdBLTREMjAtOEEyNC1DQ0I2ODFBMDZDODg8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLXVwLXNpZGUiIGZpbGw9IiM1NTU1NTUiPiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJSZWN0YW5nbGUtNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC02LjAwMDAwMCwgLTYuNTAwMDAwKSAiIHBvaW50cz0iMiA0IDEwIDQgNiA5Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor button{margin:-1px 3px}.tui-popup-code-block-editor .tui-popup-header-buttons{height:20px}.tui-popup-code-block-editor .popup-editor-toggle-preview::after{content:'Preview off';color:#777;margin-right:22px}.tui-popup-code-block-editor .popup-editor-toggle-preview.active::after{content:'Preview on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-scroll::after{content:'Scroll off';color:#777;margin-right:16px}.tui-popup-code-block-editor .popup-editor-toggle-scroll.active::after{content:'Scroll on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-fit{width:18px;height:18px;margin-top:4px;margin-right:14px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT40OUQ4RTYyMy1GRTAyLTQ1RUUtQkQ5Ri0xMjUyQjEzRTU1MkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLWV4cGFuZCIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBhdGggZD0iTTMsMyBMOSwzIEw5LDUgTDUsNSBMNSw5IEwzLDkgTDMsMyBaIE0xNSwxNSBMOSwxNSBMOSwxMyBMMTMsMTMgTDEzLDkgTDE1LDkgTDE1LDE1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC05LjAwMDAwMCwgLTkuMDAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZSIgZmlsbC1ydWxlPSJub256ZXJvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS41MDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMS41MDAwMDAsIC02LjUwMDAwMCkgIiBwb2ludHM9IjkuMDg1Nzg2NDQgNS41IDEyLjUgOC45MTQyMTM1NiAxMy45MTQyMTM2IDcuNSAxMC41IDQuMDg1Nzg2NDQiPjwvcG9seWdvbj4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZS1Db3B5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuNTAwMDAwLCAxMS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTYuNTAwMDAwLCAtMTEuNTAwMDAwKSAiIHBvaW50cz0iNC4wODU3ODY0NCAxMC41IDcuNSAxMy45MTQyMTM2IDguOTE0MjEzNTYgMTIuNSA1LjUgOS4wODU3ODY0NCI+PC9wb2x5Z29uPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-code-block-editor .popup-editor-toggle-fit.active{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT4wN0Q1MjlCRi1GNTIzLTREN0EtQTlGNi05NTUzNTU5RDNEMUE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLXJlZHVjZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDEyLjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNS41MDAwMDAsIC0xMi41MDAwMDApICIgcG9pbnRzPSIzLjA4NTc4NjQ0IDExLjUgNi41IDE0LjkxNDIxMzYgNy45MTQyMTM1NiAxMy41IDQuNSAxMC4wODU3ODY0Ij48L3BvbHlnb24+ICAgICAgICAgICAgPHBhdGggZD0iTTksOSBMMTUsOSBMMTUsMTEgTDExLDExIEwxMSwxNSBMOSwxNSBMOSw5IFogTTksOSBMMyw5IEwzLDcgTDcsNyBMNywzIEw5LDMgTDksOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCA5LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOS4wMDAwMDAsIC05LjAwMDAwMCkgIj48L3BhdGg+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzMiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNTAwMDAwLCA1LjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTIuNTAwMDAwLCAtNS41MDAwMDApICIgcG9pbnRzPSIxNC45MTQyMTM2IDYuNSAxMS41IDMuMDg1Nzg2NDQgMTAuMDg1Nzg2NCA0LjUgMTMuNSA3LjkxNDIxMzU2Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor .tui-popup-close-button{margin-top:6px}.tui-popup-code-block-editor .tui-popup-body{z-index:-1;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1;flex:1}.tui-split-scroll.single-content .tui-split-content-right,.tui-split-scroll.single-content .tui-splitter,.tui-split-scroll.single-content button.tui-scrollsync{display:none}.tui-popup-code-block-editor .popup-editor-body{position:relative;-ms-flex:1;flex:1;border-bottom:1px solid #cacaca}.tui-popup-code-block-editor .te-button-section{padding:15px}.tui-popup-code-block-editor .te-button-section button{float:left}.tui-popup-code-block-editor .tui-editor-contents pre{margin:0;background-color:transparent}.tui-popup-code-block-editor .CodeMirror{height:auto}.tui-popup-code-block-editor .CodeMirror-line{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;font-size:13px;line-height:160%;letter-spacing:-.3px}.tui-popup-code-block-editor .popup-editor-editor-wrapper{min-height:100%}.tui-split-scroll-wrapper{position:relative}.tui-split-scroll{position:absolute}.tui-split-scroll,.tui-split-scroll-wrapper{width:100%;height:100%}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{position:absolute;top:0;width:50%;box-sizing:border-box}.tui-split-scroll .tui-split-content-left{left:0}.tui-split-scroll .tui-split-content-right{left:50%}.tui-split-scroll .tui-splitter{position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #cacaca}.tui-split-scroll .tui-split-scroll-content{width:100%;height:100%;overflow:hidden;position:relative}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{height:100%;overflow-x:hidden;overflow-y:auto}.tui-split-scroll button.tui-scrollsync{top:10px;opacity:.2}.tui-split-scroll button.tui-scrollsync::after{content:"scroll off"}.tui-split-scroll.scroll-sync button.tui-scrollsync{opacity:.5}.tui-split-scroll.scroll-sync .tui-split-content-left,.tui-split-scroll.scroll-sync .tui-split-content-right{height:auto;overflow:initial}.tui-split-scroll.scroll-sync button.tui-scrollsync::after{content:"scroll on"}.tui-split-scroll.scroll-sync .tui-split-scroll-content{overflow-y:auto}.tui-split-scroll.single-content .tui-split-content-left{width:100%}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@supports (-ms-accelerator:true){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@media screen and (max-width:480px){.tui-popup-wrapper{max-width:300px}.tui-editor-popup{margin-left:-150px}.te-dropdown-toolbar{max-width:none}} \ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/css/shared.min.css b/src/applications/mixcore/wwwroot/mix-app/css/shared.min.css index 7cb235107..8a901500e 100644 --- a/src/applications/mixcore/wwwroot/mix-app/css/shared.min.css +++ b/src/applications/mixcore/wwwroot/mix-app/css/shared.min.css @@ -1,4 +1,4 @@ -/* Sun Feb 04 2024 23:41:11 GMT+0700 (Indochina Time) */.flag-icon,.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.fa-fw,.fa-li,.fa-stack-1x,.fa-stack-2x,.mi-fw,.mi-li,.mi-stack-1x,.mi-stack-2x{text-align:center}.fa,.fab,.fad,.fal,.far,.fas,.mi{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;display:inline-block}.fa-ul,.mi-ul{list-style-type:none}.flag-icon{position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}/*! +/* Sun Jun 25 2023 15:07:11 GMT+0700 (Indochina Time) */.flag-icon,.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.fa-fw,.fa-li,.fa-stack-1x,.fa-stack-2x,.mi-fw,.mi-li,.mi-stack-1x,.mi-stack-2x{text-align:center}.fa,.fab,.fad,.fal,.far,.fas,.mi{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;display:inline-block}.fa-ul,.mi-ul{list-style-type:none}.flag-icon{position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */.fa,.fab,.fad,.fal,.far,.fas{line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{width:1.25em}.fa-ul{margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-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,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;width:100%}.mi-stack,.mi-ul>li{position:relative}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}/*! diff --git a/src/applications/mixcore/wwwroot/mix-app/js/app-client.min.js b/src/applications/mixcore/wwwroot/mix-app/js/app-client.min.js index 07f48a772..c99724623 100644 --- a/src/applications/mixcore/wwwroot/mix-app/js/app-client.min.js +++ b/src/applications/mixcore/wwwroot/mix-app/js/app-client.min.js @@ -201,51 +201,27 @@ var cart = angular.module("cart", []); ]); })(window.angular); -modules.component("addToCartButton", { +modules.component("fbCustomerChat", { templateUrl: - "/mix-app/views/app-client/components/add-to-cart-button/view.html", + "/mix-app/views/app-client/components/fb-customer-chat/view.html", + controller: [ + "$location", + function ($location) { + var ctrl = this; + this.$onInit = function () { + setTimeout(() => { + FB.XFBML.parse(); + }, 200); + }; + }, + ], bindings: { - cartData: "=", - propertyId: "=", - title: "=", - imageUrl: "=", - price: "=", - quantity: "=?", + fbPageId: "=", + themeColor: "=", + inGreeting: "=", + outGreeting: "=", }, - controller: "AddToCartController", }); -modules.controller("AddToCartController", [ - "$rootScope", - "$scope", - "localStorageService", - function ($rootScope, $scope, localStorageService) { - $scope.init = function () { - $scope.quantity = $scope.quantity || 1; - }; - $scope.addToCart = function () { - var current = $rootScope.findObjectByKey( - $scope.cartData.items, - "propertyId", - $scope.propertyId - ); - if (current) { - current.quantity += parseInt($scope.quantity); - } else { - var item = { - propertyId: $scope.propertyId, - title: $scope.title, - imageUrl: $scope.imageUrl, - price: $scope.price, - quantity: parseInt($scope.quantity) || 1, - }; - $scope.cartData.items.push(item); - $scope.cartData.totalItem += 1; - } - $scope.cartData.total += parseInt($scope.price); - localStorageService.set("shoppingCart", $scope.cartData); - }; - }, -]); modules.component("booking", { templateUrl: "/mix-app/views/app-client/components/booking/index.html", @@ -304,27 +280,51 @@ modules.component("booking", { }, }); -modules.component("fbCustomerChat", { +modules.component("addToCartButton", { templateUrl: - "/mix-app/views/app-client/components/fb-customer-chat/view.html", - controller: [ - "$location", - function ($location) { - var ctrl = this; - this.$onInit = function () { - setTimeout(() => { - FB.XFBML.parse(); - }, 200); - }; - }, - ], + "/mix-app/views/app-client/components/add-to-cart-button/view.html", bindings: { - fbPageId: "=", - themeColor: "=", - inGreeting: "=", - outGreeting: "=", + cartData: "=", + propertyId: "=", + title: "=", + imageUrl: "=", + price: "=", + quantity: "=?", }, + controller: "AddToCartController", }); +modules.controller("AddToCartController", [ + "$rootScope", + "$scope", + "localStorageService", + function ($rootScope, $scope, localStorageService) { + $scope.init = function () { + $scope.quantity = $scope.quantity || 1; + }; + $scope.addToCart = function () { + var current = $rootScope.findObjectByKey( + $scope.cartData.items, + "propertyId", + $scope.propertyId + ); + if (current) { + current.quantity += parseInt($scope.quantity); + } else { + var item = { + propertyId: $scope.propertyId, + title: $scope.title, + imageUrl: $scope.imageUrl, + price: $scope.price, + quantity: parseInt($scope.quantity) || 1, + }; + $scope.cartData.items.push(item); + $scope.cartData.totalItem += 1; + } + $scope.cartData.total += parseInt($scope.price); + localStorageService.set("shoppingCart", $scope.cartData); + }; + }, +]); modules.component("fbLike", { templateUrl: "/mix-app/views/app-client/components/fb-like/fb-like.html", diff --git a/src/applications/mixcore/wwwroot/mix-app/js/app-init.min.js b/src/applications/mixcore/wwwroot/mix-app/js/app-init.min.js index f4230d94c..00dc56014 100644 --- a/src/applications/mixcore/wwwroot/mix-app/js/app-init.min.js +++ b/src/applications/mixcore/wwwroot/mix-app/js/app-init.min.js @@ -38,127 +38,6 @@ app.config(function ($routeProvider, $locationProvider, $sceProvider) { }); }); -"use strict"; -app.controller("Step2Controller", [ - "$scope", - "$rootScope", - "ApiService", - "Step2Services", - "AuthService", - function ($scope, $rootScope, apiService, services, authService) { - $scope.user = { - username: "", - email: "", - password: "", - confirmPassword: "", - isAgreed: false, - }; - $scope.init = async function () { - await apiService.getGlobalSettings(); - }; - $scope.register = async function () { - if (!$scope.user.isAgreed) { - var ele = document.getElementById("notTNCYetChecked"); - ele.style.display = "block"; - } else { - if ($scope.password !== $scope.confirmPassword) { - $rootScope.showErrors(["Confirm Password is not matched"]); - } else { - $rootScope.isBusy = true; - var result = await services.register($scope.user); - if (result.success) { - await apiService.getAllSettings(); - var loginData = { - username: $scope.user.username, - password: $scope.user.password, - rememberMe: true, - }; - var result = await authService.login(loginData, false); - if (result.success) { - $rootScope.isBusy = false; - $rootScope.goToPath("/init/step3"); - $scope.$apply(); - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } - } - }; - $scope.advanceSetup = async function () { - if (!$scope.user.isAgreed) { - var ele = document.getElementById("notTNCYetChecked"); - ele.style.display = "block"; - } else { - if ($scope.password !== $scope.confirmPassword) { - $rootScope.showErrors(["Confirm Password is not matched"]); - } else { - $rootScope.isBusy = true; - var result = await services.register($scope.user); - if (result.success) { - var loginData = { - username: $scope.user.username, - password: $scope.user.password, - rememberMe: true, - }; - var result = await authService.login(loginData); - if (result) { - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } - } - }; - }, -]); - -"use strict"; -app.factory("Step2Services", [ - "$http", - "ApiService", - "CommonService", - function ($http, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var usersServiceFactory = {}; - var _register = async function (user) { - var req = { - method: "POST", - url: "/rest/mix-tenancy/setup/init-account", - data: JSON.stringify(user), - }; - - return await apiService.sendRequest(req, true); - }; - - usersServiceFactory.register = _register; - return usersServiceFactory; - }, -]); - "use strict"; app.controller("Step1Controller", [ "$scope", @@ -322,66 +201,123 @@ app.factory("Step1Services", [ ]); "use strict"; -app.controller("Step4Controller", [ +app.controller("Step2Controller", [ "$scope", "$rootScope", "ApiService", + "Step2Services", "AuthService", - "Step4Services", - function ($scope, $rootScope, apiService, authService, service) { - $scope.importThemeDto = null; - $scope.canContinue = true; - $scope.data = []; + function ($scope, $rootScope, apiService, services, authService) { + $scope.user = { + username: "", + email: "", + password: "", + confirmPassword: "", + isAgreed: false, + }; $scope.init = async function () { await apiService.getGlobalSettings(); - var getData = await service.loadTheme(); - if (getData.success) { - $scope.importThemeDto = getData.data; - $rootScope.isBusy = false; - $scope.$apply(); + }; + $scope.register = async function () { + if (!$scope.user.isAgreed) { + var ele = document.getElementById("notTNCYetChecked"); + ele.style.display = "block"; + } else { + if ($scope.password !== $scope.confirmPassword) { + $rootScope.showErrors(["Confirm Password is not matched"]); + } else { + $rootScope.isBusy = true; + var result = await services.register($scope.user); + if (result.success) { + await apiService.getAllSettings(); + var loginData = { + username: $scope.user.username, + password: $scope.user.password, + rememberMe: true, + }; + var result = await authService.login(loginData, false); + if (result.success) { + $rootScope.isBusy = false; + $rootScope.goToPath("/init/step3"); + $scope.$apply(); + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } } }; - $scope.submit = async function () { - $rootScope.isBusy = true; - var result = await service.submit($scope.importThemeDto); - if (result.success) { - window.top.location = "/"; + $scope.advanceSetup = async function () { + if (!$scope.user.isAgreed) { + var ele = document.getElementById("notTNCYetChecked"); + ele.style.display = "block"; } else { - if (result) { - $rootScope.showErrors(result.errors); + if ($scope.password !== $scope.confirmPassword) { + $rootScope.showErrors(["Confirm Password is not matched"]); + } else { + $rootScope.isBusy = true; + var result = await services.register($scope.user); + if (result.success) { + var loginData = { + username: $scope.user.username, + password: $scope.user.password, + rememberMe: true, + }; + var result = await authService.login(loginData); + if (result) { + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } } - $rootScope.isBusy = false; - $scope.$apply(); } }; }, ]); "use strict"; -app.factory("Step4Services", [ +app.factory("Step2Services", [ + "$http", "ApiService", "CommonService", - function (apiService, commonService) { - var service = {}; + function ($http, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - var _loadTheme = async function () { - var req = { - method: "GET", - url: "/rest/mix-tenancy/setup/load-theme", - }; - return await apiService.sendRequest(req); - }; - var _submit = async function (data) { + var usersServiceFactory = {}; + var _register = async function (user) { var req = { method: "POST", - url: "/rest/mix-tenancy/setup/import-theme", - data: JSON.stringify(data), + url: "/rest/mix-tenancy/setup/init-account", + data: JSON.stringify(user), }; - return await apiService.sendRequest(req); + + return await apiService.sendRequest(req, true); }; - service.loadTheme = _loadTheme; - service.submit = _submit; - return service; + + usersServiceFactory.register = _register; + return usersServiceFactory; }, ]); @@ -506,6 +442,70 @@ app.factory("Step3Services", [ }, ]); +"use strict"; +app.controller("Step4Controller", [ + "$scope", + "$rootScope", + "ApiService", + "AuthService", + "Step4Services", + function ($scope, $rootScope, apiService, authService, service) { + $scope.importThemeDto = null; + $scope.canContinue = true; + $scope.data = []; + $scope.init = async function () { + await apiService.getGlobalSettings(); + var getData = await service.loadTheme(); + if (getData.success) { + $scope.importThemeDto = getData.data; + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.submit = async function () { + $rootScope.isBusy = true; + var result = await service.submit($scope.importThemeDto); + if (result.success) { + window.top.location = "/"; + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("Step4Services", [ + "ApiService", + "CommonService", + function (apiService, commonService) { + var service = {}; + + var _loadTheme = async function () { + var req = { + method: "GET", + url: "/rest/mix-tenancy/setup/load-theme", + }; + return await apiService.sendRequest(req); + }; + var _submit = async function (data) { + var req = { + method: "POST", + url: "/rest/mix-tenancy/setup/import-theme", + data: JSON.stringify(data), + }; + return await apiService.sendRequest(req); + }; + service.loadTheme = _loadTheme; + service.submit = _submit; + return service; + }, +]); + "use strict"; app.controller("Step5Controller", [ "$scope", @@ -568,9 +568,9 @@ app.factory("Step5Services", [ }, ]); -modules.component("mssqlLocalInfo", { +modules.component("mssqlInfo", { templateUrl: - "/mix-app/views/app-init/pages/step1/components/mssql-local-info/view.html", + "/mix-app/views/app-init/pages/step1/components/mssql-info/view.html", controller: [ "$rootScope", function ($rootScope) { @@ -582,9 +582,9 @@ modules.component("mssqlLocalInfo", { }, }); -modules.component("mssqlInfo", { +modules.component("mssqlLocalInfo", { templateUrl: - "/mix-app/views/app-init/pages/step1/components/mssql-info/view.html", + "/mix-app/views/app-init/pages/step1/components/mssql-local-info/view.html", controller: [ "$rootScope", function ($rootScope) { diff --git a/src/applications/mixcore/wwwroot/mix-app/js/app-portal-required.min.js b/src/applications/mixcore/wwwroot/mix-app/js/app-portal-required.min.js index 0e8aedb7f..97a10ce8e 100644 --- a/src/applications/mixcore/wwwroot/mix-app/js/app-portal-required.min.js +++ b/src/applications/mixcore/wwwroot/mix-app/js/app-portal-required.min.js @@ -1 +1 @@ -/* Sun Feb 04 2024 20:54:30 GMT+0700 (Indochina Time) */!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(e,t){"use strict";var n=[],o=Object.getPrototypeOf,i=n.slice,r=n.flat?function(e){return n.flat.call(e)}:function(e){return n.concat.apply([],e)},s=n.push,a=n.indexOf,l={},u=l.toString,c=l.hasOwnProperty,d=c.toString,f=d.call(Object),h={},p=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},g=function(e){return null!=e&&e===e.window},m=e.document,b={type:!0,src:!0,nonce:!0,noModule:!0};function v(e,t,n){var o,i,r=(n=n||m).createElement("script");if(r.text=e,t)for(o in b)(i=t[o]||t.getAttribute&&t.getAttribute(o))&&r.setAttribute(o,i);n.head.appendChild(r).parentNode.removeChild(r)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[u.call(e)]||"object":typeof e}var y="3.6.0",_=function(e,t){return new _.fn.init(e,t)};function F(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!p(e)&&!g(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),G=new RegExp(H),X=new RegExp("^"+I+"$"),V={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+H),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("^(?:"+B+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},K=/HTML$/i,Y=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,J=/^[^{]+\{\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))},oe=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){f()},se=ye(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{L.apply(S=P.call(_.childNodes),_.childNodes),S[_.childNodes.length].nodeType}catch(t){L={apply:S.length?function(e,t){j.apply(e,P.call(t))}:function(e,t){for(var n=e.length,o=0;e[n++]=t[o++];);e.length=n-1}}}function ae(e,t,o,i){var r,a,u,c,d,p,b,v=t&&t.ownerDocument,_=t?t.nodeType:9;if(o=o||[],"string"!=typeof e||!e||1!==_&&9!==_&&11!==_)return o;if(!i&&(f(t),t=t||h,g)){if(11!==_&&(d=Z.exec(e)))if(r=d[1]){if(9===_){if(!(u=t.getElementById(r)))return o;if(u.id===r)return o.push(u),o}else if(v&&(u=v.getElementById(r))&&x(t,u)&&u.id===r)return o.push(u),o}else{if(d[2])return L.apply(o,t.getElementsByTagName(e)),o;if((r=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(o,t.getElementsByClassName(r)),o}if(n.qsa&&!k[e+" "]&&(!m||!m.test(e))&&(1!==_||"object"!==t.nodeName.toLowerCase())){if(b=e,v=t,1===_&&(U.test(e)||W.test(e))){for((v=ee.test(e)&&be(t.parentNode)||t)===t&&n.scope||((c=t.getAttribute("id"))?c=c.replace(oe,ie):t.setAttribute("id",c=y)),a=(p=s(e)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+xe(p[a]);b=p.join(",")}try{return L.apply(o,v.querySelectorAll(b)),o}catch(t){k(e,!0)}finally{c===y&&t.removeAttribute("id")}}}return l(e.replace($,"$1"),t,o,i)}function le(){var e=[];return function t(n,i){return e.push(n+" ")>o.cacheLength&&delete t[e.shift()],t[n+" "]=i}}function ue(e){return e[y]=!0,e}function ce(e){var t=h.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var n=e.split("|"),i=n.length;i--;)o.attrHandle[n[i]]=t}function fe(e,t){var n=t&&e,o=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(o)return o;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function he(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ge(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&se(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function me(e){return ue(function(t){return t=+t,ue(function(n,o){for(var i,r=e([],n.length,t),s=r.length;s--;)n[i=r[s]]&&(n[i]=!(o[i]=n[i]))})})}function be(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ae.support={},r=ae.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!K.test(t||n&&n.nodeName||"HTML")},f=ae.setDocument=function(e){var t,i,s=e?e.ownerDocument||e:_;return s!=h&&9===s.nodeType&&s.documentElement&&(p=(h=s).documentElement,g=!r(h),_!=h&&(i=h.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.scope=ce(function(e){return p.appendChild(e).appendChild(h.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),n.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ce(function(e){return e.appendChild(h.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=J.test(h.getElementsByClassName),n.getById=ce(function(e){return p.appendChild(e).id=y,!h.getElementsByName||!h.getElementsByName(y).length}),n.getById?(o.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},o.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(o.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},o.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,o,i,r=t.getElementById(e);if(r){if((n=r.getAttributeNode("id"))&&n.value===e)return[r];for(i=t.getElementsByName(e),o=0;r=i[o++];)if((n=r.getAttributeNode("id"))&&n.value===e)return[r]}return[]}}),o.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,o=[],i=0,r=t.getElementsByTagName(e);if("*"===e){for(;n=r[i++];)1===n.nodeType&&o.push(n);return o}return r},o.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},b=[],m=[],(n.qsa=J.test(h.querySelectorAll))&&(ce(function(e){var t;p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+M+"*(?:value|"+B+")"),e.querySelectorAll("[id~="+y+"-]").length||m.push("~="),(t=h.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+y+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=h.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(n.matchesSelector=J.test(v=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ce(function(e){n.disconnectedMatch=v.call(e,"*"),v.call(e,"[s!='']:x"),b.push("!=",H)}),m=m.length&&new RegExp(m.join("|")),b=b.length&&new RegExp(b.join("|")),t=J.test(p.compareDocumentPosition),x=t||J.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,o=t&&t.parentNode;return e===o||!(!o||1!==o.nodeType||!(n.contains?n.contains(o):e.compareDocumentPosition&&16&e.compareDocumentPosition(o)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},T=t?function(e,t){if(e===t)return d=!0,0;var o=!e.compareDocumentPosition-!t.compareDocumentPosition;return o||(1&(o=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===o?e==h||e.ownerDocument==_&&x(_,e)?-1:t==h||t.ownerDocument==_&&x(_,t)?1:c?N(c,e)-N(c,t):0:4&o?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,o=0,i=e.parentNode,r=t.parentNode,s=[e],a=[t];if(!i||!r)return e==h?-1:t==h?1:i?-1:r?1:c?N(c,e)-N(c,t):0;if(i===r)return fe(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[o]===a[o];)o++;return o?fe(s[o],a[o]):s[o]==_?-1:a[o]==_?1:0}),h},ae.matches=function(e,t){return ae(e,null,null,t)},ae.matchesSelector=function(e,t){if(f(e),n.matchesSelector&&g&&!k[t+" "]&&(!b||!b.test(t))&&(!m||!m.test(t)))try{var o=v.call(e,t);if(o||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return o}catch(e){k(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]||ae.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]&&ae.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&G.test(n)&&(t=s(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=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(o){var i=ae.attr(o,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function O(e,t,n){return p(t)?_.grep(e,function(e,o){return!!t.call(e,o,e)!==n}):t.nodeType?_.grep(e,function(e){return e===t!==n}):"string"!=typeof t?_.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(_.fn.init=function(e,t,n){var o,i;if(!e)return this;if(n=n||S,"string"==typeof e){if(!(o="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:D.exec(e))||!o[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(o[1]){if(t=t instanceof _?t[0]:t,_.merge(this,_.parseHTML(o[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),T.test(o[1])&&_.isPlainObject(t))for(o in t)p(this[o])?this[o](t[o]):this.attr(o,t[o]);return this}return(i=m.getElementById(o[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):p(e)?void 0!==n.ready?n.ready(e):e(_):_.makeArray(e,this)}).prototype=_.fn,S=_(m);var j=/^(?:parents|prev(?:Until|All))/,L={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}_.fn.extend({has:function(e){var t=_(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;ce=m.createDocumentFragment().appendChild(m.createElement("div")),(de=m.createElement("input")).setAttribute("type","radio"),de.setAttribute("checked","checked"),de.setAttribute("name","t"),ce.appendChild(de),h.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",h.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",h.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function me(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&k(e,t)?_.merge([e],n):n}function be(e,t){for(var n=0,o=e.length;n",""]);var ve=/<|&#?\w+;/;function xe(e,t,n,o,i){for(var r,s,a,l,u,c,d=t.createDocumentFragment(),f=[],h=0,p=e.length;h\s*$/g;function Oe(e,t){return k(e,"table")&&k(11!==t.nodeType?t:t.firstChild,"tr")&&_(e).children("tbody")[0]||e}function Se(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function De(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,o,i,r,s,a;if(1===t.nodeType){if(K.hasData(e)&&(a=K.get(e).events))for(i in K.remove(t,"handle events"),a)for(n=0,o=a[i].length;n").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),m.head.appendChild(t[0])},abort:function(){n&&n()}}});var qt,Wt=[],Ut=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Wt.pop()||_.expando+"_"+_t.guid++;return this[e]=!0,e}}),_.ajaxPrefilter("json jsonp",function(t,n,o){var i,r,s,a=!1!==t.jsonp&&(Ut.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=p(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,"$1"+i):!1!==t.jsonp&&(t.url+=(Ft.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||_.error(i+" was not called"),s[0]},t.dataTypes[0]="json",r=e[i],e[i]=function(){s=arguments},o.always(function(){void 0===r?_(e).removeProp(i):e[i]=r,t[i]&&(t.jsonpCallback=n.jsonpCallback,Wt.push(i)),s&&p(r)&&r(s[0]),s=r=void 0}),"script"}),h.createHTMLDocument=((qt=m.implementation.createHTMLDocument("").body).innerHTML="
",2===qt.childNodes.length),_.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(h.createHTMLDocument?((o=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(o)):t=m),r=!n&&[],(i=T.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,r),r&&r.length&&_(r).remove(),_.merge([],i.childNodes)));var o,i,r},_.fn.load=function(e,t,n){var o,i,r,s=this,a=e.indexOf(" ");return-1").append(_.parseHTML(e)).find(o):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},_.expr.pseudos.animated=function(e){return _.grep(_.timers,function(t){return e===t.elem}).length},_.offset={setOffset:function(e,t,n){var o,i,r,s,a,l,u=_.css(e,"position"),c=_(e),d={};"static"===u&&(e.style.position="relative"),a=c.offset(),r=_.css(e,"top"),l=_.css(e,"left"),("absolute"===u||"fixed"===u)&&-1<(r+l).indexOf("auto")?(s=(o=c.position()).top,i=o.left):(s=parseFloat(r)||0,i=parseFloat(l)||0),p(t)&&(t=t.call(e,n,_.extend({},a))),null!=t.top&&(d.top=t.top-a.top+s),null!=t.left&&(d.left=t.left-a.left+i),"using"in t?t.using.call(e,d):c.css(d)}},_.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){_.offset.setOffset(this,e,t)});var t,n,o=this[0];return o?o.getClientRects().length?(t=o.getBoundingClientRect(),n=o.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,o=this[0],i={top:0,left:0};if("fixed"===_.css(o,"position"))t=o.getBoundingClientRect();else{for(t=this.offset(),n=o.ownerDocument,e=o.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===_.css(e,"position");)e=e.parentNode;e&&e!==o&&1===e.nodeType&&((i=_(e).offset()).top+=_.css(e,"borderTopWidth",!0),i.left+=_.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-_.css(o,"marginTop",!0),left:t.left-i.left-_.css(o,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===_.css(e,"position");)e=e.offsetParent;return e||oe})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;_.fn[e]=function(o){return $(this,function(e,o,i){var r;if(g(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===i)return r?r[t]:e[o];r?r.scrollTo(n?r.pageXOffset:i,n?i:r.pageYOffset):e[o]=i},e,o,arguments.length)}}),_.each(["top","left"],function(e,t){_.cssHooks[t]=He(h.pixelPosition,function(e,n){if(n)return n=Re(e,t),Ne.test(n)?_(e).position()[t]+"px":n})}),_.each({Height:"height",Width:"width"},function(e,t){_.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,o){_.fn[o]=function(i,r){var s=arguments.length&&(n||"boolean"!=typeof i),a=n||(!0===i||!0===r?"margin":"border");return $(this,function(t,n,i){var r;return g(t)?0===o.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(r=t.documentElement,Math.max(t.body["scroll"+e],r["scroll"+e],t.body["offset"+e],r["offset"+e],r["client"+e])):void 0===i?_.css(t,n,a):_.style(t,n,i,a)},t,s?i:void 0,s)}})}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){_.fn[t]=function(e){return this.on(t,e)}}),_.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,o){return this.on(t,e,n,o)},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)}}),_.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,t){_.fn[t]=function(e,n){return 0[].concat(...Element.prototype.querySelectorAll.call(t,e)),findOne:(e,t=document.documentElement)=>Element.prototype.querySelector.call(t,e),children:(e,t)=>[].concat(...e.children).filter(e=>e.matches(t)),parents(e,t){const n=[];let o=e.parentNode;for(;o&&o.nodeType===Node.ELEMENT_NODE&&3!==o.nodeType;)o.matches(t)&&n.push(o),o=o.parentNode;return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]}},o=e=>{do{e+=Math.floor(1e6*Math.random())}while(document.getElementById(e));return e},i=e=>{let t=e.getAttribute("data-bs-target");if(!t||"#"===t){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n="#"+n.split("#")[1]),t=n&&"#"!==n?n.trim():null}return t},r=e=>{const t=i(e);return t&&document.querySelector(t)?t:null},s=e=>{const t=i(e);return t?document.querySelector(t):null},a=e=>{e.dispatchEvent(new Event("transitionend"))},l=e=>!(!e||"object"!=typeof e)&&(void 0!==e.jquery&&(e=e[0]),void 0!==e.nodeType),u=e=>l(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?n.findOne(e):null,c=(e,t,n)=>{Object.keys(n).forEach(o=>{const i=n[o],r=t[o],s=r&&l(r)?"element":null==(a=r)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(i).test(s))throw new TypeError(`${e.toUpperCase()}: Option "${o}" provided type "${s}" but expected type "${i}".`)})},d=e=>!(!l(e)||0===e.getClientRects().length)&&"visible"===getComputedStyle(e).getPropertyValue("visibility"),f=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled")),h=e=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?h(e.parentNode):null},p=()=>{},g=e=>e.offsetHeight,m=()=>{const{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},b=[],v=()=>"rtl"===document.documentElement.dir,x=e=>{var t;t=(()=>{const t=m();if(t){const n=e.NAME,o=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=(()=>(t.fn[n]=o,e.jQueryInterface))}}),"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{b.forEach(e=>e())}),b.push(t)):t()},y=e=>{"function"==typeof e&&e()},_=(e,t,n=!0)=>{if(!n)return void y(e);const o=(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const o=Number.parseFloat(t),i=Number.parseFloat(n);return o||i?(t=t.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(n))):0})(t)+5;let i=!1;const r=({target:n})=>{n===t&&(i=!0,t.removeEventListener("transitionend",r),y(e))};t.addEventListener("transitionend",r),setTimeout(()=>{i||a(t)},o)},F=(e,t,n,o)=>{let i=e.indexOf(t);if(-1===i)return e[!n&&o?e.length-1:0];const r=e.length;return i+=n?1:-1,o&&(i=(i+r)%r),e[Math.max(0,Math.min(i,r-1))]},w=/[^.]*(?=\..*)\.|.*/,E=/\..*/,C=/::\d+$/,A={};let k=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},O=/^(mouseenter|mouseleave)/i,S=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function D(e,t){return t&&`${t}::${k++}`||e.uidEvent||k++}function j(e){const t=D(e);return e.uidEvent=t,A[t]=A[t]||{},A[t]}function L(e,t,n=null){const o=Object.keys(e);for(let i=0,r=o.length;i(function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)});o?o=e(o):n=e(n)}const[r,s,a]=P(t,n,o),l=j(e),u=l[a]||(l[a]={}),c=L(u,s,r?n:null);if(c)return void(c.oneOff=c.oneOff&&i);const d=D(s,t.replace(w,"")),f=r?function(e,t,n){return function o(i){const r=e.querySelectorAll(t);for(let{target:s}=i;s&&s!==this;s=s.parentNode)for(let a=r.length;a--;)if(r[a]===s)return i.delegateTarget=s,o.oneOff&&I.off(e,i.type,t,n),n.apply(s,[i]);return null}}(e,n,o):function(e,t){return function n(o){return o.delegateTarget=e,n.oneOff&&I.off(e,o.type,t),t.apply(e,[o])}}(e,n);f.delegationSelector=r?n:null,f.originalHandler=s,f.oneOff=i,f.uidEvent=d,u[d]=f,e.addEventListener(a,f,r)}function B(e,t,n,o,i){const r=L(t[n],o,i);r&&(e.removeEventListener(n,r,Boolean(i)),delete t[n][r.uidEvent])}function M(e){return e=e.replace(E,""),T[e]||e}const I={on(e,t,n,o){N(e,t,n,o,!1)},one(e,t,n,o){N(e,t,n,o,!0)},off(e,t,n,o){if("string"!=typeof t||!e)return;const[i,r,s]=P(t,n,o),a=s!==t,l=j(e),u=t.startsWith(".");if(void 0!==r){if(!l||!l[s])return;return void B(e,l,s,r,i?n:null)}u&&Object.keys(l).forEach(n=>{!function(e,t,n,o){const i=t[n]||{};Object.keys(i).forEach(r=>{if(r.includes(o)){const o=i[r];B(e,t,n,o.originalHandler,o.delegationSelector)}})}(e,l,n,t.slice(1))});const c=l[s]||{};Object.keys(c).forEach(n=>{const o=n.replace(C,"");if(!a||t.includes(o)){const t=c[n];B(e,l,s,t.originalHandler,t.delegationSelector)}})},trigger(e,t,n){if("string"!=typeof t||!e)return null;const o=m(),i=M(t),r=t!==i,s=S.has(i);let a,l=!0,u=!0,c=!1,d=null;return r&&o&&(a=o.Event(t,n),o(e).trigger(a),l=!a.isPropagationStopped(),u=!a.isImmediatePropagationStopped(),c=a.isDefaultPrevented()),s?(d=document.createEvent("HTMLEvents")).initEvent(i,l,!0):d=new CustomEvent(t,{bubbles:l,cancelable:!0}),void 0!==n&&Object.keys(n).forEach(e=>{Object.defineProperty(d,e,{get:()=>n[e]})}),c&&d.preventDefault(),u&&e.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},R=new Map;var H={set(e,t,n){R.has(e)||R.set(e,new Map);const o=R.get(e);o.has(t)||0===o.size?o.set(t,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(o.keys())[0]}.`)},get:(e,t)=>R.has(e)&&R.get(e).get(t)||null,remove(e,t){if(!R.has(e))return;const n=R.get(e);n.delete(t),0===n.size&&R.delete(e)}};class z{constructor(e){(e=u(e))&&(this._element=e,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),I.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,t,n=!0){_(e,t,n)}static getInstance(e){return H.get(e,this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,"object"==typeof t?t: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 $ extends z{static get NAME(){return"alert"}close(e){const t=e?this._getRootElement(e):this._element,n=this._triggerCloseEvent(t);null===n||n.defaultPrevented||this._removeElement(t)}_getRootElement(e){return s(e)||e.closest(".alert")}_triggerCloseEvent(e){return I.trigger(e,"close.bs.alert")}_removeElement(e){e.classList.remove("show");const t=e.classList.contains("fade");this._queueCallback(()=>this._destroyElement(e),e,t)}_destroyElement(e){e.remove(),I.trigger(e,"closed.bs.alert")}static jQueryInterface(e){return this.each(function(){const t=$.getOrCreateInstance(this);"close"===e&&t[e](this)})}static handleDismiss(e){return function(t){t&&t.preventDefault(),e.close(this)}}}I.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',$.handleDismiss(new $)),x($);class q extends z{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each(function(){const t=q.getOrCreateInstance(this);"toggle"===e&&t[e]()})}}function W(e){return"true"===e||"false"!==e&&(e===Number(e).toString()?Number(e):""===e||"null"===e?null:e)}function U(e){return e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())}I.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',e=>{e.preventDefault();const t=e.target.closest('[data-bs-toggle="button"]');q.getOrCreateInstance(t).toggle()}),x(q);const G={setDataAttribute(e,t,n){e.setAttribute("data-bs-"+U(t),n)},removeDataAttribute(e,t){e.removeAttribute("data-bs-"+U(t))},getDataAttributes(e){if(!e)return{};const t={};return Object.keys(e.dataset).filter(e=>e.startsWith("bs")).forEach(n=>{let o=n.replace(/^bs/,"");o=o.charAt(0).toLowerCase()+o.slice(1,o.length),t[o]=W(e.dataset[n])}),t},getDataAttribute:(e,t)=>W(e.getAttribute("data-bs-"+U(t))),offset(e){const t=e.getBoundingClientRect();return{top:t.top+document.body.scrollTop,left:t.left+document.body.scrollLeft}},position:e=>({top:e.offsetTop,left:e.offsetLeft})},X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},V={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},K="next",Y="prev",Q="left",J="right",Z={ArrowLeft:J,ArrowRight:Q};class ee extends z{constructor(e,t){super(e),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(t),this._indicatorsElement=n.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return"carousel"}next(){this._slide(K)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(Y)}pause(e){e||(this._isPaused=!0),n.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(a(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(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(e){this._activeElement=n.findOne(".active.carousel-item",this._element);const t=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void I.one(this._element,"slid.bs.carousel",()=>this.to(e));if(t===e)return this.pause(),void this.cycle();const o=e>t?K:Y;this._slide(o,this._items[e])}_getConfig(e){return e={...X,...G.getDataAttributes(this._element),..."object"==typeof e?e:{}},c("carousel",e,V),e}_handleSwipe(){const e=Math.abs(this.touchDeltaX);if(e<=40)return;const t=e/this.touchDeltaX;this.touchDeltaX=0,t&&this._slide(t>0?J:Q)}_addEventListeners(){this._config.keyboard&&I.on(this._element,"keydown.bs.carousel",e=>this._keydown(e)),"hover"===this._config.pause&&(I.on(this._element,"mouseenter.bs.carousel",e=>this.pause(e)),I.on(this._element,"mouseleave.bs.carousel",e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType?this._pointerEvent||(this.touchStartX=e.touches[0].clientX):this.touchStartX=e.clientX},t=e=>{this.touchDeltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this.touchStartX},o=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType||(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(e=>this.cycle(e),500+this._config.interval))};n.find(".carousel-item img",this._element).forEach(e=>{I.on(e,"dragstart.bs.carousel",e=>e.preventDefault())}),this._pointerEvent?(I.on(this._element,"pointerdown.bs.carousel",t=>e(t)),I.on(this._element,"pointerup.bs.carousel",e=>o(e)),this._element.classList.add("pointer-event")):(I.on(this._element,"touchstart.bs.carousel",t=>e(t)),I.on(this._element,"touchmove.bs.carousel",e=>t(e)),I.on(this._element,"touchend.bs.carousel",e=>o(e)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=Z[e.key];t&&(e.preventDefault(),this._slide(t))}_getItemIndex(e){return this._items=e&&e.parentNode?n.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,t){const n=e===K;return F(this._items,t,n,this._config.wrap)}_triggerSlideEvent(e,t){const o=this._getItemIndex(e),i=this._getItemIndex(n.findOne(".active.carousel-item",this._element));return I.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:t,from:i,to:o})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const t=n.findOne(".active",this._indicatorsElement);t.classList.remove("active"),t.removeAttribute("aria-current");const o=n.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{I.trigger(this._element,"slid.bs.carousel",{relatedTarget:s,direction:f,from:r,to:a})};if(this._element.classList.contains("slide")){s.classList.add(d),g(s),i.classList.add(c),s.classList.add(c);const e=()=>{s.classList.remove(c,d),s.classList.add("active"),i.classList.remove("active",d,c),this._isSliding=!1,setTimeout(h,0)};this._queueCallback(e,i,!0)}else i.classList.remove("active"),s.classList.add("active"),this._isSliding=!1,h();l&&this.cycle()}_directionToOrder(e){return[J,Q].includes(e)?v()?e===Q?Y:K:e===Q?K:Y:e}_orderToDirection(e){return[K,Y].includes(e)?v()?e===Y?Q:J:e===Y?J:Q:e}static carouselInterface(e,t){const n=ee.getOrCreateInstance(e,t);let{_config:o}=n;"object"==typeof t&&(o={...o,...t});const i="string"==typeof t?t:o.slide;if("number"==typeof t)n.to(t);else if("string"==typeof i){if(void 0===n[i])throw new TypeError(`No method named "${i}"`);n[i]()}else o.interval&&o.ride&&(n.pause(),n.cycle())}static jQueryInterface(e){return this.each(function(){ee.carouselInterface(this,e)})}static dataApiClickHandler(e){const t=s(this);if(!t||!t.classList.contains("carousel"))return;const n={...G.getDataAttributes(t),...G.getDataAttributes(this)},o=this.getAttribute("data-bs-slide-to");o&&(n.interval=!1),ee.carouselInterface(t,n),o&&ee.getInstance(t).to(o),e.preventDefault()}}I.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",ee.dataApiClickHandler),I.on(window,"load.bs.carousel.data-api",()=>{const e=n.find('[data-bs-ride="carousel"]');for(let t=0,n=e.length;te===this._element);null!==i&&s.length&&(this._selector=i,this._triggerArray.push(t))}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 te}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 e,t;this._parent&&(0===(e=n.find(".show, .collapsing",this._parent).filter(e=>"string"==typeof this._config.parent?e.getAttribute("data-bs-parent")===this._config.parent:e.classList.contains("collapse"))).length&&(e=null));const o=n.findOne(this._selector);if(e){const n=e.find(e=>o!==e);if((t=n?oe.getInstance(n):null)&&t._isTransitioning)return}if(I.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e&&e.forEach(e=>{o!==e&&oe.collapseInterface(e,"hide"),t||H.set(e,"bs.collapse",null)});const i=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[i]=0,this._triggerArray.length&&this._triggerArray.forEach(e=>{e.classList.remove("collapsed"),e.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const r="scroll"+(i[0].toUpperCase()+i.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[i]="",this.setTransitioning(!1),I.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[i]=this._element[r]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(I.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const e=this._getDimension();this._element.style[e]=this._element.getBoundingClientRect()[e]+"px",g(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const t=this._triggerArray.length;if(t>0)for(let e=0;e{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),I.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(e){this._isTransitioning=e}_getConfig(e){return(e={...te,...e}).toggle=Boolean(e.toggle),c("collapse",e,ne),e}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:e}=this._config;const t=`[data-bs-toggle="collapse"][data-bs-parent="${e=u(e)}"]`;return n.find(t,e).forEach(e=>{const t=s(e);this._addAriaAndCollapsedClass(t,[e])}),e}_addAriaAndCollapsedClass(e,t){if(!e||!t.length)return;const n=e.classList.contains("show");t.forEach(e=>{n?e.classList.remove("collapsed"):e.classList.add("collapsed"),e.setAttribute("aria-expanded",n)})}static collapseInterface(e,t){let n=oe.getInstance(e);const o={...te,...G.getDataAttributes(e),..."object"==typeof t&&t?t:{}};if(!n&&o.toggle&&"string"==typeof t&&/show|hide/.test(t)&&(o.toggle=!1),n||(n=new oe(e,o)),"string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){oe.collapseInterface(this,e)})}}I.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const t=G.getDataAttributes(this),o=r(this);n.find(o).forEach(e=>{const n=oe.getInstance(e);let o;n?(null===n._parent&&"string"==typeof t.parent&&(n._config.parent=t.parent,n._parent=n._getParent()),o="toggle"):o=t,oe.collapseInterface(e,o)})}),x(oe);const ie=new RegExp("ArrowUp|ArrowDown|Escape"),re=v()?"top-end":"top-start",se=v()?"top-start":"top-end",ae=v()?"bottom-end":"bottom-start",le=v()?"bottom-start":"bottom-end",ue=v()?"left-start":"right-start",ce=v()?"right-start":"left-start",de={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},fe={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class he extends z{constructor(e,t){super(e),this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return de}static get DefaultType(){return fe}static get NAME(){return"dropdown"}toggle(){f(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(f(this._element)||this._menu.classList.contains("show"))return;const e=he.getParentFromElement(this._element),n={relatedTarget:this._element};if(!I.trigger(this._element,"show.bs.dropdown",n).defaultPrevented){if(this._inNavbar)G.setDataAttribute(this._menu,"popper","none");else{if(void 0===t)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let n=this._element;"parent"===this._config.reference?n=e:l(this._config.reference)?n=u(this._config.reference):"object"==typeof this._config.reference&&(n=this._config.reference);const o=this._getPopperConfig(),i=o.modifiers.find(e=>"applyStyles"===e.name&&!1===e.enabled);this._popper=t.createPopper(n,this._menu,o),i&&G.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(e=>I.on(e,"mouseover",p)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),I.trigger(this._element,"shown.bs.dropdown",n)}}hide(){if(f(this._element)||!this._menu.classList.contains("show"))return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){I.on(this._element,"click.bs.dropdown",e=>{e.preventDefault(),this.toggle()})}_completeHide(e){I.trigger(this._element,"hide.bs.dropdown",e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>I.off(e,"mouseover",p)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),G.removeDataAttribute(this._menu,"popper"),I.trigger(this._element,"hidden.bs.dropdown",e))}_getConfig(e){if(e={...this.constructor.Default,...G.getDataAttributes(this._element),...e},c("dropdown",e,this.constructor.DefaultType),"object"==typeof e.reference&&!l(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return e}_getMenuElement(){return n.next(this._element,".dropdown-menu")[0]}_getPlacement(){const e=this._element.parentNode;if(e.classList.contains("dropend"))return ue;if(e.classList.contains("dropstart"))return ce;const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?se:re:t?le:ae}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:t}){const o=n.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(d);o.length&&F(o,t,"ArrowDown"===e,!o.includes(t)).focus()}static dropdownInterface(e,t){const n=he.getOrCreateInstance(e,t);if("string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){he.dropdownInterface(this,e)})}static clearMenus(e){if(e&&(2===e.button||"keyup"===e.type&&"Tab"!==e.key))return;const t=n.find('[data-bs-toggle="dropdown"]');for(let n=0,o=t.length;nthis.matches('[data-bs-toggle="dropdown"]')?this:n.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===e.key?(o().focus(),void he.clearMenus()):"ArrowUp"===e.key||"ArrowDown"===e.key?(t||o().click(),void he.getInstance(o())._selectMenuItem(e)):void(t&&"Space"!==e.key||he.clearMenus())}}I.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',he.dataApiKeydownHandler),I.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",he.dataApiKeydownHandler),I.on(document,"click.bs.dropdown.data-api",he.clearMenus),I.on(document,"keyup.bs.dropdown.data-api",he.clearMenus),I.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',function(e){e.preventDefault(),he.dropdownInterface(this)}),x(he);class pe{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",t=>t+e),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",t=>t+e),this._setElementAttributes(".sticky-top","marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const o=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+o)return;this._saveInitialAttribute(e,t);const i=window.getComputedStyle(e)[t];e.style[t]=n(Number.parseFloat(i))+"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(e,t){const n=e.style[t];n&&G.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{const n=G.getDataAttribute(e,t);void 0===n?e.style.removeProperty(t):(G.removeDataAttribute(e,t),e.style[t]=n)})}_applyManipulationCallback(e,t){l(e)?t(e):n.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}const ge={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},me={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class be{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){this._config.isVisible?(this._append(),this._config.isAnimated&&g(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{y(e)})):y(e)}hide(e){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),y(e)})):y(e)}_getElement(){if(!this._element){const e=document.createElement("div");e.className="modal-backdrop",this._config.isAnimated&&e.classList.add("fade"),this._element=e}return this._element}_getConfig(e){return(e={...ge,..."object"==typeof e?e:{}}).rootElement=u(e.rootElement),c("backdrop",e,me),e}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),I.on(this._getElement(),"mousedown.bs.backdrop",()=>{y(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(I.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){_(e,this._getElement(),this._config.isAnimated)}}const ve={backdrop:!0,keyboard:!0,focus:!0},xe={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class ye extends z{constructor(e,t){super(e),this._config=this._getConfig(t),this._dialog=n.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new pe}static get Default(){return ve}static get NAME(){return"modal"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||I.trigger(this._element,"show.bs.modal",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),I.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',e=>this.hide(e)),I.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{I.one(this._element,"mouseup.dismiss.bs.modal",e=>{e.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(e){if(e&&["A","AREA"].includes(e.target.tagName)&&e.preventDefault(),!this._isShown||this._isTransitioning)return;if(I.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),I.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),I.off(this._element,"click.dismiss.bs.modal"),I.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,t)}dispose(){[window,this._dialog].forEach(e=>I.off(e,".bs.modal")),this._backdrop.dispose(),super.dispose(),I.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new be({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(e){return e={...ve,...G.getDataAttributes(this._element),..."object"==typeof e?e:{}},c("modal",e,xe),e}_showElement(e){const t=this._isAnimated(),o=n.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,o&&(o.scrollTop=0),t&&g(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,I.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,t)}_enforceFocus(){I.off(document,"focusin.bs.modal"),I.on(document,"focusin.bs.modal",e=>{document===e.target||this._element===e.target||this._element.contains(e.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?I.on(this._element,"keydown.dismiss.bs.modal",e=>{this._config.keyboard&&"Escape"===e.key?(e.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==e.key||this._triggerBackdropTransition()}):I.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?I.on(window,"resize.bs.modal",()=>this._adjustDialog()):I.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(),I.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(e){I.on(this._element,"click.dismiss.bs.modal",e=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:e.target===e.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(I.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:e,scrollHeight:t,style:n}=this._element,o=t>document.documentElement.clientHeight;!o&&"hidden"===n.overflowY||e.contains("modal-static")||(o||(n.overflowY="hidden"),e.add("modal-static"),this._queueCallback(()=>{e.remove("modal-static"),o||this._queueCallback(()=>{n.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;(!n&&e&&!v()||n&&!e&&v())&&(this._element.style.paddingLeft=t+"px"),(n&&!e&&!v()||!n&&e&&v())&&(this._element.style.paddingRight=t+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=ye.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e](t)}})}}I.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',function(e){const t=s(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),I.one(t,"show.bs.modal",e=>{e.defaultPrevented||I.one(t,"hidden.bs.modal",()=>{d(this)&&this.focus()})}),ye.getOrCreateInstance(t).toggle(this)}),x(ye);const _e={backdrop:!0,keyboard:!0,scroll:!1},Fe={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class we extends z{constructor(e,t){super(e),this._config=this._getConfig(t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return _e}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||I.trigger(this._element,"show.bs.offcanvas",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new pe).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(()=>{I.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:e})},this._element,!0))}hide(){this._isShown&&(I.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(I.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 pe).reset(),I.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),I.off(document,"focusin.bs.offcanvas")}_getConfig(e){return e={..._e,...G.getDataAttributes(this._element),..."object"==typeof e?e:{}},c("offcanvas",e,Fe),e}_initializeBackDrop(){return new be({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(e){I.off(document,"focusin.bs.offcanvas"),I.on(document,"focusin.bs.offcanvas",t=>{document===t.target||e===t.target||e.contains(t.target)||e.focus()}),e.focus()}_addEventListeners(){I.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),I.on(this._element,"keydown.dismiss.bs.offcanvas",e=>{this._config.keyboard&&"Escape"===e.key&&this.hide()})}static jQueryInterface(e){return this.each(function(){const t=we.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}I.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',function(e){const t=s(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),f(this))return;I.one(t,"hidden.bs.offcanvas",()=>{d(this)&&this.focus()});const o=n.findOne(".offcanvas.show");o&&o!==t&&we.getInstance(o).hide(),we.getOrCreateInstance(t).toggle(this)}),I.on(window,"load.bs.offcanvas.data-api",()=>n.find(".offcanvas.show").forEach(e=>we.getOrCreateInstance(e).show())),x(we);const Ee=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ce=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Ae=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,ke=(e,t)=>{const n=e.nodeName.toLowerCase();if(t.includes(n))return!Ee.has(n)||Boolean(Ce.test(e.nodeValue)||Ae.test(e.nodeValue));const o=t.filter(e=>e instanceof RegExp);for(let e=0,t=o.length;e{ke(e,a)||n.removeAttribute(e.nodeName)})}return o.body.innerHTML}const Oe=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Se=new Set(["sanitize","allowList","sanitizeFn"]),De={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)"},je={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},Le={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},Pe={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 Ne extends z{constructor(e,n){if(void 0===t)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(n),this.tip=null,this._setListeners()}static get Default(){return Le}static get NAME(){return"tooltip"}static get Event(){return Pe}static get DefaultType(){return De}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(this._isEnabled)if(e){const t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),I.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 e=I.trigger(this._element,this.constructor.Event.SHOW),n=h(this._element),i=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!i)return;const r=this.getTipElement(),s=o(this.constructor.NAME);r.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this.setContent(),this._config.animation&&r.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,r,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:u}=this._config;H.set(r,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(u.appendChild(r),I.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=t.createPopper(this._element,r,this._getPopperConfig(l)),r.classList.add("show");const c="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;c&&r.classList.add(...c.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>{I.on(e,"mouseover",p)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const e=this._hoverState;this._hoverState=null,I.trigger(this._element,this.constructor.Event.SHOWN),"out"===e&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const e=this.getTipElement();if(I.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>I.off(e,"mouseover",p)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const t=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),I.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,t),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const e=document.createElement("div");return e.innerHTML=this._config.template,this.tip=e.children[0],this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")}setElementContent(e,t){if(null!==e)return l(t)?(t=u(t),void(this._config.html?t.parentNode!==e&&(e.innerHTML="",e.appendChild(t)):e.textContent=t.textContent)):void(this._config.html?(this._config.sanitize&&(t=Te(t,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=t):e.textContent=t)}getTitle(){let e=this._element.getAttribute("data-bs-original-title");return e||(e="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),e}updateAttachment(e){return"right"===e?"end":"left"===e?"start":e}_initializeOnDelegatedTarget(e,t){const n=this.constructor.DATA_KEY;return(t=t||H.get(e.delegateTarget,n))||(t=new this.constructor(e.delegateTarget,this._getDelegateConfig()),H.set(e.delegateTarget,n,t)),t}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(e){const t={placement:e,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:e=>this._handlePopperPlacementChange(e)}],onFirstUpdate:e=>{e.options.placement!==e.placement&&this._handlePopperPlacementChange(e)}};return{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_addAttachmentClass(e){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(e))}_getAttachment(e){return je[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(e=>{if("click"===e)I.on(this._element,this.constructor.Event.CLICK,this._config.selector,e=>this.toggle(e));else if("manual"!==e){const t="hover"===e?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,n="hover"===e?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;I.on(this._element,t,this._config.selector,e=>this._enter(e)),I.on(this._element,n,this._config.selector,e=>this._leave(e))}}),this._hideModalHandler=(()=>{this._element&&this.hide()}),I.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||"string"!==t)&&(this._element.setAttribute("data-bs-original-title",e||""),!e||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusin"===e.type?"focus":"hover"]=!0),t.getTipElement().classList.contains("show")||"show"===t._hoverState?t._hoverState="show":(clearTimeout(t._timeout),t._hoverState="show",t._config.delay&&t._config.delay.show?t._timeout=setTimeout(()=>{"show"===t._hoverState&&t.show()},t._config.delay.show):t.show())}_leave(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusout"===e.type?"focus":"hover"]=t._element.contains(e.relatedTarget)),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t._config.delay&&t._config.delay.hide?t._timeout=setTimeout(()=>{"out"===t._hoverState&&t.hide()},t._config.delay.hide):t.hide())}_isWithActiveTrigger(){for(const e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){const t=G.getDataAttributes(this._element);return Object.keys(t).forEach(e=>{Se.has(e)&&delete t[e]}),(e={...this.constructor.Default,...t,..."object"==typeof e&&e?e:{}}).container=!1===e.container?document.body:u(e.container),"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),c("tooltip",e,this.constructor.DefaultType),e.sanitize&&(e.template=Te(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){const e={};if(this._config)for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(Oe);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}_handlePopperPlacementChange(e){const{state:t}=e;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}static jQueryInterface(e){return this.each(function(){const t=Ne.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}x(Ne);const Be=new RegExp("(^|\\s)bs-popover\\S+","g"),Me={...Ne.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Ie={...Ne.DefaultType,content:"(string|element|function)"},Re={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 He extends Ne{static get Default(){return Me}static get NAME(){return"popover"}static get Event(){return Re}static get DefaultType(){return Ie}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||n.findOne(".popover-header",this.tip).remove(),this._getContent()||n.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".popover-header",e),this.getTitle());let t=this._getContent();"function"==typeof t&&(t=t.call(this._element)),this.setElementContent(n.findOne(".popover-body",e),t),e.classList.remove("fade","show")}_addAttachmentClass(e){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(e))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(Be);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}static jQueryInterface(e){return this.each(function(){const t=He.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}x(He);const ze={offset:10,method:"auto",target:""},$e={offset:"number",method:"string",target:"(string|element)"};class qe extends z{constructor(e,t){super(e),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(t),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,I.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return ze}static get NAME(){return"scrollspy"}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":"position",t="auto"===this._config.method?e:this._config.method,o="position"===t?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),n.find(this._selector).map(e=>{const i=r(e),s=i?n.findOne(i):null;if(s){const e=s.getBoundingClientRect();if(e.width||e.height)return[G[t](s).top+o,i]}return null}).filter(e=>e).sort((e,t)=>e[0]-t[0]).forEach(e=>{this._offsets.push(e[0]),this._targets.push(e[1])})}dispose(){I.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(e){if("string"!=typeof(e={...ze,...G.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}}).target&&l(e.target)){let{id:t}=e.target;t||(t=o("scrollspy"),e.target.id=t),e.target="#"+t}return c("scrollspy",e,$e),e}_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 e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){const e=this._targets[this._targets.length-1];this._activeTarget!==e&&this._activate(e)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(void 0===this._offsets[t+1]||e`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),o=n.findOne(t.join(","));o.classList.contains("dropdown-item")?(n.findOne(".dropdown-toggle",o.closest(".dropdown")).classList.add("active"),o.classList.add("active")):(o.classList.add("active"),n.parents(o,".nav, .list-group").forEach(e=>{n.prev(e,".nav-link, .list-group-item").forEach(e=>e.classList.add("active")),n.prev(e,".nav-item").forEach(e=>{n.children(e,".nav-link").forEach(e=>e.classList.add("active"))})})),I.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){n.find(this._selector).filter(e=>e.classList.contains("active")).forEach(e=>e.classList.remove("active"))}static jQueryInterface(e){return this.each(function(){const t=qe.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}I.on(window,"load.bs.scrollspy.data-api",()=>{n.find('[data-bs-spy="scroll"]').forEach(e=>new qe(e))}),x(qe);class We extends z{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let e;const t=s(this._element),o=this._element.closest(".nav, .list-group");if(o){const t="UL"===o.nodeName||"OL"===o.nodeName?":scope > li > .active":".active";e=(e=n.find(t,o))[e.length-1]}const i=e?I.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(I.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==i&&i.defaultPrevented)return;this._activate(this._element,o);const r=()=>{I.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),I.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};t?this._activate(t,t.parentNode,r):r()}_activate(e,t,o){const i=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?n.children(t,".active"):n.find(":scope > li > .active",t))[0],r=o&&i&&i.classList.contains("fade"),s=()=>this._transitionComplete(e,i,o);i&&r?(i.classList.remove("show"),this._queueCallback(s,e,!0)):s()}_transitionComplete(e,t,o){if(t){t.classList.remove("active");const e=n.findOne(":scope > .dropdown-menu .active",t.parentNode);e&&e.classList.remove("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),g(e),e.classList.contains("fade")&&e.classList.add("show");let i=e.parentNode;if(i&&"LI"===i.nodeName&&(i=i.parentNode),i&&i.classList.contains("dropdown-menu")){const t=e.closest(".dropdown");t&&n.find(".dropdown-toggle",t).forEach(e=>e.classList.add("active")),e.setAttribute("aria-expanded",!0)}o&&o()}static jQueryInterface(e){return this.each(function(){const t=We.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}I.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),f(this)||We.getOrCreateInstance(this).show()}),x(We);const Ue={animation:"boolean",autohide:"boolean",delay:"number"},Ge={animation:!0,autohide:!0,delay:5e3};class Xe extends z{constructor(e,t){super(e),this._config=this._getConfig(t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Ue}static get Default(){return Ge}static get NAME(){return"toast"}show(){I.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),g(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),I.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(I.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),I.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(e){return e={...Ge,...G.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}},c("toast",e,this.constructor.DefaultType),e}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t}if(t)return void this._clearTimeout();const n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){I.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),I.on(this._element,"mouseover.bs.toast",e=>this._onInteraction(e,!0)),I.on(this._element,"mouseout.bs.toast",e=>this._onInteraction(e,!1)),I.on(this._element,"focusin.bs.toast",e=>this._onInteraction(e,!0)),I.on(this._element,"focusout.bs.toast",e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Xe.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return x(Xe),{Alert:$,Button:q,Carousel:ee,Collapse:oe,Dropdown:he,Modal:ye,Offcanvas:we,Popover:He,ScrollSpy:qe,Tab:We,Toast:Xe,Tooltip:Ne}}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function t(t,o,i){o={content:{message:"object"==typeof o?o.message:o,title:o.title?o.title:"",icon:o.icon?o.icon:"",url:o.url?o.url:"#",target:o.target?o.target:"-"}},i=e.extend(!0,{},o,i),this.settings=e.extend(!0,{},n,i),this._defaults=n,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var n={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var e=arguments[0],t=1;t .progress-bar').removeClass("progress-bar-"+e.settings.type),e.settings.type=o[t],this.$ele.addClass("alert-"+o[t]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+o[t]);break;case"icon":var i=this.$ele.find('[data-notify="icon"]');"class"==e.settings.icon_type.toLowerCase()?i.removeClass(e.settings.content.icon).addClass(o[t]):(i.is("img")||i.find("img"),i.attr("src",o[t]));break;case"progress":var r=e.settings.delay-e.settings.delay*(o[t]/100);this.$ele.data("notify-delay",r),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",o[t]).css("width",o[t]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",o[t]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",o[t]);break;default:this.$ele.find('[data-notify="'+t+'"]').html(o[t])}var s=this.$ele.outerHeight()+parseInt(e.settings.spacing)+parseInt(e.settings.offset.y);e.reposition(s)},close:function(){e.close()}}},buildNotify:function(){var t=this.settings.content;this.$ele=e(String.format(this.settings.template,this.settings.type,t.title,t.message,t.url,t.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var t=this,n=this.settings.offset.y,o={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},i=!1,r=this.settings;switch(e('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return n=Math.max(n,parseInt(e(this).css(r.placement.from))+parseInt(e(this).outerHeight())+parseInt(r.spacing))}),1==this.settings.newest_on_top&&(n=this.settings.offset.y),o[this.settings.placement.from]=n+"px",this.settings.placement.align){case"left":case"right":o[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":o.left=0,o.right=0}this.$ele.css(o).addClass(this.settings.animate.enter),e.each(Array("webkit","moz","o","ms",""),function(e,n){t.$ele[0].style[n+"AnimationIterationCount"]=1}),e(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(n=parseInt(n)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(n)),e.isFunction(t.settings.onShow)&&t.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(e){i=!0}).one(this.animations.end,function(n){e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)}),setTimeout(function(){i||e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)},600)},bind:function(){var t=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){t.close()}),this.$ele.mouseover(function(t){e(this).data("data-hover","true")}).mouseout(function(t){e(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){t.$ele.data("notify-delay",t.settings.delay);var n=setInterval(function(){var e=parseInt(t.$ele.data("notify-delay"))-t.settings.timer;if("false"===t.$ele.data("data-hover")&&"pause"==t.settings.mouse_over||"pause"!=t.settings.mouse_over){var o=(t.settings.delay-e)/t.settings.delay*100;t.$ele.data("notify-delay",e),t.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",o).css("width",o+"%")}e<=-t.settings.timer&&(clearInterval(n),t.close())},t.settings.timer)}},close:function(){var t=this,n=parseInt(this.$ele.css(this.settings.placement.from)),o=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),t.reposition(n),e.isFunction(t.settings.onClose)&&t.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(e){o=!0}).one(this.animations.end,function(n){e(this).remove(),e.isFunction(t.settings.onClosed)&&t.settings.onClosed.call(this)}),setTimeout(function(){o||(t.$ele.remove(),t.settings.onClosed&&t.settings.onClosed(t.$ele))},600)},reposition:function(t){var n=this,o='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',i=this.$ele.nextAll(o);1==this.settings.newest_on_top&&(i=this.$ele.prevAll(o)),i.each(function(){e(this).css(n.settings.placement.from,t),t=parseInt(t)+parseInt(n.settings.spacing)+e(this).outerHeight()})}}),e.notify=function(e,n){return new t(this,e,n).notify},e.notifyDefaults=function(t){return n=e.extend(!0,{},n,t)},e.notifyClose=function(t){void 0===t||"all"==t?e("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):e('[data-notify-position="'+t+'"]').find('[data-notify="dismiss"]').trigger("click")}}),function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=15)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.data=t,this.text=n.text||t,this.options=n}},function(e,t,n){"use strict";var o;function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0});var r=t.SET_A=0,s=t.SET_B=1,a=t.SET_C=2,l=(t.SHIFT=98,t.START_A=103),u=t.START_B=104,c=t.START_C=105;t.MODULO=103,t.STOP=106,t.FNC1=207,t.SET_BY_CODE=(i(o={},l,r),i(o,u,s),i(o,c,a),o),t.SWAP={101:r,100:s,99:a},t.A_START_CHAR=String.fromCharCode(208),t.B_START_CHAR=String.fromCharCode(209),t.C_START_CHAR=String.fromCharCode(210),t.A_CHARS="[\0-_È-Ï]",t.B_CHARS="[ -È-Ï]",t.C_CHARS="(Ï*[0-9]{2}Ï*)",t.BARS=[11011001100,11001101100,11001100110,10010011e3,10010001100,10001001100,10011001e3,10011000100,10001100100,11001001e3,11001000100,11000100100,10110011100,10011011100,10011001110,10111001100,10011101100,10011100110,11001110010,11001011100,11001001110,11011100100,11001110100,11101101110,11101001100,11100101100,11100100110,11101100100,11100110100,11100110010,11011011e3,11011000110,11000110110,10100011e3,10001011e3,10001000110,10110001e3,10001101e3,10001100010,11010001e3,11000101e3,11000100010,10110111e3,10110001110,10001101110,10111011e3,10111000110,10001110110,11101110110,11010001110,11000101110,11011101e3,11011100010,11011101110,11101011e3,11101000110,11100010110,11101101e3,11101100010,11100011010,11101111010,11001000010,11110001010,1010011e4,10100001100,1001011e4,10010000110,10000101100,10000100110,1011001e4,10110000100,1001101e4,10011000010,10000110100,10000110010,11000010010,1100101e4,11110111010,11000010100,10001111010,10100111100,10010111100,10010011110,10111100100,10011110100,10011110010,11110100100,11110010100,11110010010,11011011110,11011110110,11110110110,10101111e3,10100011110,10001011110,10111101e3,10111100010,11110101e3,11110100010,10111011110,10111101110,11101011110,11110101110,11010000100,1101001e4,11010011100,1100011101011]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SIDE_BIN="101",t.MIDDLE_BIN="01010",t.BINARIES={L:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],G:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"],R:["1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"],O:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],E:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"]},t.EAN2_STRUCTURE=["LL","LG","GL","GG"],t.EAN5_STRUCTURE=["GGLLL","GLGLL","GLLGL","GLLLG","LGGLL","LLGGL","LLLGG","LGLGL","LGLLG","LLGLG"],t.EAN13_STRUCTURE=["LLLLLL","LLGLGG","LLGGLG","LLGGGL","LGLLGG","LGGLLG","LGGGLL","LGLGLG","LGLGGL","LGGLGL"]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(2);t.default=function(e,t,n){var i=e.split("").map(function(e,n){return o.BINARIES[t[n]]}).map(function(t,n){return t?t[e[n]]:""});if(n){var r=e.length-1;i=i.map(function(e,t){return t=200){r=e.shift()-105;var a=s.SWAP[r];void 0!==a?i=t.next(e,n+1,a):(o!==s.SET_A&&o!==s.SET_B||r!==s.SHIFT||(e[0]=o===s.SET_A?e[0]>95?e[0]-96:e[0]:e[0]<32?e[0]+96:e[0]),i=t.next(e,n+1,o))}else r=t.correctIndex(e,o),i=t.next(e,n+1,o);var l=r*n;return{result:t.getBar(r)+i.result,checksum:l+i.checksum}}}]),t}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mod10=function(e){for(var t=0,n=0;n10*n.width?10*n.width:n.fontSize,o.guardHeight=n.height+o.fontSize/2+n.textMargin,o}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,s(n(0)).default),o(t,[{key:"encode",value:function(){return this.options.flat?this.encodeFlat():this.encodeGuarded()}},{key:"leftText",value:function(e,t){return this.text.substr(e,t)}},{key:"leftEncode",value:function(e,t){return(0,r.default)(e,t)}},{key:"rightText",value:function(e,t){return this.text.substr(e,t)}},{key:"rightEncode",value:function(e,t){return(0,r.default)(e,t)}},{key:"encodeGuarded",value:function(){var e={fontSize:this.fontSize},t={height:this.guardHeight};return[{data:i.SIDE_BIN,options:t},{data:this.leftEncode(),text:this.leftText(),options:e},{data:i.MIDDLE_BIN,options:t},{data:this.rightEncode(),text:this.rightText(),options:e},{data:i.SIDE_BIN,options:t}]}},{key:"encodeFlat",value:function(){return{data:[i.SIDE_BIN,this.leftEncode(),i.MIDDLE_BIN,this.rightEncode(),i.SIDE_BIN].join(""),text:this.text}}}]),t}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n10*n.width?o.fontSize=10*n.width:o.fontSize=n.fontSize,o.guardHeight=n.height+o.fontSize/2+n.textMargin,o}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,r(n(0)).default),o(t,[{key:"valid",value:function(){return-1!==this.data.search(/^[0-9]{12}$/)&&this.data[11]==a(this.data)}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var e="";return e+="101",e+=(0,i.default)(this.data.substr(0,6),"LLLLLL"),e+="01010",e+=(0,i.default)(this.data.substr(6,6),"RRRRRR"),{data:e+="101",text:this.text}}},{key:"guardedEncoding",value:function(){var e=[];return this.displayValue&&e.push({data:"00000000",text:this.text.substr(0,1),options:{textAlign:"left",fontSize:this.fontSize}}),e.push({data:"101"+(0,i.default)(this.data[0],"L"),options:{height:this.guardHeight}}),e.push({data:(0,i.default)(this.data.substr(1,5),"LLLLL"),text:this.text.substr(1,5),options:{fontSize:this.fontSize}}),e.push({data:"01010",options:{height:this.guardHeight}}),e.push({data:(0,i.default)(this.data.substr(6,5),"RRRRR"),text:this.text.substr(6,5),options:{fontSize:this.fontSize}}),e.push({data:(0,i.default)(this.data[11],"R")+"101",options:{height:this.guardHeight}}),this.displayValue&&e.push({data:"00000000",text:this.text.substr(11,1),options:{textAlign:"right",fontSize:this.fontSize}}),e}}]),t}();function a(e){var t,n=0;for(t=1;t<11;t+=2)n+=parseInt(e[t]);for(t=0;t<11;t+=2)n+=3*parseInt(e[t]);return(10-n%10)%10}t.default=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,i=function(){function e(e,t){for(var n=0;n0?t.fontSize+t.textMargin:0)+t.marginTop+t.marginBottom}function s(e,t,n){if(n.displayValue&&tt&&(t=e[n].height);return t},t.getEncodingHeight=r,t.getBarcodePadding=s,t.calculateEncodingAttributes=function(e,t,n){for(var o=0;o=r(e);return t+String.fromCharCode(o?206:205)+a(e,o)}t.default=function(e){var t=void 0;if(s(e).length>=2)t=o.C_START_CHAR+l(e);else{var n=i(e)>r(e);t=(n?o.A_START_CHAR:o.B_START_CHAR)+a(e,n)}return t.replace(/[\xCD\xCE]([^])[\xCD\xCE]/,function(e,t){return String.fromCharCode(203)+t})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,i=function(){function e(e,t){for(var n=0;n10*n.width?o.fontSize=10*n.width:o.fontSize=n.fontSize,o.guardHeight=n.height+o.fontSize/2+n.textMargin,o}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,r.default),o(t,[{key:"valid",value:function(){return this.isValid}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var e="";return e+="101",e+=this.encodeMiddleDigits(),{data:e+="010101",text:this.text}}},{key:"guardedEncoding",value:function(){var e=[];return this.displayValue&&e.push({data:"00000000",text:this.text[0],options:{textAlign:"left",fontSize:this.fontSize}}),e.push({data:"101",options:{height:this.guardHeight}}),e.push({data:this.encodeMiddleDigits(),text:this.text.substring(1,7),options:{fontSize:this.fontSize}}),e.push({data:"010101",options:{height:this.guardHeight}}),this.displayValue&&e.push({data:"00000000",text:this.text[7],options:{textAlign:"right",fontSize:this.fontSize}}),e}},{key:"encodeMiddleDigits",value:function(){var e=this.upcA[0],t=this.upcA[this.upcA.length-1],n=c[parseInt(t)][parseInt(e)];return(0,i.default)(this.middleDigits,n)}}]),t}();function f(e,t){for(var n=parseInt(e[e.length-1]),o=u[n],i="",r=0,a=0;a=3&&this.number<=131070}}]),t}();t.pharmacode=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.codabar=void 0;var o,i=function(){function e(e,t){for(var n=0;n0?(n=0,i.textAlign="left"):"right"==e.textAlign?(n=t.width-1,i.textAlign="right"):(n=t.width/2,i.textAlign="center"),i.fillText(t.text,n,o))}},{key:"moveCanvasDrawing",value:function(e){this.canvas.getContext("2d").translate(e.width,0)}},{key:"restoreCanvas",value:function(){this.canvas.getContext("2d").restore()}}]),e}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,i=function(){function e(e,t){for(var n=0;n0&&(this.drawRect(s-t.width*r,o,t.width*r,t.height,e),r=0);r>0&&this.drawRect(s-t.width*(r-1),o,t.width*r,t.height,e)}},{key:"drawSVGText",value:function(e,t,n){var o,i,r=this.document.createElementNS(a,"text");t.displayValue&&(r.setAttribute("style","font:"+t.fontOptions+" "+t.fontSize+"px "+t.font),i="top"==t.textPosition?t.fontSize-t.textMargin:t.height+t.textMargin+t.fontSize,"left"==t.textAlign||n.barcodePadding>0?(o=0,r.setAttribute("text-anchor","start")):"right"==t.textAlign?(o=n.width-1,r.setAttribute("text-anchor","end")):(o=n.width/2,r.setAttribute("text-anchor","middle")),r.setAttribute("x",o),r.setAttribute("y",i),r.appendChild(this.document.createTextNode(n.text)),e.appendChild(r))}},{key:"setSvgAttributes",value:function(e,t){var n=this.svg;n.setAttribute("width",e+"px"),n.setAttribute("height",t+"px"),n.setAttribute("x","0px"),n.setAttribute("y","0px"),n.setAttribute("viewBox","0 0 "+e+" "+t),n.setAttribute("xmlns",a),n.setAttribute("version","1.1"),n.setAttribute("style","transform: translate(0,0)")}},{key:"createGroup",value:function(e,t,n){var o=this.document.createElementNS(a,"g");return o.setAttribute("transform","translate("+e+", "+t+")"),n.appendChild(o),o}},{key:"setGroupOptions",value:function(e,t){e.setAttribute("style","fill:"+t.lineColor+";")}},{key:"drawRect",value:function(e,t,n,o,i){var r=this.document.createElementNS(a,"rect");return r.setAttribute("x",e),r.setAttribute("y",t),r.setAttribute("width",n),r.setAttribute("height",o),i.appendChild(r),r}}]),e}();t.default=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;ne.length)return;if(!(_ instanceof l)){if(g&&x!=t.length-1){if(f.lastIndex=y,!(k=f.exec(e)))break;for(var F=k.index+(p?k[1].length:0),w=k.index+k[0].length,E=x,C=y,A=t.length;E"+r.content+""},!_self.document)return _self.addEventListener&&(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),o=t.language,i=t.code,r=t.immediateClose;_self.postMessage(n.highlight(i,n.languages[o],o)),r&&_self.close()},!1)),_self.Prism;var i=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return i&&(n.filename=i.src,n.manual||i.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/[a-z0-9_]+(?=\()/i,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,function:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}}}),Prism.languages.javascript["template-string"].inside.interpolation.inside.rest=Prism.languages.javascript,Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(){var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){for(var n,o=t.getAttribute("data-src"),i=t,r=/\blang(?:uage)?-([\w-]+)\b/i;i&&!r.test(i.className);)i=i.parentNode;if(i&&(n=(t.className.match(r)||[,""])[1]),!n){var s=(o.match(/\.(\w+)$/)||[,""])[1];n=e[s]||s}var a=document.createElement("code");a.className="language-"+n,t.textContent="",a.textContent="Loading…",t.appendChild(a);var l=new XMLHttpRequest;l.open("GET",o,!0),l.onreadystatechange=function(){4==l.readyState&&(l.status<400&&l.responseText?(a.textContent=l.responseText,Prism.highlightElement(a)):400<=l.status?a.textContent="✖ Error "+l.status+" while fetching file: "+l.statusText:a.textContent="✖ Error: File does not exist or is empty")},l.send(null)}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),o=document.createElement("a");return o.textContent=t.getAttribute("data-download-link-label")||"Download",o.setAttribute("download",""),o.href=n,o}})},document.addEventListener("DOMContentLoaded",self.Prism.fileHighlight)),function(e){"use strict";function t(e,t){e.className+=" "+t}function n(e,t){for(var n=e.className.split(" "),o=t.split(" "),i=0;i-1&&n.splice(r,1)}e.className=n.join(" ")}function o(){return"rtl"===e.getComputedStyle(document.body).direction}function i(){return document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop}function r(){return document.documentElement&&document.documentElement.scrollLeft||document.body.scrollLeft}function s(e){for(;e.lastChild;)e.removeChild(e.lastChild)}function a(e){if(null===e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n0){for(var n=[],o=0;o=0?(n(document.body,Fe.noOverflow),k(!1)):e>0&&document.body.className.indexOf(Fe.noOverflow)<0&&(k(!0),t(document.body,Fe.noOverflow))}function k(o){T.defaults.preventBodyShift&&(o&&document.documentElement.scrollHeight>document.documentElement.clientHeight?(Ee=be,we=e.getComputedStyle(document.body).top,t(document.body,Fe.fixed),document.body.style.top=-be+"px"):o||(be=Ee,document.body.style.top=we,n(document.body,Fe.fixed),F()))}function O(e,t){for(var n=y.indexOf(t)+1;n200&&(Ae=e.timeStamp)&&!Ce){var n=e.srcElement||e.target;!0===t.get("closableByDimmer")&&n===t.elements.modal&&j(t)}Ce=!1}function $(e,t){if(Date.now()-ke>200&&(ke=Date.now()))for(var n=0;n-1?($(t,function(e){return e.key===n}),!1):void 0}Te=!1}function U(e){var t=y[y.length-1],n=e.keyCode;if(n===m||n===b){for(var o=t.__internal.buttons,i=0;ip-1&&ve.indexOf(n)>-1)return e.preventDefault(),e.stopPropagation(),$(t,function(e){return e.key===n}),!1}function G(e,t){if(t)t.focus();else{var n=e.__internal.focus,o=n.element;switch(typeof n.element){case"number":e.__internal.buttons.length>n.element&&(o=!0===e.get("basic")?e.elements.reset[0]:e.__internal.buttons[n.element].element);break;case"string":o=e.elements.body.querySelector(n.element);break;case"function":o=n.element.call(e)}!0!==e.get("defaultFocusOff")&&(null!=o||0!==e.__internal.buttons.length)||(o=e.elements.reset[0]),o&&o.focus&&(o.focus(),n.select&&o.select&&o.select())}}function X(e,t){if(!t)for(var n=y.length-1;n>-1;n-=1)if(y[n].isModal()){t=y[n];break}if(t&&t.isModal()){var o,i=t.elements.reset[0],r=t.elements.reset[1],s=e.relatedTarget,a=t.elements.root.contains(s),l=e.srcElement||e.target;if(l===i&&!a||l===r&&s===i)return;l===r||l===document.body?o=i:l===i&&s===r?o=V(t):l===i&&a&&(o=V(t,!0)),G(t,o)}}function V(e,t){var n=[].slice.call(e.elements.dialog.querySelectorAll(x.tabbable));t&&n.reverse();for(var o=0;oRe?t.style.left=Ie+c+"px":t.offsetWidth>=He&&(t.style.left=Ie-c+"px")}}(t,Me.elements.dialog,!Me.get("modal")&&!Me.get("pinned")))}function se(){if(Me){var e=Me;Me=null,n(document.body,Fe.noSelection),n(e.elements.dialog,Fe.capture),Ce=!0,d("onresized",e)}}function ae(e){Me=null;var t=e.elements.dialog;"none"===t.style.maxWidth&&(t.style.maxWidth=t.style.minWidth=t.style.width=t.style.height=t.style.minHeight=t.style.left="",Ie=Number.Nan,Re=He=ze=0)}function le(){for(var e=0;e-1&&e.navigator.userAgent.indexOf("Chrome")<0,_e={dimmer:'
',modal:'
',dialog:'
',reset:'',commands:'
',header:'
',body:'
',content:'
',footer:'',buttons:{primary:'
',auxiliary:'
'},button:'',resizeHandle:'
'},Fe={animationIn:"ajs-in",animationOut:"ajs-out",base:"alertify",basic:"ajs-basic",capture:"ajs-capture",closable:"ajs-closable",fixed:"ajs-fixed",frameless:"ajs-frameless",hidden:"ajs-hidden",maximize:"ajs-maximize",maximized:"ajs-maximized",maximizable:"ajs-maximizable",modeless:"ajs-modeless",movable:"ajs-movable",noSelection:"ajs-no-selection",noOverflow:"ajs-no-overflow",noPadding:"ajs-no-padding",pin:"ajs-pin",pinnable:"ajs-pinnable",prefix:"ajs-",resizable:"ajs-resizable",restore:"ajs-restore",shake:"ajs-shake",unpinned:"ajs-unpinned",noTransition:"ajs-no-transition"},we="",Ee=0,Ce=!1,Ae=0,ke=0,Te=!1,Oe=null,Se=0,De=0,je="pageX",Le="pageY",Pe=null,Ne=!1,Be=null,Me=null,Ie=Number.Nan,Re=0,He=0,ze=0;return{__init:f,isOpen:function(){return this.__internal.isOpen},isModal:function(){return this.elements.root.className.indexOf(Fe.modeless)<0},isMaximized:function(){return this.elements.root.className.indexOf(Fe.maximized)>-1},isPinned:function(){return this.elements.root.className.indexOf(Fe.unpinned)<0},maximize:function(){return this.isMaximized()||B(this),this},restore:function(){return this.isMaximized()&&M(this),this},pin:function(){return this.isPinned()||P(this),this},unpin:function(){return this.isPinned()&&N(this),this},bringToFront:function(){return O(0,this),this},moveTo:function(e,t){if(!isNaN(e)&&!isNaN(t)){d("onmove",this);var n=this.elements.dialog,i=n,r=0,s=0;n.style.left&&(r-=parseInt(n.style.left,10)),n.style.top&&(s-=parseInt(n.style.top,10));do{r+=i.offsetLeft,s+=i.offsetTop}while(i=i.offsetParent);var a=e-r,l=t-s;o()&&(a*=-1),n.style.left=a+"px",n.style.top=l+"px",d("onmoved",this)}return this},resizeTo:function(e,t){var n=parseFloat(e),o=parseFloat(t),i=/(\d*\.\d+|\d+)%/;if(!isNaN(n)&&!isNaN(o)&&!0===this.get("resizable")){d("onresize",this),(""+e).match(i)&&(n=n/100*document.documentElement.clientWidth),(""+t).match(i)&&(o=o/100*document.documentElement.clientHeight);var r=this.elements.dialog;"none"!==r.style.maxWidth&&(r.style.minWidth=(He=r.offsetWidth)+"px"),r.style.maxWidth="none",r.style.minHeight=this.elements.header.offsetHeight+this.elements.footer.offsetHeight+"px",r.style.width=n+"px",r.style.height=o+"px",d("onresized",this)}return this},setting:function(e,t){var n=this,o=D(this,this.__internal.options,function(e,t,o){S(n,e,t,o)},e,t);if("get"===o.op)return o.found?o.value:void 0!==this.settings?D(this,this.settings,this.settingUpdated||function(){},e,t).value:void 0;if("set"===o.op){if(o.items.length>0)for(var i=this.settingUpdated||function(){},r=0;r0){var t=this;this.__internal.timer=setTimeout(function(){t.dismiss()},1e3*this.__internal.delay)}return this},setContent:function(n){if("string"==typeof n?(s(this.element),this.element.innerHTML=n):n instanceof e.HTMLElement&&this.element.firstChild!==n&&(s(this.element),this.element.appendChild(n)),this.__internal.closeButton){var o=document.createElement("span");t(o,f.close),o.setAttribute("data-close",!0),this.element.appendChild(o)}return this},dismissOthers:function(){return k.dismissAll(this),this}})}var c,d=[],f=x.notifier.classes,h=f.base;return{setting:function(e,t){if(o(this),void 0===t)return this.__internal[e];switch(e){case"position":this.__internal.position=t,a(this);break;case"delay":this.__internal.delay=t}return this},set:function(e,t){return this.setting(e,t),this},get:function(e){return this.setting(e)},create:function(e,t){o(this);var n=document.createElement("div");return n.className=f.message+("string"==typeof e&&""!==e?" "+f.prefix+e:""),l(n,t)},dismissAll:function(e){for(var t=d.slice(0),n=0;n>t?1:0;return n}function h(e,t,n,o,i,r,s){var a=p;a(e,t,n[0],o-2,i-2,r,s),a(e,t,n[1],o-2,i-1,r,s),a(e,t,n[2],o-1,i-2,r,s),a(e,t,n[3],o-1,i-1,r,s),a(e,t,n[4],o-1,i,r,s),a(e,t,n[5],o,i-2,r,s),a(e,t,n[6],o,i-1,r,s),a(e,t,n[7],o,i,r,s)}function p(e,t,n,o,i,r,s){o<0&&(o+=r,i+=4-(r+4)%8),i<0&&(i+=s,o+=4-(s+4)%8),1!==t[o][i]&&(e[o][i]=n,t[o][i]=1)}return function(g,m){var b,v=function(e){var t,n,o=[],i=0;for(t=0;t>=8;return o}function F(e,t,n){return String.fromCharCode(n)+String.fromCharCode(t)+String.fromCharCode(e)}function w(e){var t=parseInt("0x"+e.substr(1),16),n=255&t;return F((t>>=8)>>8,255&t,n)}function E(e){return e.match(/#[0-91-F]/gi)}function C(e){for(var t,n,o,i,r,s,a,l="",u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c=0;c>2,r=(3&t)<<4|(n=e.charCodeAt(c++))>>4,s=(15&n)<<2|(o=e.charCodeAt(c++))>>6,a=63&o,isNaN(n)?s=a=64:isNaN(o)&&(a=64),l+=u.charAt(i)+u.charAt(r)+u.charAt(s)+u.charAt(a);return l}function A(e){var t,n=[];for(n[0]=[],t=0;t',p='
';for(a=0;a'+o+""),k(e,i*d).html(f)}function S(e,t,n,o,i,r){var s,a,l,u,c,d,f,h,p=n.length,g=n[0].length,m=i*g,b=r*p;for(t.showHRI&&(l=y(t.fontSize),b+=y(t.marginHRI)+l),u='',u+='',c='',a=0;a',u+=''+o+"",u+=""),u+="",(h=document.createElement("img")).setAttribute("src","data:image/svg+xml;base64,"+C(u)),k(e,m).append(h)}function D(e,t,n,o,i,r,s,a){var l,u,c,d,f,h,p=e.get(0),g=n.length,m=n[0].length;if(p&&p.getContext){for((c=p.getContext("2d")).lineWidth=1,c.lineCap="butt",c.fillStyle=t.bgColor,c.fillRect(i,r,m*s,g*a),c.fillStyle=t.color,u=0;u?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",a=0,l=0,u=0;for(t=0;te||this.moduleCount<=e||0>t||this.moduleCount<=t)throw Error(e+","+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){var e=1;for(e=1;40>e;e++){for(var t=s.getRSBlocks(e,this.errorCorrectLevel),n=new a,o=0,i=0;i=n;n++)if(!(-1>=e+n||this.moduleCount<=e+n))for(var o=-1;7>=o;o++)-1>=t+o||this.moduleCount<=t+o||(this.modules[e+n][t+o]=0<=n&&6>=n&&(0==o||6==o)||0<=o&&6>=o&&(0==n||6==n)||2<=n&&4>=n&&2<=o&&4>=o)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;8>n;n++){this.makeImpl(!0,n);var o=l.getLostPoint(this);(0==n||e>o)&&(e=o,t=n)}return t},createMovieClip:function(e,t,n){for(e=e.createEmptyMovieClip(t,n),this.make(),t=0;t=r;r++)for(var s=-2;2>=s;s++)this.modules[o+r][i+s]=-2==r||2==r||-2==s||2==s||0==r&&0==s}},setupTypeNumber:function(e){for(var t=l.getBCHTypeNumber(this.typeNumber),n=0;18>n;n++){var o=!e&&1==(t>>n&1);this.modules[Math.floor(n/3)][n%3+this.moduleCount-8-3]=o}for(n=0;18>n;n++)o=!e&&1==(t>>n&1),this.modules[n%3+this.moduleCount-8-3][Math.floor(n/3)]=o},setupTypeInfo:function(e,t){for(var n=l.getBCHTypeInfo(this.errorCorrectLevel<<3|t),o=0;15>o;o++){var i=!e&&1==(n>>o&1);6>o?this.modules[o][8]=i:8>o?this.modules[o+1][8]=i:this.modules[this.moduleCount-15+o][8]=i}for(o=0;15>o;o++)i=!e&&1==(n>>o&1),8>o?this.modules[8][this.moduleCount-o-1]=i:9>o?this.modules[8][15-o-1+1]=i:this.modules[8][15-o-1]=i;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,o=this.moduleCount-1,i=7,r=0,s=this.moduleCount-1;0a;a++)if(null==this.modules[o][s-a]){var u=!1;r>>i&1)),l.getMask(t,o,s-a)&&(u=!u),this.modules[o][s-a]=u,-1==--i&&(r++,i=7)}if(0>(o+=n)||this.moduleCount<=o){o-=n,n=-n;break}}}},i.PAD0=236,i.PAD1=17,i.createData=function(e,t,n){t=s.getRSBlocks(e,t);for(var o=new a,r=0;r8*e)throw Error("code length overflow. ("+o.getLengthInBits()+">"+8*e+")");for(o.getLengthInBits()+4<=8*e&&o.put(0,4);0!=o.getLengthInBits()%8;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*e||(o.put(i.PAD0,8),o.getLengthInBits()>=8*e));)o.put(i.PAD1,8);return i.createBytes(o,t)},i.createBytes=function(e,t){for(var n=0,o=0,i=0,s=Array(t.length),a=Array(t.length),u=0;u>>=1;return t},getPatternPosition:function(e){return l.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case 0:return 0==(t+n)%2;case 1:return 0==t%2;case 2:return 0==n%3;case 3:return 0==(t+n)%3;case 4:return 0==(Math.floor(t/2)+Math.floor(n/3))%2;case 5:return 0==t*n%2+t*n%3;case 6:return 0==(t*n%2+t*n%3)%2;case 7:return 0==(t*n%3+(t+n)%2)%2;default:throw Error("bad maskPattern:"+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;nt)switch(e){case 1:return 10;case 2:return 9;case n:case 8:return 8;default:throw Error("mode:"+e)}else if(27>t)switch(e){case 1:return 12;case 2:return 11;case n:return 16;case 8:return 10;default:throw Error("mode:"+e)}else{if(!(41>t))throw Error("type:"+t);switch(e){case 1:return 14;case 2:return 13;case n:return 16;case 8:return 12;default:throw Error("mode:"+e)}}},getLostPoint:function(e){for(var t=e.getModuleCount(),n=0,o=0;o=a;a++)if(!(0>o+a||t<=o+a))for(var l=-1;1>=l;l++)0>i+l||t<=i+l||0==a&&0==l||s==e.isDark(o+a,i+l)&&r++;5e)throw Error("glog("+e+")");return u.LOG_TABLE[e]},gexp:function(e){for(;0>e;)e+=255;for(;256<=e;)e-=255;return u.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},c=0;8>c;c++)u.EXP_TABLE[c]=1<c;c++)u.EXP_TABLE[c]=u.EXP_TABLE[c-4]^u.EXP_TABLE[c-5]^u.EXP_TABLE[c-6]^u.EXP_TABLE[c-8];for(c=0;255>c;c++)u.LOG_TABLE[u.EXP_TABLE[c]]=c;return r.prototype={get:function(e){return this.num[e]},getLength:function(){return this.num.length},multiply:function(e){for(var t=Array(this.getLength()+e.getLength()-1),n=0;nthis.getLength()-e.getLength())return this;for(var t=u.glog(this.get(0))-u.glog(e.get(0)),n=Array(this.getLength()),o=0;o>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},"string"==typeof t&&(t={text:t}),t=e.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,correctLevel:2,background:"#ffffff",foreground:"#000000"},t),this.each(function(){var n;if("canvas"==t.render){(n=new i(t.typeNumber,t.correctLevel)).addData(t.text),n.make();var o=document.createElement("canvas");o.width=t.width,o.height=t.height;for(var r=o.getContext("2d"),s=t.width/n.getModuleCount(),a=t.height/n.getModuleCount(),l=0;l").css("width",t.width+"px").css("height",t.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",t.background),r=t.width/n.getModuleCount(),s=t.height/n.getModuleCount(),a=0;a").css("height",s+"px").appendTo(o),u=0;u").css("width",r+"px").css("background-color",n.isDark(a,u)?t.foreground:t.background).appendTo(l);n=o,jQuery(n).appendTo(this)})}}(jQuery),function(){"use strict";var e="undefined"!=typeof window&&void 0!==window.document?window.document:{},t="undefined"!=typeof module&&module.exports,n=function(){for(var t,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],o=0,i=n.length,r={};o",{class:n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(i=e.$ta.val(),e.$ed=o("
"),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,i=e.$ed.html(),e.$ta=o("",h.noCloneChecked=!!ve.cloneNode(!0).lastChild.defaultValue,ve.innerHTML="",h.option=!!ve.lastChild;var Ce={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Ee(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&C(e,t)?F.merge([e],n):n}function Ae(e,t){for(var n=0,i=e.length;n",""]);var ke=/<|&#?\w+;/;function Te(e,t,n,i,o){for(var r,s,a,l,u,c,d=t.createDocumentFragment(),f=[],h=0,p=e.length;h\s*$/g;function Me(e,t){return C(e,"table")&&C(11!==t.nodeType?t:t.firstChild,"tr")&&F(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function He(e,t){var n,i,o,r,s,a;if(1===t.nodeType){if(oe.hasData(e)&&(a=oe.get(e).events))for(o in oe.remove(t,"handle events"),a)for(n=0,i=a[o].length;n").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),m.head.appendChild(t[0])},abort:function(){n&&n()}}});var Yt,Jt=[],Zt=/(=)\?(?=&|$)|\?\?/;F.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Jt.pop()||F.expando+"_"+kt.guid++;return this[e]=!0,e}}),F.ajaxPrefilter("json jsonp",function(t,n,i){var o,r,s,a=!1!==t.jsonp&&(Zt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return o=t.jsonpCallback=p(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Zt,"$1"+o):!1!==t.jsonp&&(t.url+=(Tt.test(t.url)?"&":"?")+t.jsonp+"="+o),t.converters["script json"]=function(){return s||F.error(o+" was not called"),s[0]},t.dataTypes[0]="json",r=e[o],e[o]=function(){s=arguments},i.always(function(){void 0===r?F(e).removeProp(o):e[o]=r,t[o]&&(t.jsonpCallback=n.jsonpCallback,Jt.push(o)),s&&p(r)&&r(s[0]),s=r=void 0}),"script"}),h.createHTMLDocument=((Yt=m.implementation.createHTMLDocument("").body).innerHTML="
",2===Yt.childNodes.length),F.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(h.createHTMLDocument?((i=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(i)):t=m),r=!n&&[],(o=M.exec(e))?[t.createElement(o[1])]:(o=Te([e],t,r),r&&r.length&&F(r).remove(),F.merge([],o.childNodes)));var i,o,r},F.fn.load=function(e,t,n){var i,o,r,s=this,a=e.indexOf(" ");return-1").append(F.parseHTML(e)).find(i):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},F.expr.pseudos.animated=function(e){return F.grep(F.timers,function(t){return e===t.elem}).length},F.offset={setOffset:function(e,t,n){var i,o,r,s,a,l,u=F.css(e,"position"),c=F(e),d={};"static"===u&&(e.style.position="relative"),a=c.offset(),r=F.css(e,"top"),l=F.css(e,"left"),("absolute"===u||"fixed"===u)&&-1<(r+l).indexOf("auto")?(s=(i=c.position()).top,o=i.left):(s=parseFloat(r)||0,o=parseFloat(l)||0),p(t)&&(t=t.call(e,n,F.extend({},a))),null!=t.top&&(d.top=t.top-a.top+s),null!=t.left&&(d.left=t.left-a.left+o),"using"in t?t.using.call(e,d):c.css(d)}},F.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){F.offset.setOffset(this,e,t)});var t,n,i=this[0];return i?i.getClientRects().length?(t=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],o={top:0,left:0};if("fixed"===F.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===F.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((o=F(e).offset()).top+=F.css(e,"borderTopWidth",!0),o.left+=F.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-F.css(i,"marginTop",!0),left:t.left-o.left-F.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===F.css(e,"position");)e=e.offsetParent;return e||fe})}}),F.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;F.fn[e]=function(i){return Y(this,function(e,i,o){var r;if(g(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===o)return r?r[t]:e[i];r?r.scrollTo(n?r.pageXOffset:o,n?o:r.pageYOffset):e[i]=o},e,i,arguments.length)}}),F.each(["top","left"],function(e,t){F.cssHooks[t]=Ke(h.pixelPosition,function(e,n){if(n)return n=Ve(e,t),qe.test(n)?F(e).position()[t]+"px":n})}),F.each({Height:"height",Width:"width"},function(e,t){F.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,i){F.fn[i]=function(o,r){var s=arguments.length&&(n||"boolean"!=typeof o),a=n||(!0===o||!0===r?"margin":"border");return Y(this,function(t,n,o){var r;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(r=t.documentElement,Math.max(t.body["scroll"+e],r["scroll"+e],t.body["offset"+e],r["offset"+e],r["client"+e])):void 0===o?F.css(t,n,a):F.style(t,n,o,a)},t,s?o:void 0,s)}})}),F.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){F.fn[t]=function(e){return this.on(t,e)}}),F.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,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),F.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,t){F.fn[t]=function(e,n){return 0e[n]})}return t.default=e,Object.freeze(t)}(e),n=new Map,i={set(e,t,i){n.has(e)||n.set(e,new Map);const o=n.get(e);o.has(t)||0===o.size?o.set(t,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(o.keys())[0]}.`)},get:(e,t)=>n.has(e)&&n.get(e).get(t)||null,remove(e,t){if(!n.has(e))return;const i=n.get(e);i.delete(t),0===i.size&&n.delete(e)}},o="transitionend",r=e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,(e,t)=>"#"+CSS.escape(t))),e),s=e=>{e.dispatchEvent(new Event(o))},a=e=>!(!e||"object"!=typeof e)&&(void 0!==e.jquery&&(e=e[0]),void 0!==e.nodeType),l=e=>a(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?document.querySelector(r(e)):null,u=e=>{if(!a(e)||0===e.getClientRects().length)return!1;const t="visible"===getComputedStyle(e).getPropertyValue("visibility"),n=e.closest("details:not([open])");if(!n)return t;if(n!==e){const t=e.closest("summary");if(t&&t.parentNode!==n)return!1;if(null===t)return!1}return t},c=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled")),d=e=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?d(e.parentNode):null},f=()=>{},h=e=>{e.offsetHeight},p=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,g=[],m=()=>"rtl"===document.documentElement.dir,b=e=>{var t;t=(()=>{const t=p();if(t){const n=e.NAME,i=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=(()=>(t.fn[n]=i,e.jQueryInterface))}}),"loading"===document.readyState?(g.length||document.addEventListener("DOMContentLoaded",()=>{for(const e of g)e()}),g.push(t)):t()},x=(e,t=[],n=e)=>"function"==typeof e?e(...t):n,v=(e,t,n=!0)=>{if(!n)return void x(e);const i=(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const i=Number.parseFloat(t),o=Number.parseFloat(n);return i||o?(t=t.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(n))):0})(t)+5;let r=!1;const a=({target:n})=>{n===t&&(r=!0,t.removeEventListener(o,a),x(e))};t.addEventListener(o,a),setTimeout(()=>{r||s(t)},i)},y=(e,t,n,i)=>{const o=e.length;let r=e.indexOf(t);return-1===r?!n&&i?e[o-1]:e[0]:(r+=n?1:-1,i&&(r=(r+o)%o),e[Math.max(0,Math.min(r,o-1))])},_=/[^.]*(?=\..*)\.|.*/,F=/\..*/,w=/::\d+$/,C={};let E=1;const A={mouseenter:"mouseover",mouseleave:"mouseout"},k=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function T(e,t){return t&&`${t}::${E++}`||e.uidEvent||E++}function O(e){const t=T(e);return e.uidEvent=t,C[t]=C[t]||{},C[t]}function S(e,t,n=null){return Object.values(e).find(e=>e.callable===t&&e.delegationSelector===n)}function D(e,t,n){const i="string"==typeof t,o=i?n:t||n;let r=N(e);return k.has(r)||(r=e),[i,o,r]}function j(e,t,n,i,o){if("string"!=typeof t||!e)return;let[r,s,a]=D(t,n,i);t in A&&(s=(e=>(function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)}))(s));const l=O(e),u=l[a]||(l[a]={}),c=S(u,s,r?n:null);if(c)return void(c.oneOff=c.oneOff&&o);const d=T(s,t.replace(_,"")),f=r?function(e,t,n){return function i(o){const r=e.querySelectorAll(t);for(let{target:s}=o;s&&s!==this;s=s.parentNode)for(const a of r)if(a===s)return M(o,{delegateTarget:s}),i.oneOff&&B.off(e,o.type,t,n),n.apply(s,[o])}}(e,n,s):function(e,t){return function n(i){return M(i,{delegateTarget:e}),n.oneOff&&B.off(e,i.type,t),t.apply(e,[i])}}(e,s);f.delegationSelector=r?n:null,f.callable=s,f.oneOff=o,f.uidEvent=d,u[d]=f,e.addEventListener(a,f,r)}function P(e,t,n,i,o){const r=S(t[n],i,o);r&&(e.removeEventListener(n,r,Boolean(o)),delete t[n][r.uidEvent])}function L(e,t,n,i){const o=t[n]||{};for(const[r,s]of Object.entries(o))r.includes(i)&&P(e,t,n,s.callable,s.delegationSelector)}function N(e){return e=e.replace(F,""),A[e]||e}const B={on(e,t,n,i){j(e,t,n,i,!1)},one(e,t,n,i){j(e,t,n,i,!0)},off(e,t,n,i){if("string"!=typeof t||!e)return;const[o,r,s]=D(t,n,i),a=s!==t,l=O(e),u=l[s]||{},c=t.startsWith(".");if(void 0===r){if(c)for(const n of Object.keys(l))L(e,l,n,t.slice(1));for(const[n,i]of Object.entries(u)){const o=n.replace(w,"");a&&!t.includes(o)||P(e,l,s,i.callable,i.delegationSelector)}}else{if(!Object.keys(u).length)return;P(e,l,s,r,o?n:null)}},trigger(e,t,n){if("string"!=typeof t||!e)return null;const i=p();let o=null,r=!0,s=!0,a=!1;t!==N(t)&&i&&(o=i.Event(t,n),i(e).trigger(o),r=!o.isPropagationStopped(),s=!o.isImmediatePropagationStopped(),a=o.isDefaultPrevented());const l=M(new Event(t,{bubbles:r,cancelable:!0}),n);return a&&l.preventDefault(),s&&e.dispatchEvent(l),l.defaultPrevented&&o&&o.preventDefault(),l}};function M(e,t={}){for(const[n,i]of Object.entries(t))try{e[n]=i}catch(t){Object.defineProperty(e,n,{configurable:!0,get:()=>i})}return e}function I(e){if("true"===e)return!0;if("false"===e)return!1;if(e===Number(e).toString())return Number(e);if(""===e||"null"===e)return null;if("string"!=typeof e)return e;try{return JSON.parse(decodeURIComponent(e))}catch(t){return e}}function R(e){return e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())}const H={setDataAttribute(e,t,n){e.setAttribute("data-bs-"+R(t),n)},removeDataAttribute(e,t){e.removeAttribute("data-bs-"+R(t))},getDataAttributes(e){if(!e)return{};const t={},n=Object.keys(e.dataset).filter(e=>e.startsWith("bs")&&!e.startsWith("bsConfig"));for(const i of n){let n=i.replace(/^bs/,"");t[n=n.charAt(0).toLowerCase()+n.slice(1,n.length)]=I(e.dataset[i])}return t},getDataAttribute:(e,t)=>I(e.getAttribute("data-bs-"+R(t)))};class ${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(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){const n=a(t)?H.getDataAttribute(t,"config"):{};return{...this.constructor.Default,..."object"==typeof n?n:{},...a(t)?H.getDataAttributes(t):{},..."object"==typeof e?e:{}}}_typeCheckConfig(e,t=this.constructor.DefaultType){for(const[i,o]of Object.entries(t)){const t=e[i],r=a(t)?"element":null==(n=t)?""+n:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(o).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${r}" but expected type "${o}".`)}var n}}class z extends ${constructor(e,t){super(),(e=l(e))&&(this._element=e,this._config=this._getConfig(t),i.set(this._element,this.constructor.DATA_KEY,this))}dispose(){i.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY);for(const e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,n=!0){v(e,t,n)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return i.get(l(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,"object"==typeof t?t: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(e){return`${e}${this.EVENT_KEY}`}}const q=e=>{let t=e.getAttribute("data-bs-target");if(!t||"#"===t){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n="#"+n.split("#")[1]),t=n&&"#"!==n?n.trim():null}return t?t.split(",").map(e=>r(e)).join(","):null},W={find:(e,t=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(t,e)),findOne:(e,t=document.documentElement)=>Element.prototype.querySelector.call(t,e),children:(e,t)=>[].concat(...e.children).filter(e=>e.matches(t)),parents(e,t){const n=[];let i=e.parentNode.closest(t);for(;i;)n.push(i),i=i.parentNode.closest(t);return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]},focusableChildren(e){const t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(e=>e+':not([tabindex^="-"])').join(",");return this.find(t,e).filter(e=>!c(e)&&u(e))},getSelectorFromElement(e){const t=q(e);return t&&W.findOne(t)?t:null},getElementFromSelector(e){const t=q(e);return t?W.findOne(t):null},getMultipleElementsFromSelector(e){const t=q(e);return t?W.find(t):[]}},G=(e,t="hide")=>{const n="click.dismiss"+e.EVENT_KEY,i=e.NAME;B.on(document,n,`[data-bs-dismiss="${i}"]`,function(n){if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),c(this))return;const o=W.getElementFromSelector(this)||this.closest("."+i);e.getOrCreateInstance(o)[t]()})};class X extends z{static get NAME(){return"alert"}close(){if(B.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const e=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,e)}_destroyElement(){this._element.remove(),B.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(e){return this.each(function(){const t=X.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}G(X,"close"),b(X);const U='[data-bs-toggle="button"]';class V extends z{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each(function(){const t=V.getOrCreateInstance(this);"toggle"===e&&t[e]()})}}B.on(document,"click.bs.button.data-api",U,e=>{e.preventDefault();const t=e.target.closest(U);V.getOrCreateInstance(t).toggle()}),b(V);const K=".bs.swipe",Q={endCallback:null,leftCallback:null,rightCallback:null},Y={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class J extends ${constructor(e,t){super(),this._element=e,e&&J.isSupported()&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Q}static get DefaultType(){return Y}static get NAME(){return"swipe"}dispose(){B.off(this._element,K)}_start(e){this._supportPointerEvents?this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX):this._deltaX=e.touches[0].clientX}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),x(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){const e=Math.abs(this._deltaX);if(e<=40)return;const t=e/this._deltaX;this._deltaX=0,t&&x(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(B.on(this._element,"pointerdown.bs.swipe",e=>this._start(e)),B.on(this._element,"pointerup.bs.swipe",e=>this._end(e)),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.swipe",e=>this._start(e)),B.on(this._element,"touchmove.bs.swipe",e=>this._move(e)),B.on(this._element,"touchend.bs.swipe",e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&("pen"===e.pointerType||"touch"===e.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Z=".bs.carousel",ee=".data-api",te="next",ne="prev",ie="left",oe="right",re="slid"+Z,se=`load${Z}${ee}`,ae=`click${Z}${ee}`,le="carousel",ue="active",ce=".active",de=".carousel-item",fe={ArrowLeft:oe,ArrowRight:ie},he={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},pe={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class ge extends z{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=W.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===le&&this.cycle()}static get Default(){return he}static get DefaultType(){return pe}static get NAME(){return"carousel"}next(){this._slide(te)}nextWhenVisible(){!document.hidden&&u(this._element)&&this.next()}prev(){this._slide(ne)}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?B.one(this._element,re,()=>this.cycle()):this.cycle())}to(e){const t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding)return void B.one(this._element,re,()=>this.to(e));const n=this._getItemIndex(this._getActive());if(n===e)return;const i=e>n?te:ne;this._slide(i,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",e=>this._keydown(e)),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",()=>this.pause()),B.on(this._element,"mouseleave.bs.carousel",()=>this._maybeEnableCycle())),this._config.touch&&J.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const e of W.find(".carousel-item img",this._element))B.on(e,"dragstart.bs.carousel",e=>e.preventDefault());const e={leftCallback:()=>this._slide(this._directionToOrder(ie)),rightCallback:()=>this._slide(this._directionToOrder(oe)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new J(this._element,e)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=fe[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;const t=W.findOne(ce,this._indicatorsElement);t.classList.remove(ue),t.removeAttribute("aria-current");const n=W.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);n&&(n.classList.add(ue),n.setAttribute("aria-current","true"))}_updateInterval(){const e=this._activeElement||this._getActive();if(!e)return;const t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;const n=this._getActive(),i=e===te,o=t||y(this._getItems(),n,i,this._config.wrap);if(o===n)return;const r=this._getItemIndex(o),s=t=>B.trigger(this._element,t,{relatedTarget:o,direction:this._orderToDirection(e),from:this._getItemIndex(n),to:r});if(s("slide.bs.carousel").defaultPrevented)return;if(!n||!o)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(r),this._activeElement=o;const l=i?"carousel-item-start":"carousel-item-end",u=i?"carousel-item-next":"carousel-item-prev";o.classList.add(u),h(o),n.classList.add(l),o.classList.add(l),this._queueCallback(()=>{o.classList.remove(l,u),o.classList.add(ue),n.classList.remove(ue,u,l),this._isSliding=!1,s(re)},n,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return W.findOne(".active.carousel-item",this._element)}_getItems(){return W.find(de,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return m()?e===ie?ne:te:e===ie?te:ne}_orderToDirection(e){return m()?e===ne?ie:oe:e===ne?oe:ie}static jQueryInterface(e){return this.each(function(){const t=ge.getOrCreateInstance(this,e);if("number"!=typeof e){if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e]()}}else t.to(e)})}}B.on(document,ae,"[data-bs-slide], [data-bs-slide-to]",function(e){const t=W.getElementFromSelector(this);if(!t||!t.classList.contains(le))return;e.preventDefault();const n=ge.getOrCreateInstance(t),i=this.getAttribute("data-bs-slide-to");return i?(n.to(i),void n._maybeEnableCycle()):"next"===H.getDataAttribute(this,"slide")?(n.next(),void n._maybeEnableCycle()):(n.prev(),void n._maybeEnableCycle())}),B.on(window,se,()=>{const e=W.find('[data-bs-ride="carousel"]');for(const t of e)ge.getOrCreateInstance(t)}),b(ge);const me="show",be="collapse",xe="collapsing",ve=`:scope .${be} .${be}`,ye='[data-bs-toggle="collapse"]',_e={parent:null,toggle:!0},Fe={parent:"(null|element)",toggle:"boolean"};class we extends z{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];const n=W.find(ye);for(const e of n){const t=W.getSelectorFromElement(e),n=W.find(t).filter(e=>e===this._element);null!==t&&n.length&&this._triggerArray.push(e)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return _e}static get DefaultType(){return Fe}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(e=>e!==this._element).map(e=>we.getOrCreateInstance(e,{toggle:!1}))),e.length&&e[0]._isTransitioning)return;if(B.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const t of e)t.hide();const t=this._getDimension();this._element.classList.remove(be),this._element.classList.add(xe),this._element.style[t]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const n="scroll"+(t[0].toUpperCase()+t.slice(1));this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(xe),this._element.classList.add(be,me),this._element.style[t]="",B.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[t]=this._element[n]+"px"}hide(){if(this._isTransitioning||!this._isShown())return;if(B.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const e=this._getDimension();this._element.style[e]=this._element.getBoundingClientRect()[e]+"px",h(this._element),this._element.classList.add(xe),this._element.classList.remove(be,me);for(const e of this._triggerArray){const t=W.getElementFromSelector(e);t&&!this._isShown(t)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0,this._element.style[e]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(xe),this._element.classList.add(be),B.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}_isShown(e=this._element){return e.classList.contains(me)}_configAfterMerge(e){return e.toggle=Boolean(e.toggle),e.parent=l(e.parent),e}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const e=this._getFirstLevelChildren(ye);for(const t of e){const e=W.getElementFromSelector(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}}_getFirstLevelChildren(e){const t=W.find(ve,this._config.parent);return W.find(e,this._config.parent).filter(e=>!t.includes(e))}_addAriaAndCollapsedClass(e,t){if(e.length)for(const n of e)n.classList.toggle("collapsed",!t),n.setAttribute("aria-expanded",t)}static jQueryInterface(e){const t={};return"string"==typeof e&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){const n=we.getOrCreateInstance(this,t);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e]()}})}}B.on(document,"click.bs.collapse.data-api",ye,function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();for(const e of W.getMultipleElementsFromSelector(this))we.getOrCreateInstance(e,{toggle:!1}).toggle()}),b(we);const Ce="dropdown",Ee=".bs.dropdown",Ae=".data-api",ke="ArrowUp",Te="ArrowDown",Oe=`click${Ee}${Ae}`,Se=`keydown${Ee}${Ae}`,De=`keyup${Ee}${Ae}`,je="show",Pe='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Le=".dropdown-menu",Ne=m()?"top-end":"top-start",Be=m()?"top-start":"top-end",Me=m()?"bottom-end":"bottom-start",Ie=m()?"bottom-start":"bottom-end",Re=m()?"left-start":"right-start",He=m()?"right-start":"left-start",$e={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},ze={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class qe extends z{constructor(e,t){super(e,t),this._popper=null,this._parent=this._element.parentNode,this._menu=W.next(this._element,Le)[0]||W.prev(this._element,Le)[0]||W.findOne(Le,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return $e}static get DefaultType(){return ze}static get NAME(){return Ce}toggle(){return this._isShown()?this.hide():this.show()}show(){if(c(this._element)||this._isShown())return;const e={relatedTarget:this._element};if(!B.trigger(this._element,"show.bs.dropdown",e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const e of[].concat(...document.body.children))B.on(e,"mouseover",f);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(je),this._element.classList.add(je),B.trigger(this._element,"shown.bs.dropdown",e)}}hide(){if(c(this._element)||!this._isShown())return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!B.trigger(this._element,"hide.bs.dropdown",e).defaultPrevented){if("ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))B.off(e,"mouseover",f);this._popper&&this._popper.destroy(),this._menu.classList.remove(je),this._element.classList.remove(je),this._element.setAttribute("aria-expanded","false"),H.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,"hidden.bs.dropdown",e)}}_getConfig(e){if("object"==typeof(e=super._getConfig(e)).reference&&!a(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError(Ce.toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return e}_createPopper(){if(void 0===t)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=this._parent:a(this._config.reference)?e=l(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const n=this._getPopperConfig();this._popper=t.createPopper(e,this._menu,n)}_isShown(){return this._menu.classList.contains(je)}_getPlacement(){const e=this._parent;if(e.classList.contains("dropend"))return Re;if(e.classList.contains("dropstart"))return He;if(e.classList.contains("dropup-center"))return"top";if(e.classList.contains("dropdown-center"))return"bottom";const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?Be:Ne:t?Ie:Me}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(H.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...x(this._config.popperConfig,[e])}}_selectMenuItem({key:e,target:t}){const n=W.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(e=>u(e));n.length&&y(n,t,e===Te,!n.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){const t=qe.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(2===e.button||"keyup"===e.type&&"Tab"!==e.key)return;const t=W.find('[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled).show');for(const n of t){const t=qe.getInstance(n);if(!t||!1===t._config.autoClose)continue;const i=e.composedPath(),o=i.includes(t._menu);if(i.includes(t._element)||"inside"===t._config.autoClose&&!o||"outside"===t._config.autoClose&&o)continue;if(t._menu.contains(e.target)&&("keyup"===e.type&&"Tab"===e.key||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;const r={relatedTarget:t._element};"click"===e.type&&(r.clickEvent=e),t._completeHide(r)}}static dataApiKeydownHandler(e){const t=/input|textarea/i.test(e.target.tagName),n="Escape"===e.key,i=[ke,Te].includes(e.key);if(!i&&!n)return;if(t&&!n)return;e.preventDefault();const o=this.matches(Pe)?this:W.prev(this,Pe)[0]||W.next(this,Pe)[0]||W.findOne(Pe,e.delegateTarget.parentNode),r=qe.getOrCreateInstance(o);if(i)return e.stopPropagation(),r.show(),void r._selectMenuItem(e);r._isShown()&&(e.stopPropagation(),r.hide(),o.focus())}}B.on(document,Se,Pe,qe.dataApiKeydownHandler),B.on(document,Se,Le,qe.dataApiKeydownHandler),B.on(document,Oe,qe.clearMenus),B.on(document,De,qe.clearMenus),B.on(document,Oe,Pe,function(e){e.preventDefault(),qe.getOrCreateInstance(this).toggle()}),b(qe);const We="backdrop",Ge="mousedown.bs."+We,Xe={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ue={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ve extends ${constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return Xe}static get DefaultType(){return Ue}static get NAME(){return We}show(e){if(!this._config.isVisible)return void x(e);this._append();const t=this._getElement();this._config.isAnimated&&h(t),t.classList.add("show"),this._emulateAnimation(()=>{x(e)})}hide(e){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),x(e)})):x(e)}dispose(){this._isAppended&&(B.off(this._element,Ge),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add("fade"),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=l(e.rootElement),e}_append(){if(this._isAppended)return;const e=this._getElement();this._config.rootElement.append(e),B.on(e,Ge,()=>{x(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){v(e,this._getElement(),this._config.isAnimated)}}const Ke=".bs.focustrap",Qe="backward",Ye={autofocus:!0,trapElement:null},Je={autofocus:"boolean",trapElement:"element"};class Ze extends ${constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Ye}static get DefaultType(){return Je}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),B.off(document,Ke),B.on(document,"focusin.bs.focustrap",e=>this._handleFocusin(e)),B.on(document,"keydown.tab.bs.focustrap",e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,B.off(document,Ke))}_handleFocusin(e){const{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;const n=W.focusableChildren(t);0===n.length?t.focus():this._lastTabNavDirection===Qe?n[n.length-1].focus():n[0].focus()}_handleKeydown(e){"Tab"===e.key&&(this._lastTabNavDirection=e.shiftKey?Qe:"forward")}}const et=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",tt=".sticky-top",nt="padding-right",it="margin-right";class ot{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,nt,t=>t+e),this._setElementAttributes(et,nt,t=>t+e),this._setElementAttributes(tt,it,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,nt),this._resetElementAttributes(et,nt),this._resetElementAttributes(tt,it)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const i=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+i)return;this._saveInitialAttribute(e,t);const o=window.getComputedStyle(e).getPropertyValue(t);e.style.setProperty(t,n(Number.parseFloat(o))+"px")})}_saveInitialAttribute(e,t){const n=e.style.getPropertyValue(t);n&&H.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{const n=H.getDataAttribute(e,t);null!==n?(H.removeDataAttribute(e,t),e.style.setProperty(t,n)):e.style.removeProperty(t)})}_applyManipulationCallback(e,t){if(a(e))t(e);else for(const n of W.find(e,this._element))t(n)}}const rt=".bs.modal",st="hidden"+rt,at="show"+rt,lt=`click${rt}.data-api`,ut="modal-open",ct="modal-static",dt={backdrop:!0,focus:!0,keyboard:!0},ft={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class ht extends z{constructor(e,t){super(e,t),this._dialog=W.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ot,this._addEventListeners()}static get Default(){return dt}static get DefaultType(){return ft}static get NAME(){return"modal"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||B.trigger(this._element,at,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ut),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){this._isShown&&!this._isTransitioning&&(B.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove("show"),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())))}dispose(){B.off(window,rt),B.off(this._dialog,rt),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ve({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ze({trapElement:this._element})}_showElement(e){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 t=W.findOne(".modal-body",this._dialog);t&&(t.scrollTop=0),h(this._element),this._element.classList.add("show"),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,B.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,this._isAnimated())}_addEventListeners(){B.on(this._element,"keydown.dismiss.bs.modal",e=>{"Escape"===e.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())}),B.on(window,"resize.bs.modal",()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),B.on(this._element,"mousedown.dismiss.bs.modal",e=>{B.one(this._element,"click.dismiss.bs.modal",t=>{this._element===e.target&&this._element===t.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(ut),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,st)})}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(B.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._element.style.overflowY;"hidden"===t||this._element.classList.contains(ct)||(e||(this._element.style.overflowY="hidden"),this._element.classList.add(ct),this._queueCallback(()=>{this._element.classList.remove(ct),this._queueCallback(()=>{this._element.style.overflowY=t},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;if(n&&!e){const e=m()?"paddingLeft":"paddingRight";this._element.style[e]=t+"px"}if(!n&&e){const e=m()?"paddingRight":"paddingLeft";this._element.style[e]=t+"px"}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=ht.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e](t)}})}}B.on(document,lt,'[data-bs-toggle="modal"]',function(e){const t=W.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),B.one(t,at,e=>{e.defaultPrevented||B.one(t,st,()=>{u(this)&&this.focus()})});const n=W.findOne(".modal.show");n&&ht.getInstance(n).hide(),ht.getOrCreateInstance(t).toggle(this)}),G(ht),b(ht);const pt=".bs.offcanvas",gt=".data-api",mt=`load${pt}${gt}`,bt="showing",xt=".offcanvas.show",vt="hidePrevented"+pt,yt="hidden"+pt,_t=`click${pt}${gt}`,Ft={backdrop:!0,keyboard:!0,scroll:!1},wt={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Ct extends z{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Ft}static get DefaultType(){return wt}static get NAME(){return"offcanvas"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||B.trigger(this._element,"show.bs.offcanvas",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new ot).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(bt),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add("show"),this._element.classList.remove(bt),B.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:e})},this._element,!0))}hide(){this._isShown&&(B.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add("hiding"),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove("show","hiding"),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new ot).reset(),B.trigger(this._element,yt)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const e=Boolean(this._config.backdrop);return new Ve({className:"offcanvas-backdrop",isVisible:e,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:e?()=>{"static"!==this._config.backdrop?this.hide():B.trigger(this._element,vt)}:null})}_initializeFocusTrap(){return new Ze({trapElement:this._element})}_addEventListeners(){B.on(this._element,"keydown.dismiss.bs.offcanvas",e=>{"Escape"===e.key&&(this._config.keyboard?this.hide():B.trigger(this._element,vt))})}static jQueryInterface(e){return this.each(function(){const t=Ct.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}B.on(document,_t,'[data-bs-toggle="offcanvas"]',function(e){const t=W.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),c(this))return;B.one(t,yt,()=>{u(this)&&this.focus()});const n=W.findOne(xt);n&&n!==t&&Ct.getInstance(n).hide(),Ct.getOrCreateInstance(t).toggle(this)}),B.on(window,mt,()=>{for(const e of W.find(xt))Ct.getOrCreateInstance(e).show()}),B.on(window,"resize.bs.offcanvas",()=>{for(const e of W.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(e).position&&Ct.getOrCreateInstance(e).hide()}),G(Ct),b(Ct);const Et={"*":["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:[]},At=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),kt=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Tt=(e,t)=>{const n=e.nodeName.toLowerCase();return t.includes(n)?!At.has(n)||Boolean(kt.test(e.nodeValue)):t.filter(e=>e instanceof RegExp).some(e=>e.test(n))},Ot={allowList:Et,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},St={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Dt={entry:"(string|element|function|null)",selector:"(string|element)"};class jt extends ${constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Ot}static get DefaultType(){return St}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){const e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(const[t,n]of Object.entries(this._config.content))this._setContent(e,n,t);const t=e.children[0],n=this._resolvePossibleFunction(this._config.extraClass);return n&&t.classList.add(...n.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(const[t,n]of Object.entries(e))super._typeCheckConfig({selector:t,entry:n},Dt)}_setContent(e,t,n){const i=W.findOne(n,e);i&&((t=this._resolvePossibleFunction(t))?a(t)?this._putElementInTemplate(l(t),i):this._config.html?i.innerHTML=this._maybeSanitize(t):i.textContent=t:i.remove())}_maybeSanitize(e){return this._config.sanitize?function(e,t,n){if(!e.length)return e;if(n&&"function"==typeof n)return n(e);const i=(new window.DOMParser).parseFromString(e,"text/html"),o=[].concat(...i.body.querySelectorAll("*"));for(const e of o){const n=e.nodeName.toLowerCase();if(!Object.keys(t).includes(n)){e.remove();continue}const i=[].concat(...e.attributes),o=[].concat(t["*"]||[],t[n]||[]);for(const t of i)Tt(t,o)||e.removeAttribute(t.nodeName)}return i.body.innerHTML}(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return x(e,[this])}_putElementInTemplate(e,t){if(this._config.html)return t.innerHTML="",void t.append(e);t.textContent=e.textContent}}const Pt=new Set(["sanitize","allowList","sanitizeFn"]),Lt="fade",Nt="show",Bt="hide.bs.modal",Mt="hover",It="focus",Rt={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},Ht={allowList:Et,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"},$t={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 zt extends z{constructor(e,n){if(void 0===t)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e,n),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 Ht}static get DefaultType(){return $t}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),B.off(this._element.closest(".modal"),Bt,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 e=B.trigger(this._element,this.constructor.eventName("show")),t=(d(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!t)return;this._disposePopper();const n=this._getTipElement();this._element.setAttribute("aria-describedby",n.getAttribute("id"));const{container:i}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(i.append(n),B.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(n),n.classList.add(Nt),"ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))B.on(e,"mouseover",f);this._queueCallback(()=>{B.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!B.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Nt),"ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))B.off(e,"mouseover",f);this._activeTrigger.click=!1,this._activeTrigger[It]=!1,this._activeTrigger[Mt]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),B.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(e){const t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(Lt,Nt),t.classList.add(`bs-${this.constructor.NAME}-auto`);const n=(e=>{do{e+=Math.floor(1e6*Math.random())}while(document.getElementById(e));return e})(this.constructor.NAME).toString();return t.setAttribute("id",n),this._isAnimated()&&t.classList.add(Lt),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new jt({...this._config,content:e,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(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Lt)}_isShown(){return this.tip&&this.tip.classList.contains(Nt)}_createPopper(e){const n=x(this._config.placement,[this,e,this._element]),i=Rt[n.toUpperCase()];return t.createPopper(this._element,e,this._getPopperConfig(i))}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_resolvePossibleFunction(e){return x(e,[this._element])}_getPopperConfig(e){const t={placement:e,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:e=>{this._getTipElement().setAttribute("data-popper-placement",e.state.placement)}}]};return{...t,...x(this._config.popperConfig,[t])}}_setListeners(){const e=this._config.trigger.split(" ");for(const t of e)if("click"===t)B.on(this._element,this.constructor.eventName("click"),this._config.selector,e=>{this._initializeOnDelegatedTarget(e).toggle()});else if("manual"!==t){const e=t===Mt?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),n=t===Mt?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");B.on(this._element,e,this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t._activeTrigger["focusin"===e.type?It:Mt]=!0,t._enter()}),B.on(this._element,n,this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t._activeTrigger["focusout"===e.type?It:Mt]=t._element.contains(e.relatedTarget),t._leave()})}this._hideModalHandler=(()=>{this._element&&this.hide()}),B.on(this._element.closest(".modal"),Bt,this._hideModalHandler)}_fixTitle(){const e=this._element.getAttribute("title");e&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),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(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){const t=H.getDataAttributes(this._element);for(const e of Object.keys(t))Pt.has(e)&&delete t[e];return e={...t,..."object"==typeof e&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=!1===e.container?document.body:l(e.container),"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),e}_getDelegateConfig(){const e={};for(const[t,n]of Object.entries(this._config))this.constructor.Default[t]!==n&&(e[t]=n);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){const t=zt.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}b(zt);const qt={...zt.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},Wt={...zt.DefaultType,content:"(null|string|element|function)"};class Gt extends zt{static get Default(){return qt}static get DefaultType(){return Wt}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(e){return this.each(function(){const t=Gt.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}b(Gt);const Xt=".bs.scrollspy",Ut="click"+Xt,Vt=`load${Xt}.data-api`,Kt="active",Qt="[href]",Yt=".nav-link",Jt=`${Yt}, .nav-item > ${Yt}, .list-group-item`,Zt={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},en={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class tn extends z{constructor(e,t){super(e,t),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 Zt}static get DefaultType(){return en}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=l(e.target)||document.body,e.rootMargin=e.offset?e.offset+"px 0px -30%":e.rootMargin,"string"==typeof e.threshold&&(e.threshold=e.threshold.split(",").map(e=>Number.parseFloat(e))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(B.off(this._config.target,Ut),B.on(this._config.target,Ut,Qt,e=>{const t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();const n=this._rootElement||window,i=t.offsetTop-this._element.offsetTop;if(n.scrollTo)return void n.scrollTo({top:i,behavior:"smooth"});n.scrollTop=i}}))}_getNewObserver(){const e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(e=>this._observerCallback(e),e)}_observerCallback(e){const t=e=>this._targetLinks.get("#"+e.target.id),n=e=>{this._previousScrollData.visibleEntryTop=e.target.offsetTop,this._process(t(e))},i=(this._rootElement||document.documentElement).scrollTop,o=i>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=i;for(const r of e){if(!r.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(r));continue}const e=r.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(o&&e){if(n(r),!i)return}else o||e||n(r)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const e=W.find(Qt,this._config.target);for(const t of e){if(!t.hash||c(t))continue;const e=W.findOne(decodeURI(t.hash),this._element);u(e)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,e))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(Kt),this._activateParents(e),B.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:e}))}_activateParents(e){if(e.classList.contains("dropdown-item"))W.findOne(".dropdown-toggle",e.closest(".dropdown")).classList.add(Kt);else for(const t of W.parents(e,".nav, .list-group"))for(const e of W.prev(t,Jt))e.classList.add(Kt)}_clearActiveClass(e){e.classList.remove(Kt);const t=W.find(`${Qt}.${Kt}`,e);for(const e of t)e.classList.remove(Kt)}static jQueryInterface(e){return this.each(function(){const t=tn.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(window,Vt,()=>{for(const e of W.find('[data-bs-spy="scroll"]'))tn.getOrCreateInstance(e)}),b(tn);const nn="ArrowLeft",on="ArrowRight",rn="ArrowUp",sn="ArrowDown",an="Home",ln="End",un="active",cn="show",dn=".dropdown-toggle",fn=`:not(${dn})`,hn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',pn=`.nav-link${fn}, .list-group-item${fn}, [role="tab"]${fn}, ${hn}`,gn=`.${un}[data-bs-toggle="tab"], .${un}[data-bs-toggle="pill"], .${un}[data-bs-toggle="list"]`;class mn extends z{constructor(e){super(e),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),B.on(this._element,"keydown.bs.tab",e=>this._keydown(e)))}static get NAME(){return"tab"}show(){const e=this._element;if(this._elemIsActive(e))return;const t=this._getActiveElem(),n=t?B.trigger(t,"hide.bs.tab",{relatedTarget:e}):null;B.trigger(e,"show.bs.tab",{relatedTarget:t}).defaultPrevented||n&&n.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){e&&(e.classList.add(un),this._activate(W.getElementFromSelector(e)),this._queueCallback(()=>{"tab"===e.getAttribute("role")?(e.removeAttribute("tabindex"),e.setAttribute("aria-selected",!0),this._toggleDropDown(e,!0),B.trigger(e,"shown.bs.tab",{relatedTarget:t})):e.classList.add(cn)},e,e.classList.contains("fade")))}_deactivate(e,t){e&&(e.classList.remove(un),e.blur(),this._deactivate(W.getElementFromSelector(e)),this._queueCallback(()=>{"tab"===e.getAttribute("role")?(e.setAttribute("aria-selected",!1),e.setAttribute("tabindex","-1"),this._toggleDropDown(e,!1),B.trigger(e,"hidden.bs.tab",{relatedTarget:t})):e.classList.remove(cn)},e,e.classList.contains("fade")))}_keydown(e){if(![nn,on,rn,sn,an,ln].includes(e.key))return;e.stopPropagation(),e.preventDefault();const t=this._getChildren().filter(e=>!c(e));let n;if([an,ln].includes(e.key))n=t[e.key===an?0:t.length-1];else{const i=[on,sn].includes(e.key);n=y(t,e.target,i,!0)}n&&(n.focus({preventScroll:!0}),mn.getOrCreateInstance(n).show())}_getChildren(){return W.find(pn,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(const e of t)this._setInitialAttributesOnChild(e)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);const t=this._elemIsActive(e),n=this._getOuterElement(e);e.setAttribute("aria-selected",t),n!==e&&this._setAttributeIfNotExists(n,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){const t=W.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(t,"aria-labelledby",""+e.id))}_toggleDropDown(e,t){const n=this._getOuterElement(e);if(!n.classList.contains("dropdown"))return;const i=(e,i)=>{const o=W.findOne(e,n);o&&o.classList.toggle(i,t)};i(dn,un),i(".dropdown-menu",cn),n.setAttribute("aria-expanded",t)}_setAttributeIfNotExists(e,t,n){e.hasAttribute(t)||e.setAttribute(t,n)}_elemIsActive(e){return e.classList.contains(un)}_getInnerElement(e){return e.matches(pn)?e:W.findOne(pn,e)}_getOuterElement(e){return e.closest(".nav-item, .list-group-item")||e}static jQueryInterface(e){return this.each(function(){const t=mn.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(document,"click.bs.tab",hn,function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),c(this)||mn.getOrCreateInstance(this).show()}),B.on(window,"load.bs.tab",()=>{for(const e of W.find(gn))mn.getOrCreateInstance(e)}),b(mn);const bn="show",xn="showing",vn={animation:"boolean",autohide:"boolean",delay:"number"},yn={animation:!0,autohide:!0,delay:5e3};class _n extends z{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return yn}static get DefaultType(){return vn}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"),h(this._element),this._element.classList.add(bn,xn),this._queueCallback(()=>{this._element.classList.remove(xn),B.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this.isShown()&&(B.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(xn),this._queueCallback(()=>{this._element.classList.add("hide"),this._element.classList.remove(xn,bn),B.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(bn),super.dispose()}isShown(){return this._element.classList.contains(bn)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t}if(t)return void this._clearTimeout();const n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,"mouseover.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"mouseout.bs.toast",e=>this._onInteraction(e,!1)),B.on(this._element,"focusin.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"focusout.bs.toast",e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=_n.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return G(_n),b(_n),{Alert:X,Button:V,Carousel:ge,Collapse:we,Dropdown:qe,Modal:ht,Offcanvas:Ct,Popover:Gt,ScrollSpy:tn,Tab:mn,Toast:_n,Tooltip:zt}}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function t(t,i,o){i={content:{message:"object"==typeof i?i.message:i,title:i.title?i.title:"",icon:i.icon?i.icon:"",url:i.url?i.url:"#",target:i.target?i.target:"-"}},o=e.extend(!0,{},i,o),this.settings=e.extend(!0,{},n,o),this._defaults=n,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var n={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var e=arguments[0],t=1;t .progress-bar').removeClass("progress-bar-"+e.settings.type),e.settings.type=i[t],this.$ele.addClass("alert-"+i[t]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[t]);break;case"icon":var o=this.$ele.find('[data-notify="icon"]');"class"==e.settings.icon_type.toLowerCase()?o.removeClass(e.settings.content.icon).addClass(i[t]):(o.is("img")||o.find("img"),o.attr("src",i[t]));break;case"progress":var r=e.settings.delay-e.settings.delay*(i[t]/100);this.$ele.data("notify-delay",r),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[t]).css("width",i[t]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[t]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[t]);break;default:this.$ele.find('[data-notify="'+t+'"]').html(i[t])}var s=this.$ele.outerHeight()+parseInt(e.settings.spacing)+parseInt(e.settings.offset.y);e.reposition(s)},close:function(){e.close()}}},buildNotify:function(){var t=this.settings.content;this.$ele=e(String.format(this.settings.template,this.settings.type,t.title,t.message,t.url,t.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var t=this,n=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},o=!1,r=this.settings;switch(e('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return n=Math.max(n,parseInt(e(this).css(r.placement.from))+parseInt(e(this).outerHeight())+parseInt(r.spacing))}),1==this.settings.newest_on_top&&(n=this.settings.offset.y),i[this.settings.placement.from]=n+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),e.each(Array("webkit","moz","o","ms",""),function(e,n){t.$ele[0].style[n+"AnimationIterationCount"]=1}),e(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(n=parseInt(n)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(n)),e.isFunction(t.settings.onShow)&&t.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(e){o=!0}).one(this.animations.end,function(n){e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)}),setTimeout(function(){o||e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)},600)},bind:function(){var t=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){t.close()}),this.$ele.mouseover(function(t){e(this).data("data-hover","true")}).mouseout(function(t){e(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){t.$ele.data("notify-delay",t.settings.delay);var n=setInterval(function(){var e=parseInt(t.$ele.data("notify-delay"))-t.settings.timer;if("false"===t.$ele.data("data-hover")&&"pause"==t.settings.mouse_over||"pause"!=t.settings.mouse_over){var i=(t.settings.delay-e)/t.settings.delay*100;t.$ele.data("notify-delay",e),t.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}e<=-t.settings.timer&&(clearInterval(n),t.close())},t.settings.timer)}},close:function(){var t=this,n=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),t.reposition(n),e.isFunction(t.settings.onClose)&&t.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(e){i=!0}).one(this.animations.end,function(n){e(this).remove(),e.isFunction(t.settings.onClosed)&&t.settings.onClosed.call(this)}),setTimeout(function(){i||(t.$ele.remove(),t.settings.onClosed&&t.settings.onClosed(t.$ele))},600)},reposition:function(t){var n=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',o=this.$ele.nextAll(i);1==this.settings.newest_on_top&&(o=this.$ele.prevAll(i)),o.each(function(){e(this).css(n.settings.placement.from,t),t=parseInt(t)+parseInt(n.settings.spacing)+e(this).outerHeight()})}}),e.notify=function(e,n){return new t(this,e,n).notify},e.notifyDefaults=function(t){return n=e.extend(!0,{},n,t)},e.notifyClose=function(t){void 0===t||"all"==t?e("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):e('[data-notify-position="'+t+'"]').find('[data-notify="dismiss"]').trigger("click")}}),function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=15)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.data=t,this.text=n.text||t,this.options=n}},function(e,t,n){"use strict";var i;function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0});var r=t.SET_A=0,s=t.SET_B=1,a=t.SET_C=2,l=(t.SHIFT=98,t.START_A=103),u=t.START_B=104,c=t.START_C=105;t.MODULO=103,t.STOP=106,t.FNC1=207,t.SET_BY_CODE=(o(i={},l,r),o(i,u,s),o(i,c,a),i),t.SWAP={101:r,100:s,99:a},t.A_START_CHAR=String.fromCharCode(208),t.B_START_CHAR=String.fromCharCode(209),t.C_START_CHAR=String.fromCharCode(210),t.A_CHARS="[\0-_È-Ï]",t.B_CHARS="[ -È-Ï]",t.C_CHARS="(Ï*[0-9]{2}Ï*)",t.BARS=[11011001100,11001101100,11001100110,10010011e3,10010001100,10001001100,10011001e3,10011000100,10001100100,11001001e3,11001000100,11000100100,10110011100,10011011100,10011001110,10111001100,10011101100,10011100110,11001110010,11001011100,11001001110,11011100100,11001110100,11101101110,11101001100,11100101100,11100100110,11101100100,11100110100,11100110010,11011011e3,11011000110,11000110110,10100011e3,10001011e3,10001000110,10110001e3,10001101e3,10001100010,11010001e3,11000101e3,11000100010,10110111e3,10110001110,10001101110,10111011e3,10111000110,10001110110,11101110110,11010001110,11000101110,11011101e3,11011100010,11011101110,11101011e3,11101000110,11100010110,11101101e3,11101100010,11100011010,11101111010,11001000010,11110001010,1010011e4,10100001100,1001011e4,10010000110,10000101100,10000100110,1011001e4,10110000100,1001101e4,10011000010,10000110100,10000110010,11000010010,1100101e4,11110111010,11000010100,10001111010,10100111100,10010111100,10010011110,10111100100,10011110100,10011110010,11110100100,11110010100,11110010010,11011011110,11011110110,11110110110,10101111e3,10100011110,10001011110,10111101e3,10111100010,11110101e3,11110100010,10111011110,10111101110,11101011110,11110101110,11010000100,1101001e4,11010011100,1100011101011]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SIDE_BIN="101",t.MIDDLE_BIN="01010",t.BINARIES={L:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],G:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"],R:["1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"],O:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],E:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"]},t.EAN2_STRUCTURE=["LL","LG","GL","GG"],t.EAN5_STRUCTURE=["GGLLL","GLGLL","GLLGL","GLLLG","LGGLL","LLGGL","LLLGG","LGLGL","LGLLG","LLGLG"],t.EAN13_STRUCTURE=["LLLLLL","LLGLGG","LLGGLG","LLGGGL","LGLLGG","LGGLLG","LGGGLL","LGLGLG","LGLGGL","LGGLGL"]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n(2);t.default=function(e,t,n){var o=e.split("").map(function(e,n){return i.BINARIES[t[n]]}).map(function(t,n){return t?t[e[n]]:""});if(n){var r=e.length-1;o=o.map(function(e,t){return t=200){r=e.shift()-105;var a=s.SWAP[r];void 0!==a?o=t.next(e,n+1,a):(i!==s.SET_A&&i!==s.SET_B||r!==s.SHIFT||(e[0]=i===s.SET_A?e[0]>95?e[0]-96:e[0]:e[0]<32?e[0]+96:e[0]),o=t.next(e,n+1,i))}else r=t.correctIndex(e,i),o=t.next(e,n+1,i);var l=r*n;return{result:t.getBar(r)+o.result,checksum:l+o.checksum}}}]),t}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mod10=function(e){for(var t=0,n=0;n10*n.width?10*n.width:n.fontSize,i.guardHeight=n.height+i.fontSize/2+n.textMargin,i}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,s(n(0)).default),i(t,[{key:"encode",value:function(){return this.options.flat?this.encodeFlat():this.encodeGuarded()}},{key:"leftText",value:function(e,t){return this.text.substr(e,t)}},{key:"leftEncode",value:function(e,t){return(0,r.default)(e,t)}},{key:"rightText",value:function(e,t){return this.text.substr(e,t)}},{key:"rightEncode",value:function(e,t){return(0,r.default)(e,t)}},{key:"encodeGuarded",value:function(){var e={fontSize:this.fontSize},t={height:this.guardHeight};return[{data:o.SIDE_BIN,options:t},{data:this.leftEncode(),text:this.leftText(),options:e},{data:o.MIDDLE_BIN,options:t},{data:this.rightEncode(),text:this.rightText(),options:e},{data:o.SIDE_BIN,options:t}]}},{key:"encodeFlat",value:function(){return{data:[o.SIDE_BIN,this.leftEncode(),o.MIDDLE_BIN,this.rightEncode(),o.SIDE_BIN].join(""),text:this.text}}}]),t}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n10*n.width?i.fontSize=10*n.width:i.fontSize=n.fontSize,i.guardHeight=n.height+i.fontSize/2+n.textMargin,i}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,r(n(0)).default),i(t,[{key:"valid",value:function(){return-1!==this.data.search(/^[0-9]{12}$/)&&this.data[11]==a(this.data)}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var e="";return e+="101",e+=(0,o.default)(this.data.substr(0,6),"LLLLLL"),e+="01010",e+=(0,o.default)(this.data.substr(6,6),"RRRRRR"),{data:e+="101",text:this.text}}},{key:"guardedEncoding",value:function(){var e=[];return this.displayValue&&e.push({data:"00000000",text:this.text.substr(0,1),options:{textAlign:"left",fontSize:this.fontSize}}),e.push({data:"101"+(0,o.default)(this.data[0],"L"),options:{height:this.guardHeight}}),e.push({data:(0,o.default)(this.data.substr(1,5),"LLLLL"),text:this.text.substr(1,5),options:{fontSize:this.fontSize}}),e.push({data:"01010",options:{height:this.guardHeight}}),e.push({data:(0,o.default)(this.data.substr(6,5),"RRRRR"),text:this.text.substr(6,5),options:{fontSize:this.fontSize}}),e.push({data:(0,o.default)(this.data[11],"R")+"101",options:{height:this.guardHeight}}),this.displayValue&&e.push({data:"00000000",text:this.text.substr(11,1),options:{textAlign:"right",fontSize:this.fontSize}}),e}}]),t}();function a(e){var t,n=0;for(t=1;t<11;t+=2)n+=parseInt(e[t]);for(t=0;t<11;t+=2)n+=3*parseInt(e[t]);return(10-n%10)%10}t.default=s},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i,o=function(){function e(e,t){for(var n=0;n0?t.fontSize+t.textMargin:0)+t.marginTop+t.marginBottom}function s(e,t,n){if(n.displayValue&&tt&&(t=e[n].height);return t},t.getEncodingHeight=r,t.getBarcodePadding=s,t.calculateEncodingAttributes=function(e,t,n){for(var i=0;i=r(e);return t+String.fromCharCode(i?206:205)+a(e,i)}t.default=function(e){var t=void 0;if(s(e).length>=2)t=i.C_START_CHAR+l(e);else{var n=o(e)>r(e);t=(n?i.A_START_CHAR:i.B_START_CHAR)+a(e,n)}return t.replace(/[\xCD\xCE]([^])[\xCD\xCE]/,function(e,t){return String.fromCharCode(203)+t})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i,o=function(){function e(e,t){for(var n=0;n10*n.width?i.fontSize=10*n.width:i.fontSize=n.fontSize,i.guardHeight=n.height+i.fontSize/2+n.textMargin,i}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,r.default),i(t,[{key:"valid",value:function(){return this.isValid}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var e="";return e+="101",e+=this.encodeMiddleDigits(),{data:e+="010101",text:this.text}}},{key:"guardedEncoding",value:function(){var e=[];return this.displayValue&&e.push({data:"00000000",text:this.text[0],options:{textAlign:"left",fontSize:this.fontSize}}),e.push({data:"101",options:{height:this.guardHeight}}),e.push({data:this.encodeMiddleDigits(),text:this.text.substring(1,7),options:{fontSize:this.fontSize}}),e.push({data:"010101",options:{height:this.guardHeight}}),this.displayValue&&e.push({data:"00000000",text:this.text[7],options:{textAlign:"right",fontSize:this.fontSize}}),e}},{key:"encodeMiddleDigits",value:function(){var e=this.upcA[0],t=this.upcA[this.upcA.length-1],n=c[parseInt(t)][parseInt(e)];return(0,o.default)(this.middleDigits,n)}}]),t}();function f(e,t){for(var n=parseInt(e[e.length-1]),i=u[n],o="",r=0,a=0;a=3&&this.number<=131070}}]),t}();t.pharmacode=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.codabar=void 0;var i,o=function(){function e(e,t){for(var n=0;n0?(n=0,o.textAlign="left"):"right"==e.textAlign?(n=t.width-1,o.textAlign="right"):(n=t.width/2,o.textAlign="center"),o.fillText(t.text,n,i))}},{key:"moveCanvasDrawing",value:function(e){this.canvas.getContext("2d").translate(e.width,0)}},{key:"restoreCanvas",value:function(){this.canvas.getContext("2d").restore()}}]),e}();t.default=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i,o=function(){function e(e,t){for(var n=0;n0&&(this.drawRect(s-t.width*r,i,t.width*r,t.height,e),r=0);r>0&&this.drawRect(s-t.width*(r-1),i,t.width*r,t.height,e)}},{key:"drawSVGText",value:function(e,t,n){var i,o,r=this.document.createElementNS(a,"text");t.displayValue&&(r.setAttribute("style","font:"+t.fontOptions+" "+t.fontSize+"px "+t.font),o="top"==t.textPosition?t.fontSize-t.textMargin:t.height+t.textMargin+t.fontSize,"left"==t.textAlign||n.barcodePadding>0?(i=0,r.setAttribute("text-anchor","start")):"right"==t.textAlign?(i=n.width-1,r.setAttribute("text-anchor","end")):(i=n.width/2,r.setAttribute("text-anchor","middle")),r.setAttribute("x",i),r.setAttribute("y",o),r.appendChild(this.document.createTextNode(n.text)),e.appendChild(r))}},{key:"setSvgAttributes",value:function(e,t){var n=this.svg;n.setAttribute("width",e+"px"),n.setAttribute("height",t+"px"),n.setAttribute("x","0px"),n.setAttribute("y","0px"),n.setAttribute("viewBox","0 0 "+e+" "+t),n.setAttribute("xmlns",a),n.setAttribute("version","1.1"),n.setAttribute("style","transform: translate(0,0)")}},{key:"createGroup",value:function(e,t,n){var i=this.document.createElementNS(a,"g");return i.setAttribute("transform","translate("+e+", "+t+")"),n.appendChild(i),i}},{key:"setGroupOptions",value:function(e,t){e.setAttribute("style","fill:"+t.lineColor+";")}},{key:"drawRect",value:function(e,t,n,i,o){var r=this.document.createElementNS(a,"rect");return r.setAttribute("x",e),r.setAttribute("y",t),r.setAttribute("width",n),r.setAttribute("height",i),o.appendChild(r),r}}]),e}();t.default=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;ne.length)return;if(!(_ instanceof l)){if(g&&v!=t.length-1){if(f.lastIndex=y,!(k=f.exec(e)))break;for(var F=k.index+(p?k[1].length:0),w=k.index+k[0].length,C=v,E=y,A=t.length;C"+r.content+""},!_self.document)return _self.addEventListener&&(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),i=t.language,o=t.code,r=t.immediateClose;_self.postMessage(n.highlight(o,n.languages[i],i)),r&&_self.close()},!1)),_self.Prism;var o=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return o&&(n.filename=o.src,n.manual||o.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/[a-z0-9_]+(?=\()/i,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,function:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}}}),Prism.languages.javascript["template-string"].inside.interpolation.inside.rest=Prism.languages.javascript,Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(){var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){for(var n,i=t.getAttribute("data-src"),o=t,r=/\blang(?:uage)?-([\w-]+)\b/i;o&&!r.test(o.className);)o=o.parentNode;if(o&&(n=(t.className.match(r)||[,""])[1]),!n){var s=(i.match(/\.(\w+)$/)||[,""])[1];n=e[s]||s}var a=document.createElement("code");a.className="language-"+n,t.textContent="",a.textContent="Loading…",t.appendChild(a);var l=new XMLHttpRequest;l.open("GET",i,!0),l.onreadystatechange=function(){4==l.readyState&&(l.status<400&&l.responseText?(a.textContent=l.responseText,Prism.highlightElement(a)):400<=l.status?a.textContent="✖ Error "+l.status+" while fetching file: "+l.statusText:a.textContent="✖ Error: File does not exist or is empty")},l.send(null)}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),i=document.createElement("a");return i.textContent=t.getAttribute("data-download-link-label")||"Download",i.setAttribute("download",""),i.href=n,i}})},document.addEventListener("DOMContentLoaded",self.Prism.fileHighlight)),function(e){"use strict";function t(e,t){e.className+=" "+t}function n(e,t){for(var n=e.className.split(" "),i=t.split(" "),o=0;o-1&&n.splice(r,1)}e.className=n.join(" ")}function i(){return"rtl"===e.getComputedStyle(document.body).direction}function o(){return document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop}function r(){return document.documentElement&&document.documentElement.scrollLeft||document.body.scrollLeft}function s(e){for(;e.lastChild;)e.removeChild(e.lastChild)}function a(e){if(null===e)return e;var t;if(Array.isArray(e)){t=[];for(var n=0;n0){for(var n=[],i=0;i=0?(n(document.body,Fe.noOverflow),k(!1)):e>0&&document.body.className.indexOf(Fe.noOverflow)<0&&(k(!0),t(document.body,Fe.noOverflow))}function k(i){T.defaults.preventBodyShift&&(i&&document.documentElement.scrollHeight>document.documentElement.clientHeight?(Ce=be,we=e.getComputedStyle(document.body).top,t(document.body,Fe.fixed),document.body.style.top=-be+"px"):i||(be=Ce,document.body.style.top=we,n(document.body,Fe.fixed),F()))}function O(e,t){for(var n=y.indexOf(t)+1;n200&&(Ae=e.timeStamp)&&!Ee){var n=e.srcElement||e.target;!0===t.get("closableByDimmer")&&n===t.elements.modal&&j(t)}Ee=!1}function z(e,t){if(Date.now()-ke>200&&(ke=Date.now()))for(var n=0;n-1?(z(t,function(e){return e.key===n}),!1):void 0}Te=!1}function G(e){var t=y[y.length-1],n=e.keyCode;if(n===m||n===b){for(var i=t.__internal.buttons,o=0;op-1&&xe.indexOf(n)>-1)return e.preventDefault(),e.stopPropagation(),z(t,function(e){return e.key===n}),!1}function X(e,t){if(t)t.focus();else{var n=e.__internal.focus,i=n.element;switch(typeof n.element){case"number":e.__internal.buttons.length>n.element&&(i=!0===e.get("basic")?e.elements.reset[0]:e.__internal.buttons[n.element].element);break;case"string":i=e.elements.body.querySelector(n.element);break;case"function":i=n.element.call(e)}!0!==e.get("defaultFocusOff")&&(null!=i||0!==e.__internal.buttons.length)||(i=e.elements.reset[0]),i&&i.focus&&(i.focus(),n.select&&i.select&&i.select())}}function U(e,t){if(!t)for(var n=y.length-1;n>-1;n-=1)if(y[n].isModal()){t=y[n];break}if(t&&t.isModal()){var i,o=t.elements.reset[0],r=t.elements.reset[1],s=e.relatedTarget,a=t.elements.root.contains(s),l=e.srcElement||e.target;if(l===o&&!a||l===r&&s===o)return;l===r||l===document.body?i=o:l===o&&s===r?i=V(t):l===o&&a&&(i=V(t,!0)),X(t,i)}}function V(e,t){var n=[].slice.call(e.elements.dialog.querySelectorAll(v.tabbable));t&&n.reverse();for(var i=0;iRe?t.style.left=Ie+c+"px":t.offsetWidth>=He&&(t.style.left=Ie-c+"px")}}(t,Me.elements.dialog,!Me.get("modal")&&!Me.get("pinned")))}function se(){if(Me){var e=Me;Me=null,n(document.body,Fe.noSelection),n(e.elements.dialog,Fe.capture),Ee=!0,d("onresized",e)}}function ae(e){Me=null;var t=e.elements.dialog;"none"===t.style.maxWidth&&(t.style.maxWidth=t.style.minWidth=t.style.width=t.style.height=t.style.minHeight=t.style.left="",Ie=Number.Nan,Re=He=$e=0)}function le(){for(var e=0;e-1&&e.navigator.userAgent.indexOf("Chrome")<0,_e={dimmer:'
',modal:'
',dialog:'
',reset:'',commands:'
',header:'
',body:'
',content:'
',footer:'',buttons:{primary:'
',auxiliary:'
'},button:'',resizeHandle:'
'},Fe={animationIn:"ajs-in",animationOut:"ajs-out",base:"alertify",basic:"ajs-basic",capture:"ajs-capture",closable:"ajs-closable",fixed:"ajs-fixed",frameless:"ajs-frameless",hidden:"ajs-hidden",maximize:"ajs-maximize",maximized:"ajs-maximized",maximizable:"ajs-maximizable",modeless:"ajs-modeless",movable:"ajs-movable",noSelection:"ajs-no-selection",noOverflow:"ajs-no-overflow",noPadding:"ajs-no-padding",pin:"ajs-pin",pinnable:"ajs-pinnable",prefix:"ajs-",resizable:"ajs-resizable",restore:"ajs-restore",shake:"ajs-shake",unpinned:"ajs-unpinned",noTransition:"ajs-no-transition"},we="",Ce=0,Ee=!1,Ae=0,ke=0,Te=!1,Oe=null,Se=0,De=0,je="pageX",Pe="pageY",Le=null,Ne=!1,Be=null,Me=null,Ie=Number.Nan,Re=0,He=0,$e=0;return{__init:f,isOpen:function(){return this.__internal.isOpen},isModal:function(){return this.elements.root.className.indexOf(Fe.modeless)<0},isMaximized:function(){return this.elements.root.className.indexOf(Fe.maximized)>-1},isPinned:function(){return this.elements.root.className.indexOf(Fe.unpinned)<0},maximize:function(){return this.isMaximized()||B(this),this},restore:function(){return this.isMaximized()&&M(this),this},pin:function(){return this.isPinned()||L(this),this},unpin:function(){return this.isPinned()&&N(this),this},bringToFront:function(){return O(0,this),this},moveTo:function(e,t){if(!isNaN(e)&&!isNaN(t)){d("onmove",this);var n=this.elements.dialog,o=n,r=0,s=0;n.style.left&&(r-=parseInt(n.style.left,10)),n.style.top&&(s-=parseInt(n.style.top,10));do{r+=o.offsetLeft,s+=o.offsetTop}while(o=o.offsetParent);var a=e-r,l=t-s;i()&&(a*=-1),n.style.left=a+"px",n.style.top=l+"px",d("onmoved",this)}return this},resizeTo:function(e,t){var n=parseFloat(e),i=parseFloat(t),o=/(\d*\.\d+|\d+)%/;if(!isNaN(n)&&!isNaN(i)&&!0===this.get("resizable")){d("onresize",this),(""+e).match(o)&&(n=n/100*document.documentElement.clientWidth),(""+t).match(o)&&(i=i/100*document.documentElement.clientHeight);var r=this.elements.dialog;"none"!==r.style.maxWidth&&(r.style.minWidth=(He=r.offsetWidth)+"px"),r.style.maxWidth="none",r.style.minHeight=this.elements.header.offsetHeight+this.elements.footer.offsetHeight+"px",r.style.width=n+"px",r.style.height=i+"px",d("onresized",this)}return this},setting:function(e,t){var n=this,i=D(this,this.__internal.options,function(e,t,i){S(n,e,t,i)},e,t);if("get"===i.op)return i.found?i.value:void 0!==this.settings?D(this,this.settings,this.settingUpdated||function(){},e,t).value:void 0;if("set"===i.op){if(i.items.length>0)for(var o=this.settingUpdated||function(){},r=0;r0){var t=this;this.__internal.timer=setTimeout(function(){t.dismiss()},1e3*this.__internal.delay)}return this},setContent:function(n){if("string"==typeof n?(s(this.element),this.element.innerHTML=n):n instanceof e.HTMLElement&&this.element.firstChild!==n&&(s(this.element),this.element.appendChild(n)),this.__internal.closeButton){var i=document.createElement("span");t(i,f.close),i.setAttribute("data-close",!0),this.element.appendChild(i)}return this},dismissOthers:function(){return k.dismissAll(this),this}})}var c,d=[],f=v.notifier.classes,h=f.base;return{setting:function(e,t){if(i(this),void 0===t)return this.__internal[e];switch(e){case"position":this.__internal.position=t,a(this);break;case"delay":this.__internal.delay=t}return this},set:function(e,t){return this.setting(e,t),this},get:function(e){return this.setting(e)},create:function(e,t){i(this);var n=document.createElement("div");return n.className=f.message+("string"==typeof e&&""!==e?" "+f.prefix+e:""),l(n,t)},dismissAll:function(e){for(var t=d.slice(0),n=0;n>t?1:0;return n}function h(e,t,n,i,o,r,s){var a=p;a(e,t,n[0],i-2,o-2,r,s),a(e,t,n[1],i-2,o-1,r,s),a(e,t,n[2],i-1,o-2,r,s),a(e,t,n[3],i-1,o-1,r,s),a(e,t,n[4],i-1,o,r,s),a(e,t,n[5],i,o-2,r,s),a(e,t,n[6],i,o-1,r,s),a(e,t,n[7],i,o,r,s)}function p(e,t,n,i,o,r,s){i<0&&(i+=r,o+=4-(r+4)%8),o<0&&(o+=s,i+=4-(s+4)%8),1!==t[i][o]&&(e[i][o]=n,t[i][o]=1)}return function(g,m){var b,x=function(e){var t,n,i=[],o=0;for(t=0;t>=8;return i}function F(e,t,n){return String.fromCharCode(n)+String.fromCharCode(t)+String.fromCharCode(e)}function w(e){var t=parseInt("0x"+e.substr(1),16),n=255&t;return F((t>>=8)>>8,255&t,n)}function C(e){return e.match(/#[0-91-F]/gi)}function E(e){for(var t,n,i,o,r,s,a,l="",u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c=0;c>2,r=(3&t)<<4|(n=e.charCodeAt(c++))>>4,s=(15&n)<<2|(i=e.charCodeAt(c++))>>6,a=63&i,isNaN(n)?s=a=64:isNaN(i)&&(a=64),l+=u.charAt(o)+u.charAt(r)+u.charAt(s)+u.charAt(a);return l}function A(e){var t,n=[];for(n[0]=[],t=0;t
',p='
';for(a=0;a'+i+""),k(e,o*d).html(f)}function S(e,t,n,i,o,r){var s,a,l,u,c,d,f,h,p=n.length,g=n[0].length,m=o*g,b=r*p;for(t.showHRI&&(l=y(t.fontSize),b+=y(t.marginHRI)+l),u='',u+='',c='',a=0;a',u+=''+i+"",u+=""),u+="",(h=document.createElement("img")).setAttribute("src","data:image/svg+xml;base64,"+E(u)),k(e,m).append(h)}function D(e,t,n,i,o,r,s,a){var l,u,c,d,f,h,p=e.get(0),g=n.length,m=n[0].length;if(p&&p.getContext){for((c=p.getContext("2d")).lineWidth=1,c.lineCap="butt",c.fillStyle=t.bgColor,c.fillRect(o,r,m*s,g*a),c.fillStyle=t.color,u=0;u?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",a=0,l=0,u=0;for(t=0;te||this.moduleCount<=e||0>t||this.moduleCount<=t)throw Error(e+","+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){var e=1;for(e=1;40>e;e++){for(var t=s.getRSBlocks(e,this.errorCorrectLevel),n=new a,i=0,o=0;o=n;n++)if(!(-1>=e+n||this.moduleCount<=e+n))for(var i=-1;7>=i;i++)-1>=t+i||this.moduleCount<=t+i||(this.modules[e+n][t+i]=0<=n&&6>=n&&(0==i||6==i)||0<=i&&6>=i&&(0==n||6==n)||2<=n&&4>=n&&2<=i&&4>=i)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;8>n;n++){this.makeImpl(!0,n);var i=l.getLostPoint(this);(0==n||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){for(e=e.createEmptyMovieClip(t,n),this.make(),t=0;t=r;r++)for(var s=-2;2>=s;s++)this.modules[i+r][o+s]=-2==r||2==r||-2==s||2==s||0==r&&0==s}},setupTypeNumber:function(e){for(var t=l.getBCHTypeNumber(this.typeNumber),n=0;18>n;n++){var i=!e&&1==(t>>n&1);this.modules[Math.floor(n/3)][n%3+this.moduleCount-8-3]=i}for(n=0;18>n;n++)i=!e&&1==(t>>n&1),this.modules[n%3+this.moduleCount-8-3][Math.floor(n/3)]=i},setupTypeInfo:function(e,t){for(var n=l.getBCHTypeInfo(this.errorCorrectLevel<<3|t),i=0;15>i;i++){var o=!e&&1==(n>>i&1);6>i?this.modules[i][8]=o:8>i?this.modules[i+1][8]=o:this.modules[this.moduleCount-15+i][8]=o}for(i=0;15>i;i++)o=!e&&1==(n>>i&1),8>i?this.modules[8][this.moduleCount-i-1]=o:9>i?this.modules[8][15-i-1+1]=o:this.modules[8][15-i-1]=o;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,o=7,r=0,s=this.moduleCount-1;0a;a++)if(null==this.modules[i][s-a]){var u=!1;r>>o&1)),l.getMask(t,i,s-a)&&(u=!u),this.modules[i][s-a]=u,-1==--o&&(r++,o=7)}if(0>(i+=n)||this.moduleCount<=i){i-=n,n=-n;break}}}},o.PAD0=236,o.PAD1=17,o.createData=function(e,t,n){t=s.getRSBlocks(e,t);for(var i=new a,r=0;r8*e)throw Error("code length overflow. ("+i.getLengthInBits()+">"+8*e+")");for(i.getLengthInBits()+4<=8*e&&i.put(0,4);0!=i.getLengthInBits()%8;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*e||(i.put(o.PAD0,8),i.getLengthInBits()>=8*e));)i.put(o.PAD1,8);return o.createBytes(i,t)},o.createBytes=function(e,t){for(var n=0,i=0,o=0,s=Array(t.length),a=Array(t.length),u=0;u>>=1;return t},getPatternPosition:function(e){return l.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case 0:return 0==(t+n)%2;case 1:return 0==t%2;case 2:return 0==n%3;case 3:return 0==(t+n)%3;case 4:return 0==(Math.floor(t/2)+Math.floor(n/3))%2;case 5:return 0==t*n%2+t*n%3;case 6:return 0==(t*n%2+t*n%3)%2;case 7:return 0==(t*n%3+(t+n)%2)%2;default:throw Error("bad maskPattern:"+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;nt)switch(e){case 1:return 10;case 2:return 9;case n:case 8:return 8;default:throw Error("mode:"+e)}else if(27>t)switch(e){case 1:return 12;case 2:return 11;case n:return 16;case 8:return 10;default:throw Error("mode:"+e)}else{if(!(41>t))throw Error("type:"+t);switch(e){case 1:return 14;case 2:return 13;case n:return 16;case 8:return 12;default:throw Error("mode:"+e)}}},getLostPoint:function(e){for(var t=e.getModuleCount(),n=0,i=0;i=a;a++)if(!(0>i+a||t<=i+a))for(var l=-1;1>=l;l++)0>o+l||t<=o+l||0==a&&0==l||s==e.isDark(i+a,o+l)&&r++;5e)throw Error("glog("+e+")");return u.LOG_TABLE[e]},gexp:function(e){for(;0>e;)e+=255;for(;256<=e;)e-=255;return u.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},c=0;8>c;c++)u.EXP_TABLE[c]=1<c;c++)u.EXP_TABLE[c]=u.EXP_TABLE[c-4]^u.EXP_TABLE[c-5]^u.EXP_TABLE[c-6]^u.EXP_TABLE[c-8];for(c=0;255>c;c++)u.LOG_TABLE[u.EXP_TABLE[c]]=c;return r.prototype={get:function(e){return this.num[e]},getLength:function(){return this.num.length},multiply:function(e){for(var t=Array(this.getLength()+e.getLength()-1),n=0;nthis.getLength()-e.getLength())return this;for(var t=u.glog(this.get(0))-u.glog(e.get(0)),n=Array(this.getLength()),i=0;i>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},"string"==typeof t&&(t={text:t}),t=e.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,correctLevel:2,background:"#ffffff",foreground:"#000000"},t),this.each(function(){var n;if("canvas"==t.render){(n=new o(t.typeNumber,t.correctLevel)).addData(t.text),n.make();var i=document.createElement("canvas");i.width=t.width,i.height=t.height;for(var r=i.getContext("2d"),s=t.width/n.getModuleCount(),a=t.height/n.getModuleCount(),l=0;l").css("width",t.width+"px").css("height",t.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",t.background),r=t.width/n.getModuleCount(),s=t.height/n.getModuleCount(),a=0;a").css("height",s+"px").appendTo(i),u=0;u").css("width",r+"px").css("background-color",n.isDark(a,u)?t.foreground:t.background).appendTo(l);n=i,jQuery(n).appendTo(this)})}}(jQuery),function(){"use strict";var e="undefined"!=typeof window&&void 0!==window.document?window.document:{},t="undefined"!=typeof module&&module.exports,n=function(){for(var t,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=0,o=n.length,r={};i",{class:n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=i("
"),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=i("
\ No newline at end of file +
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/localize/list.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/localize/list.html index 54144f81e..37e9d3152 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/localize/list.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/localize/list.html @@ -1 +1 @@ -
KeywordValueDefault ValueCategory
\ No newline at end of file +
Setting KeyDescriptionValueCategory
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/details.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/details.html index 26ad00a43..d4a5f17f8 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/details.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/details.html @@ -1 +1 @@ -

Create {{mixDatabaseTitle}}'s data

Fill all of the following columns to create a new data for {{mixDatabaseTitle}} database.

\ No newline at end of file +

Create {{mixDatabaseTitle}}'s data

Fill all of the following columns to create a new data for {{mixDatabaseTitle}} database.

\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/list.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/list.html index 2c3e85ba9..e952cd5f7 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/list.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mix-database-data/list.html @@ -1 +1 @@ -
Total items:
\ No newline at end of file +
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/components/mix-databases/view.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/components/mix-databases/view.html index bd9c391d3..0c4933d09 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/components/mix-databases/view.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/components/mix-databases/view.html @@ -1 +1 @@ -
DatabaseNameTypeAuthor
{{item.displayName}}{{item.systemName}}{{item.type}}{{item.createdBy}}🟢 🟡 🔴 ⚫️
\ No newline at end of file +
DatabaseNameTypeAuthor
{{item.displayName}}{{item.systemName}}{{item.type}}{{item.createdBy}}🟢 🟡 🔴 ⚫️
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/details.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/details.html index 28a6f9dd2..b0ae8d527 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/details.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/mixdb-context/details.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/oauth-client/details.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/oauth-client/details.html new file mode 100644 index 000000000..c18fbeac4 --- /dev/null +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/oauth-client/details.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/oauth-client/list.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/oauth-client/list.html new file mode 100644 index 000000000..fd5363bc8 --- /dev/null +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/oauth-client/list.html @@ -0,0 +1 @@ +
NameApplicationTypeRefreshTokenLifeTimeSecretIsActive
{{item.createdDateTime | utcToLocal:'dd.MM.yy hh:mm a'}}{{item.createdBy}}🟢 🟡 🔴 ⚫️
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/components/theme-export-mix-databases/view.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/components/theme-export-mix-databases/view.html index 9f37a9716..3f4422c9b 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/components/theme-export-mix-databases/view.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/components/theme-export-mix-databases/view.html @@ -1 +1 @@ -

\ No newline at end of file +

\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/export.html b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/export.html index 83641d93d..142214851 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/export.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-portal/pages/theme/export.html @@ -1,3 +1,3 @@ -
Include Configurations
+
Include Configurations
 {{exportThemeDto|json}}
 
\ No newline at end of file diff --git a/src/applications/mixcore/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html b/src/applications/mixcore/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html index 30bec9d9f..e649396d9 100644 --- a/src/applications/mixcore/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html +++ b/src/applications/mixcore/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html @@ -1 +1 @@ -
Loading...
{{$ctrl.translate($ctrl.column.systemName)}}: {{$ctrl.translate($ctrl.editor)}}
\ No newline at end of file +
Loading...
{{$ctrl.translate($ctrl.column.systemName)}}: {{$ctrl.translate($ctrl.editor)}}
\ No newline at end of file diff --git a/src/modules/mix.common/Controllers/PostContentApiController.cs b/src/modules/mix.common/Controllers/PostContentApiController.cs index 50c802535..40dcc6c3c 100644 --- a/src/modules/mix.common/Controllers/PostContentApiController.cs +++ b/src/modules/mix.common/Controllers/PostContentApiController.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc; +using MessagePack.Resolvers; +using Microsoft.AspNetCore.Mvc; using Mix.Common.Domain.ViewModels; using Mix.Heart.Extensions; using Mix.Heart.Models; @@ -69,7 +70,7 @@ protected override async Task GetById(int id) if (result.AdditionalData == null) { await result.LoadAdditionalDataAsync(_mixDbDataService); - await CacheService.SetAsync($"{id}/{typeof(PostContentViewModel).FullName}", result, typeof(MixPostContent).FullName, "full"); + await CacheService.SetAsync($"{id}/{typeof(PostContentViewModel).Name}", result, $"{typeof(MixPostContent).Assembly.GetName().Name}_{typeof(MixPostContent).Name}", "full"); } return result; } diff --git a/src/modules/mix.common/Controllers/SettingApiController.cs b/src/modules/mix.common/Controllers/SettingApiController.cs index 74bcc966c..43dcac252 100644 --- a/src/modules/mix.common/Controllers/SettingApiController.cs +++ b/src/modules/mix.common/Controllers/SettingApiController.cs @@ -6,7 +6,7 @@ using Mix.Mq.Lib.Models; using Mix.Queue.Interfaces; using Mix.Service.Models; -using MySqlX.XDevAPI.Common; +using Mix.Shared.Services; namespace Mix.Common.Controllers { @@ -25,7 +25,7 @@ public SettingApiController( MixIdentityService mixIdentityService, IMemoryQueueService queueService, IMixTenantService mixTenantService) - : base(httpContextAccessor, configuration, + : base(httpContextAccessor, configuration, cacheService, translator, mixIdentityService, queueService, mixTenantService) { } @@ -80,7 +80,9 @@ public ActionResult LoadData(MixAppConfigEnums settingType) string filePath = GetSettingFilePath(settingType); if (!string.IsNullOrEmpty(filePath)) { - _settingService = new(filePath); + var aesKey = GlobalConfigService.Instance.AppSettings.ApiEncryptKey; + _settingService = new(filePath, aesKey: aesKey); + return Ok(_settingService.AppSettings); } return NotFound(); diff --git a/src/modules/mix.common/Controllers/SharedApiController.cs b/src/modules/mix.common/Controllers/SharedApiController.cs index 563f49fda..27f76a3e6 100644 --- a/src/modules/mix.common/Controllers/SharedApiController.cs +++ b/src/modules/mix.common/Controllers/SharedApiController.cs @@ -75,7 +75,7 @@ public ActionResult EncryptMessage(CryptoMessageDto encryptMessage) string msg = encryptMessage.ObjectData != null ? encryptMessage.ObjectData.ToString(Formatting.None) : encryptMessage.StringData; - var result = AesEncryptionHelper.EncryptString(msg, key); + var result = AesEncryptionHelper.EncryptString(msg, key, encryptMessage.GetEncoding()); return Ok(result); } @@ -84,7 +84,7 @@ public ActionResult EncryptMessage(CryptoMessageDto encryptMessage) public ActionResult DecryptMessage(CryptoMessageDto encryptMessage) { string key = encryptMessage.Key ?? GlobalConfigService.Instance.AppSettings.ApiEncryptKey; - string msg = AesEncryptionHelper.DecryptString(encryptMessage.StringData, key); + string msg = AesEncryptionHelper.DecryptString(encryptMessage.StringData, key, encryptMessage.GetEncoding()); return Ok(msg); } diff --git a/src/modules/mix.common/Domain/Dtos/CryptoMessageDto.cs b/src/modules/mix.common/Domain/Dtos/CryptoMessageDto.cs index b65340753..7bb3a10eb 100644 --- a/src/modules/mix.common/Domain/Dtos/CryptoMessageDto.cs +++ b/src/modules/mix.common/Domain/Dtos/CryptoMessageDto.cs @@ -1,9 +1,21 @@ -namespace Mix.Common.Domain.Dtos +using Mix.Common.Domain.Enums; +using System.Text; + +namespace Mix.Common.Domain.Dtos { public class CryptoMessageDto { public string Key { get; set; } public JObject ObjectData { get; set; } public string StringData { get; set; } + public MixEncoding EncodingType { get; set; } + public Encoding GetEncoding() + { + return EncodingType switch + { + MixEncoding.UNICODE => Encoding.Unicode, + _ => Encoding.UTF8 + }; + } } } diff --git a/src/modules/mix.common/Domain/Enums/MixEncoding.cs b/src/modules/mix.common/Domain/Enums/MixEncoding.cs new file mode 100644 index 000000000..602694c8e --- /dev/null +++ b/src/modules/mix.common/Domain/Enums/MixEncoding.cs @@ -0,0 +1,12 @@ +namespace Mix.Common.Domain.Enums +{ + public enum MixEncoding + { + UTF8, + UTF16, + UTF32, + UTF64, + UTF128, + UNICODE + } +} diff --git a/src/modules/mix.common/Startup.cs b/src/modules/mix.common/Startup.cs index 3e316e154..67683ded4 100644 --- a/src/modules/mix.common/Startup.cs +++ b/src/modules/mix.common/Startup.cs @@ -1,4 +1,5 @@ using Mix.Database.Entities.Account; +using Mix.Lib.Services; using System.Reflection; namespace Mix.Common @@ -19,6 +20,7 @@ public void ConfigureServices(IServiceCollection services) // Must app Auth config after Add mixservice to init App config services.AddMixAuthorize(Configuration); + services.AddScoped(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. diff --git a/src/modules/mix.grpc/Domain/Models/GrpcChannelModel.cs b/src/modules/mix.grpc/Domain/Models/GrpcChannelModel.cs index 2eca7593d..9adb822df 100644 --- a/src/modules/mix.grpc/Domain/Models/GrpcChannelModel.cs +++ b/src/modules/mix.grpc/Domain/Models/GrpcChannelModel.cs @@ -47,7 +47,7 @@ private GrpcChannel CreateChannel(string address) // CallCredentials can't be used with ChannelCredentials.Insecure on non-TLS channels. var channel = GrpcChannel.ForAddress(address, new GrpcChannelOptions { - //Credentials = ChannelCredentials.Create(new SslCredentials(), credentials), + //Credentials = ChannelCredentials.POST(new SslCredentials(), credentials), HttpHandler = handler }); return channel; diff --git a/src/modules/mix.grpc/mix.grpc.csproj b/src/modules/mix.grpc/mix.grpc.csproj index 422ada4ec..b65575859 100644 --- a/src/modules/mix.grpc/mix.grpc.csproj +++ b/src/modules/mix.grpc/mix.grpc.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/modules/mix.log/Controllers/MixAuditLogController.cs b/src/modules/mix.log/Controllers/MixAuditLogController.cs index a7017c9e9..854b33ea0 100644 --- a/src/modules/mix.log/Controllers/MixAuditLogController.cs +++ b/src/modules/mix.log/Controllers/MixAuditLogController.cs @@ -2,10 +2,9 @@ using Mix.Auth.Constants; using Mix.Constant.Constants; using Mix.Database.Entities.AuditLog; -using Mix.Database.Entities.Queue; +using Mix.Database.Services; using Mix.Heart.Enums; using Mix.Heart.Exceptions; -using Mix.Heart.Models; using Mix.Heart.Services; using Mix.Heart.UnitOfWork; using Mix.Lib.Attributes; @@ -28,6 +27,7 @@ namespace Mix.Log.Controllers public class AuditLogController : MixQueryApiControllerBase { + private readonly DatabaseService _databaseService; public AuditLogController( IHttpContextAccessor httpContextAccessor, IConfiguration configuration, @@ -37,11 +37,12 @@ public AuditLogController( UnitOfWorkInfo uow, IMemoryQueueService queueService, IPortalHubClientService portalHub, - IMixTenantService mixTenantService) + IMixTenantService mixTenantService, + DatabaseService databaseService) : base(httpContextAccessor, configuration, cacheService, translator, mixIdentityService, uow, queueService, portalHub, mixTenantService) { - + _databaseService = databaseService; } #region Routes @@ -107,7 +108,7 @@ private async Task> SearchByDate(SearchQueryM }; } - using (var context = new AuditLogDbContext(searchDate)) + using (var context = _databaseService.GetAuditLogDbContext()) { using (var AuditLogUow = new UnitOfWorkInfo(context)) { diff --git a/src/modules/mix.log/Controllers/MixQueueLogController.cs b/src/modules/mix.log/Controllers/MixQueueLogController.cs index a9a2c5ff0..96c84da50 100644 --- a/src/modules/mix.log/Controllers/MixQueueLogController.cs +++ b/src/modules/mix.log/Controllers/MixQueueLogController.cs @@ -1,11 +1,10 @@ using Microsoft.AspNetCore.Mvc; -using Microsoft.VisualBasic; using Mix.Auth.Constants; using Mix.Constant.Constants; -using Mix.Database.Entities.Queue; +using Mix.Database.Entities.QueueLog; +using Mix.Database.Services; using Mix.Heart.Enums; using Mix.Heart.Exceptions; -using Mix.Heart.Models; using Mix.Heart.Services; using Mix.Heart.UnitOfWork; using Mix.Lib.Attributes; @@ -17,7 +16,6 @@ using Mix.Log.Lib.ViewModels; using Mix.Mq.Lib.Models; using Mix.Queue.Interfaces; -using Mix.Service.Services; using Mix.Shared.Dtos; using Mix.SignalR.Interfaces; @@ -26,18 +24,20 @@ namespace Mix.Log.Controllers [Route("api/v2/rest/mix-log/queue-log")] [ApiController] [MixAuthorize(MixRoles.Owner)] - public class MixQueueLogController : MixQueryApiControllerBase + public class MixQueueLogController : MixQueryApiControllerBase { + private readonly DatabaseService _databaseService; public MixQueueLogController( IHttpContextAccessor httpContextAccessor, IConfiguration configuration, MixCacheService cacheService, TranslatorService translator, MixIdentityService mixIdentityService, - UnitOfWorkInfo uow, + UnitOfWorkInfo uow, IMemoryQueueService queueService, IPortalHubClientService portalHub, - IMixTenantService mixTenantService) + IMixTenantService mixTenantService, + DatabaseService databaseService) : base( httpContextAccessor, configuration, @@ -49,6 +49,7 @@ public MixQueueLogController( portalHub, mixTenantService) { + _databaseService = databaseService; } #region Routes @@ -99,7 +100,7 @@ public async Task Search([FromQuery] SearchRequestDto req, Cancell #region Overrides - private async Task> SearchByDate(SearchQueryModel searchRequest, DateTime searchDate, CancellationToken cancellationToken) + private async Task> SearchByDate(SearchQueryModel searchRequest, DateTime searchDate, CancellationToken cancellationToken) { try { @@ -114,7 +115,7 @@ private async Task> SearchByDate(Se }; } - using (var context = new MixQueueDbContext(searchDate)) + using (var context = _databaseService.GetQueueLogDbContext()) { using (var MixQueueMessageLogUow = new UnitOfWorkInfo(context)) { diff --git a/src/modules/mix.log/Startup.cs b/src/modules/mix.log/Startup.cs index e317e947c..12cfbd8d4 100644 --- a/src/modules/mix.log/Startup.cs +++ b/src/modules/mix.log/Startup.cs @@ -19,7 +19,6 @@ public void ConfigureServices(IServiceCollection services) { services.AddMixServices(Assembly.GetExecutingAssembly(), Configuration); services.AddMixCors(); - services.AddMixLog(Configuration); services.AddMixAuthorize(Configuration); } @@ -28,9 +27,10 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseMixCors(); app.UseMixTenant(); - app.UseMiddleware(); app.UseRouting(); app.UseMixAuth(); + // auditlog middleware must go after auth + app.UseMiddleware(); app.UseMixCors(); app.UseRouting(); app.UseMixApps(Assembly.GetExecutingAssembly(), Configuration, env.ContentRootPath, env.IsDevelopment()); diff --git a/src/modules/mix.messenger/mix.messenger.csproj b/src/modules/mix.messenger/mix.messenger.csproj index fa124a00c..d28226fc6 100644 --- a/src/modules/mix.messenger/mix.messenger.csproj +++ b/src/modules/mix.messenger/mix.messenger.csproj @@ -5,13 +5,6 @@ Mix.Messenger - - - - - - - diff --git a/src/modules/mix.portal/Controllers/MixDatabaseContextController.cs b/src/modules/mix.portal/Controllers/MixDatabaseContextController.cs index 3efe6a8da..09249462c 100644 --- a/src/modules/mix.portal/Controllers/MixDatabaseContextController.cs +++ b/src/modules/mix.portal/Controllers/MixDatabaseContextController.cs @@ -4,6 +4,7 @@ using Mix.Lib.Interfaces; using Mix.Mq.Lib.Models; using Mix.RepoDb.Interfaces; +using Mix.Shared.Services; using Mix.SignalR.Interfaces; namespace Mix.Portal.Controllers @@ -27,6 +28,11 @@ public MixDatabaseContextController(IHttpContextAccessor httpContextAccessor, IC #region Overrides protected override async Task CreateHandlerAsync(MixDatabaseContextViewModel data, CancellationToken cancellationToken = default) { + if (data != null && !string.IsNullOrEmpty(data.DecryptedConnectionString)) + { + data.ConnectionString = AesEncryptionHelper.EncryptString(data.DecryptedConnectionString, GlobalConfigService.Instance.AesKey); + } + var result = await base.CreateHandlerAsync(data, cancellationToken); if (result > 0) { diff --git a/src/modules/mix.portal/Controllers/MixDatabaseController.cs b/src/modules/mix.portal/Controllers/MixDatabaseController.cs index 708c87ea7..875c59dd0 100644 --- a/src/modules/mix.portal/Controllers/MixDatabaseController.cs +++ b/src/modules/mix.portal/Controllers/MixDatabaseController.cs @@ -1,6 +1,8 @@ using Microsoft.AspNetCore.Mvc; using Mix.Auth.Constants; +using Mix.Database.Services; using Mix.Lib.Interfaces; +using Mix.Mixdb.Services; using Mix.Mq.Lib.Models; using Mix.RepoDb.Interfaces; using Mix.RepoDb.ViewModels; @@ -15,6 +17,7 @@ namespace Mix.Portal.Controllers public class MixDatabaseController : MixRestfulApiControllerBase { + private readonly DatabaseService _databaseService; private readonly IMixDbService _mixDbService; private readonly IMixMemoryCacheService _memoryCache; public MixDatabaseController( @@ -28,12 +31,14 @@ public MixDatabaseController( IMixDbService mixDbService, IPortalHubClientService portalHub, IMixTenantService mixTenantService, - IMixMemoryCacheService memoryCache) + IMixMemoryCacheService memoryCache, + DatabaseService databaseService) : base(httpContextAccessor, configuration, cacheService, translator, mixIdentityService, cmsUow, queueService, portalHub, mixTenantService) { _mixDbService = mixDbService; _memoryCache = memoryCache; + _databaseService = databaseService; } #region Routes @@ -62,6 +67,24 @@ public async Task> Duplicate(int id, Cancella throw new MixException(MixErrorStatus.NotFound, id); } + //[MixAuthorize(MixRoles.Owner)] + [HttpGet("export-entity/{dbContextName}")] + public async Task ExportEntity(string dbContextName) + { + MixDatabaseContextViewModel dbContext = await MixDatabaseContextViewModel + .GetRepository(Uow, CacheService).GetSingleAsync(m => m.SystemName == dbContextName); + if (dbContext == null) + { + return BadRequest(dbContextName); + } + var runtimeDbContextService = new RuntimeDbContextService(HttpContextAccessor, _databaseService); + string cnn = dbContext != null + ? dbContext.DecryptedConnectionString + : _databaseService.GetConnectionString(MixConstants.CONST_MIXDB_CONNECTION); + var sourceFiles = runtimeDbContextService.CreateDynamicDbContext(cnn); + return Ok(sourceFiles); + } + [MixAuthorize(MixRoles.Owner)] [HttpGet("migrate/{name}")] public async Task Migrate(string name) @@ -141,7 +164,7 @@ protected override Task DeleteHandler(MixDatabaseViewModel data, CancellationTok { //if (data.Type == MixDatabaseType.System) //{ - // throw new MixException($"Cannot Delete System Database: {data.SystemName}"); + // throw new MixException($"Cannot DELETE System Database: {data.SystemName}"); //} return base.DeleteHandler(data, cancellationToken); } diff --git a/src/modules/mix.portal/Controllers/MixDbController.cs b/src/modules/mix.portal/Controllers/MixDbController.cs index 933a166bc..ea38c5d14 100644 --- a/src/modules/mix.portal/Controllers/MixDbController.cs +++ b/src/modules/mix.portal/Controllers/MixDbController.cs @@ -1,10 +1,6 @@ -using Amazon.SQS.Model.Internal.MarshallTransformations; -using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing; -using DocumentFormat.OpenXml.Spreadsheet; -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Azure; using Mix.Database.Services; using Mix.Heart.Helpers; using Mix.Heart.Model; @@ -14,7 +10,6 @@ using Mix.RepoDb.Helpers; using Mix.RepoDb.Interfaces; using Mix.RepoDb.Repositories; -using Mix.RepoDb.Services; using Mix.RepoDb.ViewModels; using Mix.Service.Commands; using Mix.Service.Interfaces; @@ -23,11 +18,11 @@ using Mix.SignalR.Enums; using Mix.SignalR.Interfaces; using Mix.SignalR.Models; -using MySqlX.XDevAPI.Common; -using Org.BouncyCastle.Ocsp; +using NuGet.Packaging; using RepoDb; using RepoDb.Enumerations; using RepoDb.Interfaces; +using System.Collections.Generic; namespace Mix.Portal.Controllers { @@ -72,7 +67,7 @@ public MixDbController( cacheService, translator, mixIdentityService, queueService, mixTenantService) { _repository = repository; - _associationRepository = new(cache, databaseService, cmsUow); + _associationRepository = new(cache, databaseService); _associationRepository.InitTableName(AssociationTableName); _cmsUow = cmsUow; _memoryCache = memoryCache; @@ -91,7 +86,7 @@ public override async Task OnActionExecutionAsync(ActionExecutingContext context _fieldNameService = new FieldNameService(_mixDb.NamingConvention); if (_mixDb.MixDatabaseContextId.HasValue) { - _repository.Init(_tableName, _mixDb.MixDatabaseContext.DatabaseProvider, _mixDb.MixDatabaseContext.ConnectionString); + _repository.Init(_tableName, _mixDb.MixDatabaseContext.DatabaseProvider, _mixDb.MixDatabaseContext.DecryptedConnectionString); } else { @@ -111,10 +106,10 @@ public async Task>> MyData([FromQuery] } [HttpGet("my-data/{id}")] - public async Task> GetMyDataById(int id, [FromQuery] bool loadNestedData) + public async Task> GetMyDataById(string id, [FromQuery] bool loadNestedData) { string username = _idService.GetClaim(User, MixClaims.Username); - JObject result = await _mixDbDataService.GetMyDataById(_tableName, username, id, loadNestedData); + JObject result = await _mixDbDataService.GetMyDataById(_tableName, username, GetId(id), loadNestedData); return Ok(result); } @@ -152,8 +147,15 @@ public async Task>> Filter([FromBody] [HttpPost("nested-data/filter")] public async Task>> NestedFilter([FromBody] SearchMixDbRequestDto req) { - var result = await SearchManyToManyDataHandler(req); - return Ok(result); + if (req.Relationship == MixDatabaseRelationshipType.ManyToMany) + { + var result = await SearchManyToManyDataHandler(req); + return Ok(result); + } + else + { + return Ok(await SearchHandler(req)); + } } [HttpPost("export")] @@ -167,13 +169,14 @@ public async Task> Export([FromBody] SearchMixDbRequestD } [HttpPost("import")] - public async Task Import([FromForm] IFormFile file) + public async Task Import(IFormFile file) { var data = MixCmsHelper.LoadExcelFileData(file); List lstDto = new(); + var username = _idService.GetClaim(User, MixClaims.Username); foreach (var item in data) { - lstDto.Add(await MixDbHelper.ParseImportDtoToEntityAsync(item, _mixDb.Columns, _fieldNameService, CurrentTenant.Id, _idService.GetClaim(User, MixClaims.Username))); + lstDto.Add(await MixDbHelper.ParseDtoToEntityAsync(item, _mixDb.Type, _mixDb.Columns, _fieldNameService, username: username)); } var result = await _repository.InsertManyAsync(lstDto, _mixDb); @@ -182,22 +185,18 @@ public async Task Import([FromForm] IFormFile file) [HttpGet("{id}")] - public async Task> GetSingle(int id, [FromQuery] bool loadNestedData) + public async Task> GetSingle(string id, [FromQuery] bool loadNestedData) { - var result = await _mixDbDataService.GetById(_tableName, id, loadNestedData); - string username = _idService.GetClaim(User, MixClaims.Username); - QueueService.PushMemoryQueue(CurrentTenant.Id, - MixQueueTopics.MixBackgroundTasks, - MixQueueActions.MixDbEvent - , new MixDbEventCommand(username, MixDbCommandQueueActions.Read, _tableName, result)); + object objId = GetId(id); + var result = await _mixDbDataService.GetById(_tableName, objId, loadNestedData); return result != default ? Ok(result) : NotFound(id); } - [HttpPut("update-priority/{dbName}/{id}")] - public async Task> UpdatePriority(string dbName, int id, [FromBody] UpdatePriorityDto dto) + public async Task> UpdatePriority(string dbName, string id, [FromBody] UpdatePriorityDto dto) { - var data = await _mixDbDataService.GetById(dbName, id, false); + object objId = GetId(id); + var data = await _mixDbDataService.GetById(dbName, objId, false); if (data == null) { return NotFound(); @@ -224,7 +223,7 @@ public async Task> UpdatePriority(string dbName, int id, [ foreach (var item in query.OrderBy(m => m[_fieldNameService.Priority])) { item.Priority = start; - await _repository.UpdateAsync(id, item, _mixDb); + await _repository.UpdateAsync(objId, item, _mixDb); start++; } @@ -347,7 +346,7 @@ public ActionResult CreateHub(object dto) Body = JObject.FromObject(dto), MixDbName = _tableName }; - QueueService.PushMemoryQueue(CurrentTenant.Id, MixQueueTopics.MixDbCommand, MixDbCommandQueueActions.Create, obj); + QueueService.PushMemoryQueue(CurrentTenant.Id, MixQueueTopics.MixDbCommand, MixDbCommandQueueAction.POST.ToString(), obj); return Ok(); } @@ -356,7 +355,7 @@ public ActionResult CreateHub(object dto) public async Task> Create(JObject dto) { string username = _idService.GetClaim(User, MixClaims.Username); - JObject obj = await MixDbHelper.ParseDtoToEntityAsync(dto, _mixDb.Columns, _fieldNameService, CurrentTenant.Id, username); + JObject obj = await MixDbHelper.ParseDtoToEntityAsync(dto, _mixDb.Type, _mixDb.Columns, _fieldNameService, CurrentTenant.Id, username); var id = await _repository.InsertAsync(obj, _mixDb); var resp = await _repository.GetSingleAsync(new QueryField(_fieldNameService.Id, id)); @@ -366,48 +365,62 @@ public async Task> Create(JObject dto) } var result = resp != null ? ReflectionHelper.ParseObject(resp) : obj; - QueueService.PushMemoryQueue(CurrentTenant.Id, MixQueueTopics.MixBackgroundTasks, MixQueueActions.MixDbEvent, - new MixDbEventCommand(username, MixDbCommandQueueActions.Create, _tableName, result)); + await NotifyResult(MixDbCommandQueueAction.POST, new MixDbAuditLogModel() + { + Id = id, + MixDbName = _tableName, + After = result, + Body = obj + }); return Ok(result); } - - [PreventDuplicateFormSubmission] [HttpPut("{id}")] - public async Task> Update(int id, [FromBody] JObject dto) + public async Task> UpdateFields(string id, [FromBody] JObject dto) { - JObject obj = await MixDbHelper.ParseDtoToEntityAsync(dto, _mixDb.Columns, _fieldNameService, CurrentTenant.Id, _idService.GetClaim(User, MixClaims.Username)); + JObject obj = await MixDbHelper.ParseDtoToEntityAsync(dto, _mixDb.Type, _mixDb.Columns, _fieldNameService, CurrentTenant.Id, _idService.GetClaim(User, MixClaims.Username)); - var data = await _repository.UpdateAsync(id, obj, _mixDb); + var data = await _repository.UpdateAsync(GetId(id), obj, _mixDb); if (data != null) { - var result = await _repository.GetSingleAsync(new QueryField(_fieldNameService.Id, id)); + var result = await _repository.GetSingleAsync(new QueryField(_fieldNameService.Id, GetId(id))); var resp = result != null ? ReflectionHelper.ParseObject(result) : obj; - await NotifyResult(id, resp); + await NotifyResult(MixDbCommandQueueAction.PUT, new MixDbAuditLogModel() + { + Id = GetId(id), + MixDbName = _tableName, + Before = result, + After = resp, + Body = obj + }); return Ok(ReflectionHelper.ParseObject(resp)); } return BadRequest(); } - private async Task NotifyResult(int id, JObject obj) + private async Task NotifyResult(MixDbCommandQueueAction action, MixDbAuditLogModel log) { try { string username = _idService.GetClaim(User, MixClaims.Username); - QueueService.PushMemoryQueue(CurrentTenant.Id, MixQueueTopics.MixBackgroundTasks, MixQueueActions.MixDbEvent, - new MixDbEventCommand(username, MixDbCommandQueueActions.Update, _tableName, obj)); - var modifiedEnties = new List() + QueueService.PushMemoryQueue( + CurrentTenant.Id, + MixQueueTopics.MixBackgroundTasks, + MixQueueActions.MixDbEvent, + new MixDbEventCommand(username, action.ToString(), _tableName, log)); + + var modifiedEntities = new List() { - new ModifiedEntityModel() + new() { - Id = id, + Id = log.Id, CacheFolder = $"{MixFolders.MixDbCacheFolder}/{_tableName}", Action = ViewModelAction.Update } }; var modifiedData = new JObject() { - new JProperty("modifiedEntiies", JArray.FromObject(modifiedEnties)) + new JProperty("modifiedEntities", JArray.FromObject(modifiedEntities)) }; await PortalHub.SendMessageAsync(new SignalRMessageModel() { @@ -455,17 +468,23 @@ public async Task PatchMany([FromBody] IEnumerable lstOb } [HttpDelete("{id}")] - public async Task> Delete(int id) - { - var data = await _repository.DeleteAsync(id, _fieldNameService); - var childAssociationsQueries = GetAssociationQueries(parentDatabaseName: _tableName, parentId: id); - var parentAssociationsQueries = GetAssociationQueries(childDatabaseName: _tableName, childId: id); - _repository.InitTableName(AssociationTableName); + public async Task> Delete(string id) + { + var objId = GetId(id); + var result = await _mixDbDataService.GetById(_tableName, objId, false); + var data = await _repository.DeleteAsync(objId, _fieldNameService); + var childAssociationsQueries = GetAssociationQueries(parentDatabaseName: _tableName, parentId: objId); + var parentAssociationsQueries = GetAssociationQueries(childDatabaseName: _tableName, childId: objId); + _repository.InitTableName(GetRelationshipDbName()); await _repository.DeleteAsync(childAssociationsQueries); await _repository.DeleteAsync(parentAssociationsQueries); string username = _idService.GetClaim(User, MixClaims.Username); - QueueService.PushMemoryQueue(CurrentTenant.Id, MixQueueTopics.MixBackgroundTasks, MixQueueActions.MixDbEvent, - new MixDbEventCommand(username, MixDbCommandQueueActions.Delete, _tableName, new(new JProperty("data", id)))); + await NotifyResult(MixDbCommandQueueAction.DELETE, new MixDbAuditLogModel() + { + Id = id, + MixDbName = _tableName, + Before = result + }); return data > 0 ? Ok() : NotFound(); } @@ -499,7 +518,7 @@ private async Task CreateDataRelationship(string parentName, string parentId, st _repository.InitTableName(relDbName); var relDb = await GetMixDatabase(relDbName); var fieldNameService = new FieldNameService(relDb.NamingConvention); - var obj = await MixDbHelper.ParseDtoToEntityAsync(JObject.FromObject(rel), relDb.Columns, fieldNameService, CurrentTenant.Id, username); + var obj = await MixDbHelper.ParseDtoToEntityAsync(JObject.FromObject(rel), relDb.Type, relDb.Columns, fieldNameService, CurrentTenant.Id, username); await _repository.InsertAsync(obj, relDb); } @@ -537,17 +556,22 @@ private async Task PatchHandler(JObject objDto, CancellationToken cancellationTo try { var id = objDto.Value("id"); - var data = await _repository.GetSingleAsync(new QueryField(_fieldNameService.Id, id)); - if (data == null) + var obj = await _mixDbDataService.GetById(_tableName, id, false); + if (obj == null) { throw new MixException(MixErrorStatus.NotFound); } - + var log = new MixDbAuditLogModel() + { + Id = id, + MixDbName = _tableName, + Before = obj.DeepClone() as JObject, + Body = objDto + }; string username = _idService.GetClaim(User, MixClaims.Username); // Not use Reflection to keep title case - JObject obj = JObject.FromObject(data); foreach (var prop in objDto.Properties()) { @@ -557,10 +581,11 @@ private async Task PatchHandler(JObject objDto, CancellationToken cancellationTo obj[propName] = prop.Value; } } - - await _repository.UpdateAsync(id, objDto, _mixDb); - QueueService.PushMemoryQueue(CurrentTenant.Id, MixQueueTopics.MixBackgroundTasks, MixQueueActions.MixDbEvent, - new MixDbEventCommand(username, MixDbCommandQueueActions.Patch, _tableName, objDto)); + var parsedObj = await MixDbHelper.ParseDtoToEntityAsync(obj, _mixDb.Type, _mixDb.Columns, _fieldNameService, CurrentTenant.Id, username); + await _repository.UpdateAsync(id, parsedObj, _mixDb); + + log.After = obj; + await NotifyResult(MixDbCommandQueueAction.PATCH, log); } catch (Exception ex) { @@ -573,6 +598,7 @@ private async Task> SearchHandler(SearchMixDbReques try { IEnumerable queries = await BuildSearchQueryAsync(request); + var paging = new PagingRequestModel() { PageIndex = request.PageIndex, @@ -581,7 +607,15 @@ private async Task> SearchHandler(SearchMixDbReques SortDirection = request.Direction }; - return await GetResult(queries, paging, request.LoadNestedData); + var result = await GetResult(queries, paging, request.Queries.Any(m => m.CompareOperator == MixCompareOperator.ILike), request.Conjunction, request.LoadNestedData); + if (request.LoadNestedData) + { + foreach (var item in result.Items) + { + item.Add(await _mixDbDataService.LoadNestedData(_mixDb, _fieldNameService, item.Value(_fieldNameService.Id))); + } + } + return result; } catch (Exception ex) { @@ -593,7 +627,7 @@ private async Task> SearchManyToManyDataHandler(Sea { try { - if (!request.ParentId.HasValue && !request.GuidParentId.HasValue) + if (request.ObjParentId == null) { throw new MixException(MixErrorStatus.Badrequest, "Bad Request"); } @@ -604,16 +638,17 @@ private async Task> SearchManyToManyDataHandler(Sea new QueryField(_fieldNameService.ParentDatabaseName, request.ParentName), new QueryField(_fieldNameService.ChildDatabaseName, _tableName) }; - - if (request.ParentId.HasValue) + var parentDb = await GetMixDatabase(request.ParentName); + var childDb = await GetMixDatabase(_tableName); + if (parentDb.Type == MixDatabaseType.GuidService) { - relQuery.Add(new(_fieldNameService.ParentId, request.ParentId.Value)); + relQuery.Add(new(_fieldNameService.GuidParentId, request.ObjParentId)); } - - if (request.GuidParentId.HasValue) + else { - relQuery.Add(new(_fieldNameService.GuidParentId, request.GuidParentId.Value)); + relQuery.Add(new(_fieldNameService.ParentId, request.ObjParentId)); } + var allowsRels = await _mixDbDataService.ParseListDataAsync(relDbName, await _repository.GetListByAsync(relQuery)); _repository.InitTableName(_tableName); @@ -629,9 +664,11 @@ private async Task> SearchManyToManyDataHandler(Sea } queries.Add( new( - _fieldNameService.Id, - Operation.In, - allowsRels.Select(m => m.Value(_fieldNameService.ChildId)).ToList() + _fieldNameService.Id, + Operation.In, + childDb.Type == MixDatabaseType.GuidService + ? allowsRels.Select(m => m.Value(_fieldNameService.GuidChildId)).ToList() + : allowsRels.Select(m => m.Value(_fieldNameService.ChildId)).ToList() )); var paging = new PagingRequestModel() @@ -641,12 +678,14 @@ private async Task> SearchManyToManyDataHandler(Sea SortBy = request.OrderBy, SortDirection = request.Direction }; - var nestedData = await GetResult(queries, paging, request.LoadNestedData); + var nestedData = await GetResult(queries, paging, request.Queries.Any(m => m.CompareOperator == MixCompareOperator.ILike), request.Conjunction, request.LoadNestedData); var items = new List(); - + foreach (var item in nestedData.Items) { - var relId = allowsRels.FirstOrDefault(m => m.Value(_fieldNameService.ChildId) == item.Value(_fieldNameService.Id)); + var relId = childDb.Type == MixDatabaseType.GuidService + ? allowsRels.FirstOrDefault(m => m.Value(_fieldNameService.GuidChildId) == item.Value(_fieldNameService.Id)) + : allowsRels.FirstOrDefault(m => m.Value(_fieldNameService.ChildId) == item.Value(_fieldNameService.Id)); if (relId != null) items.Add( new JObject( @@ -654,7 +693,7 @@ private async Task> SearchManyToManyDataHandler(Sea new JProperty("data", item) )); } - + return new PagingResponseModel() { Items = items, @@ -668,9 +707,11 @@ private async Task> SearchManyToManyDataHandler(Sea } - private async Task> GetResult(IEnumerable queries, PagingRequestModel paging, bool loadNestedData) + private async Task> GetResult(IEnumerable queries, PagingRequestModel paging, bool iLike, MixConjunction conjunction, bool loadNestedData) { - var result = await _repository.GetPagingAsync(queries, paging); + var fieldNames = _mixDb.Columns.Select(m => m.SystemName).ToList(); + fieldNames.AddRange(new List { _fieldNameService.Id, _fieldNameService.CreatedBy, _fieldNameService.CreatedDateTime, _fieldNameService.LastModified, _fieldNameService.Priority }); + var result = await _repository.GetPagingAsync(queries, paging, iLike, conjunction, Field.From(fieldNames.ToArray())); var items = new List(); @@ -681,12 +722,12 @@ private async Task> GetResult(IEnumerable("id"); + var id = data.Value(_fieldNameService.Id); List nestedQueries = GetAssociationQueries(rel.SourceDatabaseName, rel.DestinateDatabaseName, id); var orderFields = new List { - new(_fieldNameService.Priority, Order.Ascending) + new(paging.SortBy, paging.SortDirection == SortDirection.Asc? Order.Ascending: Order.Descending) }; var associations = await _associationRepository.GetListByAsync(nestedQueries, orderFields: orderFields); @@ -721,88 +762,32 @@ private async Task> GetResult(IEnumerable { Items = items, PagingData = result.PagingData }; } - private async Task> BuildSearchQueryAsync(SearchMixDbRequestDto request) + private Task> BuildSearchQueryAsync(SearchMixDbRequestDto request) { var queries = BuildSearchPredicate(request).ToList(); - if (request.ParentId.HasValue) + if (request.ObjParentId != null) { - await FilterByIntegerId(queries, request); + queries.Add(new QueryField(_fieldNameService.GetParentId(request.ParentName), request.ObjParentId)); } - else if (request.GuidParentId.HasValue) - { - await FilterByGuidId(queries, request); - } - if (request.Queries != null) { foreach (var query in request.Queries) { - Operation op = ParseOperator(query.CompareOperator); - queries.Add(new(query.FieldName, op, ParseSearchKeyword(query.CompareOperator, query.Value))); - } - } - return queries; - } - - private async Task FilterByIntegerId(List queries, SearchMixDbRequestDto request) - { - if (request.RelationShip == MixDatabaseRelationshipType.OneToMany) - { - queries.Add(new(_fieldNameService.GetParentId(request.ParentName), request.ParentId)); - } - else if (_mixDb.Type == MixDatabaseType.AdditionalData) - { - queries.Add(new(_fieldNameService.ParentId, request.ParentId)); - } - else - { - _repository.InitTableName(GetRelationshipDbName()); - - var relQuery = new List() { - new QueryField(_fieldNameService.ParentDatabaseName, request.ParentName), - new QueryField(_fieldNameService.ChildDatabaseName, _tableName) - }; - - if (request.ParentId.HasValue) - { - relQuery.Add(new(_fieldNameService.ParentId, request.ParentId.Value)); - } - var allowsIds = JArray.FromObject(await _repository.GetListByAsync(relQuery)) - .Select(m => m.Value(_fieldNameService.ChildId)).ToList(); - queries.Add(new(_fieldNameService.Id, Operation.In, allowsIds)); - _repository.InitTableName(_tableName); - } - } - - private async Task FilterByGuidId(List queries, SearchMixDbRequestDto request) - { - if (_mixDb.Type == MixDatabaseType.GuidAdditionalData) - { - queries.Add(new(_fieldNameService.ParentId, request.GuidParentId)); - } - else - { - _repository.InitTableName(GetRelationshipDbName()); - var relQuery = new List() { - new QueryField(_fieldNameService.ParentDatabaseName, request.ParentName), - new QueryField(_fieldNameService.ChildDatabaseName, _tableName) - }; - if (request.GuidParentId.HasValue) - { - relQuery.Add(new(_fieldNameService.ParentId, request.GuidParentId.Value)); - } - - var allowsIds = await _repository.GetListByAsync(relQuery); - if (request.ParentName == "Role" || request.ParentName == "User") - { - queries.Add(new(_fieldNameService.Id, Operation.In, allowsIds.Select(m => m.ChildId))); - } - else - { - queries.Add(new(_fieldNameService.Id, Operation.In, allowsIds.Select(m => m.GuildChildId))); + var col = _mixDb.Columns.FirstOrDefault(m => m.SystemName == query.FieldName); + if (col != null || _fieldNameService.GetAllFieldName().Contains(query.FieldName)) + { + Operation op = ParseOperator(query.CompareOperator); + queries.Add(new(query.FieldName, op, + ParseSearchKeyword( + query.CompareOperator, + query.Value is string + ? MixDbHelper.ParseObjectValue(col?.DataType, query.Value?.ToString()) + : query.Value + ))); + } } - _repository.InitTableName(_tableName); } + return Task.FromResult(queries); } private Operation ParseOperator(MixCompareOperator compareOperator) @@ -812,6 +797,7 @@ private Operation ParseOperator(MixCompareOperator compareOperator) case MixCompareOperator.Equal: return Operation.Equal; case MixCompareOperator.Like: + case MixCompareOperator.ILike: return Operation.Like; case MixCompareOperator.NotEqual: return Operation.NotEqual; @@ -838,7 +824,7 @@ private Operation ParseOperator(MixCompareOperator compareOperator) private IEnumerable BuildSearchPredicate(SearchMixDbRequestDto req) { - req.OrderBy = ReflectionHelper.GetPropertyValue(_fieldNameService, req.OrderBy).ToString(); + req.OrderBy ??= _fieldNameService.Priority; var operation = ParseSearchOperation(req.SearchMethod); var queries = new List() { @@ -868,6 +854,7 @@ private object ParseSearchKeyword(MixCompareOperator? searchMethod, object keywo return searchMethod switch { MixCompareOperator.Like => $"%{keyword}%", + MixCompareOperator.ILike => $"%{keyword}%", MixCompareOperator.InRange => keyword.ToString().Split(',', StringSplitOptions.TrimEntries), MixCompareOperator.NotInRange => keyword.ToString().Split(',', StringSplitOptions.TrimEntries), _ => keyword @@ -895,24 +882,38 @@ private Operation ParseSearchOperation(MixCompareOperator? searchMethod) #region Private - private List GetAssociationQueries(string parentDatabaseName = null, string childDatabaseName = null, int? parentId = null, int? childId = null) + private List GetAssociationQueries(string parentDatabaseName = null, string childDatabaseName = null, object? parentId = null, object? childId = null) { var queries = new List(); if (!string.IsNullOrEmpty(parentDatabaseName)) { - queries.Add(new QueryField("ParentDatabaseName", parentDatabaseName)); + queries.Add(new QueryField(_fieldNameService.ParentDatabaseName, parentDatabaseName)); } if (!string.IsNullOrEmpty(childDatabaseName)) { - queries.Add(new QueryField("ChildDatabaseName", childDatabaseName)); + queries.Add(new QueryField(_fieldNameService.ChildDatabaseName, childDatabaseName)); } - if (parentId.HasValue) + if (parentId != null) { - queries.Add(new QueryField(_fieldNameService.ParentId, parentId)); + if (parentId.GetType() == typeof(Guid)) + { + queries.Add(new QueryField(_fieldNameService.GuidParentId, parentId)); + } + else + { + queries.Add(new QueryField(_fieldNameService.ParentId, parentId)); + } } - if (childId.HasValue) + if (childId != null) { - queries.Add(new QueryField(_fieldNameService.ChildId, childId)); + if (childId.GetType() == typeof(Guid)) + { + queries.Add(new QueryField(_fieldNameService.GuidChildId, childId)); + } + else + { + queries.Add(new QueryField(_fieldNameService.ChildId, childId)); + } } return queries; } @@ -930,7 +931,24 @@ private async Task GetMixDatabase(string tableName = } ); } - + private object GetId(string id) + { + try + { + if (_mixDb.Type == MixDatabaseType.GuidService) + { + return Guid.Parse(id); + } + else + { + return int.Parse(id); + } + } + catch (Exception ex) + { + throw new MixException(MixErrorStatus.Badrequest, ex); + } + } #endregion } } \ No newline at end of file diff --git a/src/modules/mix.portal/Controllers/MixThemeController.cs b/src/modules/mix.portal/Controllers/MixThemeController.cs index eb99a7db3..268ae6cc1 100644 --- a/src/modules/mix.portal/Controllers/MixThemeController.cs +++ b/src/modules/mix.portal/Controllers/MixThemeController.cs @@ -1,11 +1,11 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; -using Mix.Auth.Constants; using Mix.Heart.Constants; using Mix.Lib.Interfaces; using Mix.Mq.Lib.Models; using Mix.Portal.Domain.Interfaces; using Mix.Shared.Helpers; +using Mix.Shared.Models.Configurations; using Mix.Shared.Services; using Mix.SignalR.Constants; using Mix.SignalR.Hubs; @@ -73,7 +73,7 @@ public async Task> ExportThemeAsync([FromBody] E } [HttpPost("load-theme")] - public async Task> LoadThemeAsync([FromForm] IFormFile theme) + public async Task> LoadThemeAsync(IFormFile theme) { _importService.ExtractTheme(theme); var siteData = await _importService.LoadSchema(); @@ -110,7 +110,7 @@ public async Task> InstallTheme([FromBody] JObject theme) }; await _importService.DownloadThemeAsync(theme, progress, _httpService); - GlobalConfigService.Instance.AppSettings.InitStatus = InitStep.SelectTheme; + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.InitStatus), InitStep.SelectTheme); GlobalConfigService.Instance.SaveSettings(); return Ok(); } diff --git a/src/modules/mix.portal/Domain/ViewModels/MixPostContentViewModel.cs b/src/modules/mix.portal/Domain/ViewModels/MixPostContentViewModel.cs index 4f28b11e5..7abcca010 100644 --- a/src/modules/mix.portal/Domain/ViewModels/MixPostContentViewModel.cs +++ b/src/modules/mix.portal/Domain/ViewModels/MixPostContentViewModel.cs @@ -159,7 +159,7 @@ public async Task LoadAdditionalDataAsync( if (isChanged) { - await cacheService.SetAsync($"{Id}/{GetType().FullName}", this, typeof(MixPostContent).FullName, "full"); + await cacheService.SetAsync($"{Id}/{GetType().Name}", this, $"{typeof(MixPostContent).Assembly.GetName().Name}_{typeof(MixPostContent).Name}", "full"); } } diff --git a/src/modules/mix.portal/Program.cs b/src/modules/mix.portal/Program.cs index 73350b7cd..b73fc162d 100644 --- a/src/modules/mix.portal/Program.cs +++ b/src/modules/mix.portal/Program.cs @@ -4,6 +4,10 @@ using Mix.Log.Lib; using Microsoft.Azure.Amqp.Framing; using Mix.Lib.Middlewares; +using Mix.Log.Lib.Publishers; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Mix.Log.Lib.Interfaces; +using Mix.Log.Lib.Services; var builder = MixCmsHelper.CreateWebApplicationBuilder(args); if (builder.Environment.IsDevelopment()) @@ -18,7 +22,8 @@ builder.Services.AddMixServices(Assembly.GetExecutingAssembly(), builder.Configuration); builder.Services.AddMixCors(); -builder.Services.AddMixLog(builder.Configuration); +builder.AddMixLogPublisher(); + // Must app Auth config after Add mixservice to init App config builder.Services.AddMixAuthorize(builder.Configuration); @@ -26,9 +31,10 @@ app.UseMixCors(); app.UseMixTenant(); -app.UseMiddleware(); app.UseRouting(); app.UseMixAuth(); +// auditlog middleware must go after auth +app.UseMiddleware(); app.UseMixCors(); app.UseRouting(); app.UseMixApps(Assembly.GetExecutingAssembly(), builder.Configuration, builder.Environment.ContentRootPath, builder.Environment.IsDevelopment()); diff --git a/src/modules/mix.portal/Startup.cs b/src/modules/mix.portal/Startup.cs index 2d3a0239c..381e67cd8 100644 --- a/src/modules/mix.portal/Startup.cs +++ b/src/modules/mix.portal/Startup.cs @@ -20,9 +20,9 @@ public void ConfigureServices(IServiceCollection services) services.AddMixServices(Assembly.GetExecutingAssembly(), Configuration); services.AddMixCors(); - services.AddMixLog(Configuration); // Must app Auth config after Add mixservice to init App config services.AddMixAuthorize(Configuration); + services.AddScoped(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -30,9 +30,10 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseMixCors(); app.UseMixTenant(); - app.UseMiddleware(); app.UseRouting(); app.UseMixAuth(); + // auditlog middleware must go after auth + app.UseMiddleware(); app.UseMixCors(); app.UseRouting(); app.UseMixApps(Assembly.GetExecutingAssembly(), Configuration, env.ContentRootPath, env.IsDevelopment()); diff --git a/src/modules/mix.portal/mix.portal.csproj b/src/modules/mix.portal/mix.portal.csproj index b6f19bce2..31645d5cb 100644 --- a/src/modules/mix.portal/mix.portal.csproj +++ b/src/modules/mix.portal/mix.portal.csproj @@ -51,7 +51,7 @@ - + @@ -63,7 +63,7 @@ - + diff --git a/src/modules/mix.scheduler/Domain/Jobs/SendMessageQueueJob.cs b/src/modules/mix.scheduler/Domain/Jobs/SendMessageQueueJob.cs index d81a91bc6..c560055ec 100644 --- a/src/modules/mix.scheduler/Domain/Jobs/SendMessageQueueJob.cs +++ b/src/modules/mix.scheduler/Domain/Jobs/SendMessageQueueJob.cs @@ -26,7 +26,7 @@ public override Task ExecuteHandler(IJobExecutionContext context) Success = true, TopicId = objData.Value("topic"), Action = objData.Value("action"), - Data = objData.Value("data").ToString() + Data = objData.Value("data").ToString(Newtonsoft.Json.Formatting.None) }; QueueService.PushMemoryQueue(msg); diff --git a/src/modules/mix.storage/Controllers/FileSystemController.cs b/src/modules/mix.storage/Controllers/FileSystemController.cs index cefc3f4fb..151922840 100644 --- a/src/modules/mix.storage/Controllers/FileSystemController.cs +++ b/src/modules/mix.storage/Controllers/FileSystemController.cs @@ -78,7 +78,7 @@ public ActionResult Delete() /// [Route("upload-file")] [HttpPost] - public IActionResult Upload([FromForm] string folder, [FromForm] IFormFile file) + public IActionResult Upload([FromForm] string folder, IFormFile file) { if (ModelState.IsValid) { @@ -109,7 +109,7 @@ public IActionResult Upload([FromForm] string folder, [FromForm] IFormFile file) /// [Route("extract-file")] [HttpPost] - public IActionResult Extract([FromForm] string folder, [FromForm] IFormFile file) + public IActionResult Extract([FromForm] string folder, IFormFile file) { if (file.FileName.EndsWith(MixFileExtensions.Zip)) { diff --git a/src/modules/mix.storage/Controllers/StorageController.cs b/src/modules/mix.storage/Controllers/StorageController.cs index 2c1b5358e..974025f93 100644 --- a/src/modules/mix.storage/Controllers/StorageController.cs +++ b/src/modules/mix.storage/Controllers/StorageController.cs @@ -33,7 +33,7 @@ public async Task Upload([FromQuery] string imageUrl) [Route("upload-file")] [HttpPost] - public async Task Upload([FromForm] string? folder, [FromForm] IFormFile file) + public async Task Upload([FromForm] string? folder, IFormFile file) { if (ModelState.IsValid) { diff --git a/src/modules/mix.tenancy/Controllers/InitController.cs b/src/modules/mix.tenancy/Controllers/InitController.cs index 673860b36..ae1d4c545 100644 --- a/src/modules/mix.tenancy/Controllers/InitController.cs +++ b/src/modules/mix.tenancy/Controllers/InitController.cs @@ -16,6 +16,7 @@ using Mix.Auth.Models; using Mix.Auth.Constants; using Mix.Mq.Lib.Models; +using Mix.Shared.Models.Configurations; namespace Mix.Tenancy.Controllers { @@ -144,7 +145,7 @@ public async Task> InstallTheme([FromBody] JObject theme) }; await _importService.DownloadThemeAsync(theme, progress, _httpService); - GlobalConfigService.Instance.AppSettings.InitStatus = InitStep.SelectTheme; + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.InitStatus), InitStep.SelectTheme); GlobalConfigService.Instance.SaveSettings(); return Ok(); } @@ -160,10 +161,10 @@ public async Task> InstallTheme([FromBody] JObject theme) [HttpPost] [Route("extract-theme")] [DisableRequestSizeLimit] - public ActionResult ExtractThemeAsync([FromForm] IFormFile theme = null) + public ActionResult ExtractThemeAsync(IFormFile theme = null) { _importService.ExtractTheme(theme); - GlobalConfigService.Instance.AppSettings.InitStatus = InitStep.SelectTheme; + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.InitStatus), InitStep.SelectTheme); GlobalConfigService.Instance.SaveSettings(); return Ok(); } @@ -178,6 +179,7 @@ public ActionResult ExtractThemeAsync([FromForm] IFormFile theme = null) public async Task> LoadThemeAsync() { var data = await _importService.LoadSchema(); + data.Specificulture = GlobalConfigService.Instance.AppSettings.DefaultCulture; return Ok(data); } @@ -211,8 +213,8 @@ await _configService.Set( await _configService.Reload(_uow); - GlobalConfigService.Instance.AppSettings.InitStatus = InitStep.InitTheme; - GlobalConfigService.Instance.AppSettings.IsInit = false; + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.InitStatus), InitStep.InitTheme); + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.IsInit), false); GlobalConfigService.Instance.SaveSettings(); return Ok(result); } diff --git a/src/modules/mix.tenancy/Domain/Services/InitCmsService.cs b/src/modules/mix.tenancy/Domain/Services/InitCmsService.cs index db81336c9..df74033d5 100644 --- a/src/modules/mix.tenancy/Domain/Services/InitCmsService.cs +++ b/src/modules/mix.tenancy/Domain/Services/InitCmsService.cs @@ -7,6 +7,7 @@ using Mix.Lib.Interfaces; using Mix.Lib.Services; using Mix.Shared.Helpers; +using Mix.Shared.Models.Configurations; using Mix.Tenancy.Domain.Dtos; using Mix.Tenancy.Domain.Interfaces; using Mix.Tenancy.Domain.ViewModels.Init; @@ -54,7 +55,7 @@ public async Task InitTenantAsync(InitCmsDto model) InitTenantViewModel vm = new(_context, model); await vm.SaveAsync(); await _mixTenantService.Reload(); - GlobalConfigService.Instance.AppSettings.InitStatus = InitStep.InitTenant; + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.InitStatus), InitStep.InitTenant); GlobalConfigService.Instance.SaveSettings(); } @@ -94,15 +95,14 @@ await _roleManager.CreateAsync(new MixRole() await _userManager.AddToRoleAsync(user, MixRoleEnums.SuperAdmin.ToString()); await _userManager.AddToRoleAsync(user, MixRoleEnums.Owner.ToString()); await _userManager.AddToTenant(user, 1); - var rsaKeys = RSAEncryptionHelper.GenerateKeys(); var aesKey = GlobalConfigService.Instance.AppSettings.ApiEncryptKey; await _cmsUow.CompleteAsync(); var token = await _identityService.GenerateAccessTokenAsync( - user, true, aesKey, rsaKeys[MixConstants.CONST_RSA_PUBLIC_KEY]); + user, true); if (token != null) { - GlobalConfigService.Instance.AppSettings.ApiEncryptKey = aesKey; - GlobalConfigService.Instance.AppSettings.InitStatus = InitStep.InitAccount; + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.ApiEncryptKey), aesKey); + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.InitStatus), InitStep.InitAccount); GlobalConfigService.Instance.SaveSettings(); } return token; diff --git a/src/modules/mix.tenancy/Domain/StartupService.cs b/src/modules/mix.tenancy/Domain/StartupService.cs index e8e7ee73e..3666053ad 100644 --- a/src/modules/mix.tenancy/Domain/StartupService.cs +++ b/src/modules/mix.tenancy/Domain/StartupService.cs @@ -1,6 +1,7 @@ using Mix.Lib.Interfaces; using Mix.Lib.Services; using Mix.Shared.Interfaces; +using Mix.Shared.Models.Configurations; using Mix.Tenancy.Domain.Interfaces; using Mix.Tenancy.Domain.Services; @@ -22,15 +23,6 @@ public void AddServices(IServiceCollection services, IConfiguration configuratio services.AddScoped(); services.AddScoped(); - - if (GlobalConfigService.Instance.InitStatus == InitStep.Blank) - { - if (string.IsNullOrEmpty(GlobalConfigService.Instance.AppSettings.ApiEncryptKey)) - { - GlobalConfigService.Instance.AppSettings.ApiEncryptKey = AesEncryptionHelper.GenerateCombinedKeys(); - GlobalConfigService.Instance.SaveSettings(); - } - } } public void UseApps(IApplicationBuilder app, IConfiguration configuration, bool isDevelop) diff --git a/src/platform/core/mix-heart b/src/platform/core/mix-heart index b1f765bb0..19180f37e 160000 --- a/src/platform/core/mix-heart +++ b/src/platform/core/mix-heart @@ -1 +1 @@ -Subproject commit b1f765bb0df68ae20ecdf0066a3d7203fbe171a8 +Subproject commit 19180f37ed5a635528fbe1de150cdf3c1bf5015e diff --git a/src/platform/core/mix.mixdb.event/Services/MixDbEventService.cs b/src/platform/core/mix.mixdb.event/Services/MixDbEventService.cs index c0a44dbab..35d0c5d07 100644 --- a/src/platform/core/mix.mixdb.event/Services/MixDbEventService.cs +++ b/src/platform/core/mix.mixdb.event/Services/MixDbEventService.cs @@ -75,7 +75,7 @@ public void LoadEvents(IServiceScope? serviceScope = null) } catch (Exception ex) { - + MixLogService.LogExceptionAsync(ex); } } } @@ -85,7 +85,11 @@ public async Task HandleMessage(MixDbEventCommand model) using (var serviceScope = ServicesProvider.CreateScope()) { var _cacheService = serviceScope.ServiceProvider.GetRequiredService(); - await _cacheService.RemoveCacheAsync(model.Data.Value("Id"), $"{MixFolders.MixDbCacheFolder}/{model.MixDbName}"); + if (model.Data != null) + { + var id = model.Data.Id; + await _cacheService.RemoveCacheAsync(id, $"{MixFolders.MixDbCacheFolder}/{model.MixDbName}"); + } if (model.MixDbName == MixDatabaseNames.SYSTEM_PERMISSION || model.MixDbName == MixDatabaseNames.SYSTEM_PERMISSION_ENDPOINT) { await _mixPermissionService.Reload(); @@ -103,10 +107,10 @@ public async Task HandleMessage(MixDbEventCommand model) { foreach (var sub in subs) { - if (sub.Callback != null) + if (sub.Callback != null && model.Data != null) { var requestModel = sub.Callback.ToObject(); - requestModel!.Body = ParseBody(requestModel.Body, model.Data); + requestModel!.Body = ParseBody(requestModel.Body, model.Data.After); var result = await _httpService.SendHttpRequestModel(requestModel); await SendMessage(model, requestModel!.Body, result); } diff --git a/src/platform/mix.auth/Models/OAuthResponses/OAuthTokenResponse.cs b/src/platform/mix.auth/Models/OAuthResponses/OAuthTokenResponse.cs new file mode 100644 index 000000000..b818e8e67 --- /dev/null +++ b/src/platform/mix.auth/Models/OAuthResponses/OAuthTokenResponse.cs @@ -0,0 +1,38 @@ +using Mix.Auth.Common; +using Mix.Auth.Enums; + +namespace Mix.Auth.Models.OAuthResponses +{ + public class OAuthTokenResponse + { + /// + /// Oauth 2 + /// + public string access_token { get; set; } + + /// + /// OpenId Connect + /// + public string? id_token { get; set; } + public DateTime? expired_at { get; set; } + + /// + /// By default is Bearer + /// + + public string? token_type { get; set; } = TokenTypeEnum.Bearer.GetEnumDescription(); + + /// + /// Authorization Code. This is always returned when using the Hybrid Flow. + /// + public string code { get; set; } + + /// + /// For Error Details if any + /// + public string? Error { get; set; } = string.Empty; + public string ErrorUri { get; set; } + public string? ErrorDescription { get; set; } + public bool HasError => !string.IsNullOrEmpty(Error); + } +} diff --git a/src/platform/mix.auth/Models/RegisterExternalBindingModel.cs b/src/platform/mix.auth/Models/RegisterExternalBindingModel.cs index 1d0988f14..01f989983 100644 --- a/src/platform/mix.auth/Models/RegisterExternalBindingModel.cs +++ b/src/platform/mix.auth/Models/RegisterExternalBindingModel.cs @@ -1,4 +1,5 @@ using Mix.Auth.Enums; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -12,6 +13,7 @@ public class RegisterExternalBindingModel public string UserName { get; set; } public string Email { get; set; } public string PhoneNumber { get; set; } + public JObject? Data { get; set; } public MixExternalLoginProviders Provider { get; set; } public string ExternalAccessToken { get; set; } diff --git a/src/platform/mix.communicator/Models/EmailMessageModel.cs b/src/platform/mix.communicator/Models/EmailMessageModel.cs index f48dc434f..a03f58fef 100644 --- a/src/platform/mix.communicator/Models/EmailMessageModel.cs +++ b/src/platform/mix.communicator/Models/EmailMessageModel.cs @@ -7,5 +7,6 @@ public sealed class EmailMessageModel public string To { get; set; } public string? CC { get; set; } public string? From { get; set; } + public string? FromName { get; set; } } } diff --git a/src/platform/mix.communicator/ServiceCollectionExtensions.cs b/src/platform/mix.communicator/ServiceCollectionExtensions.cs index e4153ed92..6cd55d6e6 100644 --- a/src/platform/mix.communicator/ServiceCollectionExtensions.cs +++ b/src/platform/mix.communicator/ServiceCollectionExtensions.cs @@ -8,6 +8,7 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddMixCommunicators(this IServiceCollection services) { services.TryAddSingleton(); + services.TryAddSingleton(); services.TryAddScoped(); return services; } diff --git a/src/platform/mix.communicator/Services/EmailService.cs b/src/platform/mix.communicator/Services/EmailService.cs index 53f9e0bdd..c87bc0a8d 100644 --- a/src/platform/mix.communicator/Services/EmailService.cs +++ b/src/platform/mix.communicator/Services/EmailService.cs @@ -27,7 +27,7 @@ public async Task SendMail(EmailMessageModel msg) { IsBodyHtml = true, - From = new MailAddress(msg.From ?? Settings.From, Settings.FromName) + From = new MailAddress(msg.From ?? Settings.From, msg.FromName ?? Settings.FromName) }; foreach (var receipient in msg.To.Split(',')) { diff --git a/src/platform/mix.communicator/Services/FirebaseService.cs b/src/platform/mix.communicator/Services/FirebaseService.cs index a9ebb37a9..957ea0714 100644 --- a/src/platform/mix.communicator/Services/FirebaseService.cs +++ b/src/platform/mix.communicator/Services/FirebaseService.cs @@ -36,30 +36,61 @@ public async Task VerifyTokenAsync(string idToken) return decodedToken; } - public async Task SendToDevice( + public async Task SendNotificationToDevice( string registrationToken, - Notification notification, - Dictionary messages) + Notification? notification = default) { - // This registration token comes from the client FCM SDKs. - //var registrationToken = "YOUR_REGISTRATION_TOKEN"; + try + { + + // This registration token comes from the client FCM SDKs. + var message = new Message() + { + Notification = notification, + Token = registrationToken, + }; - // See documentation on defining a message payload. - var message = new Message() + // Send a message to the device corresponding to the provided + // registration token. + string response = await FirebaseMessaging.DefaultInstance.SendAsync(message); + + // Response is a message ID string. + Console.WriteLine("Successfully sent message: " + response); + + return response; + } + catch (Exception) { - Data = messages, - Notification = notification, - Token = registrationToken, - }; + throw; + } + } + + public async Task SendWebPushToDevice( + List registrationTokens, WebpushConfig config) + { + try + { + + // This registration token comes from the client FCM SDKs. + var message = new MulticastMessage() + { + Tokens = registrationTokens, + Webpush = config + }; - // Send a message to the device corresponding to the provided - // registration token. - string response = await FirebaseMessaging.DefaultInstance.SendAsync(message); + // Send a message to the device corresponding to the provided + // registration token. + var responses = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message); - // Response is a message ID string. - Console.WriteLine("Successfully sent message: " + response); + // Response is a message ID string. + Console.WriteLine("Successfully sent message: " + responses); - return response; + return string.Join(",", responses.Responses.Select(r => r.MessageId)); + } + catch (Exception) + { + throw; + } } public async Task SendToMultipleDevices( @@ -67,7 +98,7 @@ public async Task SendToMultipleDevices( Notification notification, Dictionary data) { - // Create a list containing up to 500 registration tokens. + // POST a list containing up to 500 registration tokens. // These registration tokens come from the client FCM SDKs. try { @@ -79,7 +110,7 @@ public async Task SendToMultipleDevices( }; var responses = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message); // See the BatchResponse reference documentation - // for the contents of response. + // for the contents of responses. return string.Join(",", responses.Responses.Select(r => r.MessageId)); } catch (Exception ex) @@ -172,7 +203,7 @@ public async Task SendWithCondition(string condition) public async Task SendBatchMessages(string registrationToken) { - // Create a list containing up to 500 messages. + // POST a list containing up to 500 messages. var messages = new List() { new Message() @@ -197,7 +228,7 @@ public async Task SendBatchMessages(string registrationToken) var response = await FirebaseMessaging.DefaultInstance.SendAllAsync(messages); // See the BatchResponse reference documentation - // for the contents of response. + // for the contents of responses. Console.WriteLine($"{response.SuccessCount} messages were sent successfully"); } } diff --git a/src/platform/mix.communicator/Services/FirestoreService.cs b/src/platform/mix.communicator/Services/FirestoreService.cs new file mode 100644 index 000000000..4c6ee9b17 --- /dev/null +++ b/src/platform/mix.communicator/Services/FirestoreService.cs @@ -0,0 +1,56 @@ +using Google.Apis.Auth.OAuth2; +using Google.Cloud.Firestore; +using Microsoft.Extensions.Configuration; +using Mix.Communicator.Models; + +namespace Mix.Communicator.Services +{ + // Ref: https://firebase.google.com/docs/cloud-messaging/send-message + public class FirestoreService + { + private readonly FirestoreDb _db; + private readonly FirebaseSettingModel _settings = new FirebaseSettingModel(); + public FirestoreService(IConfiguration configuration) + { + configuration.GetSection(MixAppSettingsSection.GoogleFirebase).Bind(_settings); + if (!string.IsNullOrEmpty(_settings.ProjectId) && !string.IsNullOrEmpty(_settings.Filename)) + { + + var googleCredential = _settings.Filename; + + var credential = GoogleCredential.FromFile(googleCredential); + var builder = new FirestoreDbBuilder + { + ProjectId = _settings.ProjectId, + Credential = credential, + }; + _db = builder.Build(); + } + } + + public async Task GetDocumentAsync(string collectionPath, string documentId) + { + return _db.Collection(collectionPath).Document(documentId); + } + + public async Task AddDocumentAsync(string collectionPath, Dictionary data) + { + DocumentReference docRef = _db.Collection(collectionPath).Document(); + return await docRef.SetAsync(data); + } + + public async Task UpdateDocumentAsync(string collectionPath, string documentId, Dictionary data) + { + DocumentReference docRef = _db.Collection(collectionPath).Document(documentId); + return await docRef.UpdateAsync(data); + } + + public async Task DeleteDocumentAsync(string collectionPath, string documentId) + { + DocumentReference docRef = _db.Collection(collectionPath).Document(documentId); + await docRef.DeleteAsync(); + } + + + } +} diff --git a/src/platform/mix.communicator/mix.communicator.csproj b/src/platform/mix.communicator/mix.communicator.csproj index 8e34a4e2c..64168073b 100644 --- a/src/platform/mix.communicator/mix.communicator.csproj +++ b/src/platform/mix.communicator/mix.communicator.csproj @@ -13,8 +13,9 @@ - - + + + diff --git a/src/platform/mix.constant/Constants/MixConstants.cs b/src/platform/mix.constant/Constants/MixConstants.cs index e40928ed7..7b6fff560 100644 --- a/src/platform/mix.constant/Constants/MixConstants.cs +++ b/src/platform/mix.constant/Constants/MixConstants.cs @@ -3,6 +3,7 @@ public class MixConstants { public const string CONST_AUDIT_LOG_CONNECTION = "MixAuditLogConnection"; + public const string CONST_QUEUE_LOG_CONNECTION = "MixQueueLogConnection"; public const string CONST_CMS_CONNECTION = "MixCmsConnection"; public const string CONST_QUARTZ_CONNECTION = "MixQuartzConnection"; public const string CONST_ACCOUNT_CONNECTION = "MixAccountConnection"; diff --git a/src/platform/mix.constant/Constants/MixRepoDb.cs b/src/platform/mix.constant/Constants/MixRepoDb.cs index 41b8486f4..00ce9f222 100644 --- a/src/platform/mix.constant/Constants/MixRepoDb.cs +++ b/src/platform/mix.constant/Constants/MixRepoDb.cs @@ -5,6 +5,6 @@ public class MixRepoDbQueueAction public const string Backup = "Backup"; public const string Restore = "Restore"; public const string Migrate = "Migrate"; - public const string Update = "Update"; + public const string Update = "PUT"; } } diff --git a/src/platform/mix.constant/Enums/HttpRequestMethod.cs b/src/platform/mix.constant/Enums/HttpRequestMethod.cs new file mode 100644 index 000000000..6d8ca4237 --- /dev/null +++ b/src/platform/mix.constant/Enums/HttpRequestMethod.cs @@ -0,0 +1,11 @@ +namespace Mix.Constant.Enums +{ + public enum HttpRequestMethod + { + GET, + POST, + PUT, + PATCH, + DELETE + } +} diff --git a/src/platform/mix.constant/Enums/MixCompareOperatorKind.cs b/src/platform/mix.constant/Enums/MixCompareOperatorKind.cs index 95db9f385..e84861948 100644 --- a/src/platform/mix.constant/Enums/MixCompareOperatorKind.cs +++ b/src/platform/mix.constant/Enums/MixCompareOperatorKind.cs @@ -4,6 +4,7 @@ public enum MixCompareOperator { Equal, Like, + ILike, NotEqual, Contain, NotContain, diff --git a/src/platform/mix.constant/Enums/MixConjunction.cs b/src/platform/mix.constant/Enums/MixConjunction.cs new file mode 100644 index 000000000..e1ffc9ad7 --- /dev/null +++ b/src/platform/mix.constant/Enums/MixConjunction.cs @@ -0,0 +1,8 @@ +namespace Mix.Constant.Enums +{ + public enum MixConjunction + { + And, + Or + } +} \ No newline at end of file diff --git a/src/platform/mix.constant/Enums/MixDatabaseType.cs b/src/platform/mix.constant/Enums/MixDatabaseType.cs index fcf331703..29d29419b 100644 --- a/src/platform/mix.constant/Enums/MixDatabaseType.cs +++ b/src/platform/mix.constant/Enums/MixDatabaseType.cs @@ -4,6 +4,7 @@ public enum MixDatabaseType { System, Service, + GuidService, AdditionalData, GuidAdditionalData, Association diff --git a/src/platform/mix.constant/Enums/MixDbCommandQueueAction.cs b/src/platform/mix.constant/Enums/MixDbCommandQueueAction.cs new file mode 100644 index 000000000..894d1b962 --- /dev/null +++ b/src/platform/mix.constant/Enums/MixDbCommandQueueAction.cs @@ -0,0 +1,11 @@ +namespace Mix.Constant.Enums +{ + public enum MixDbCommandQueueAction + { + POST, + PUT, + PATCH, + DELETE, + GET + } +} diff --git a/src/platform/mix.constant/mix.constant.csproj b/src/platform/mix.constant/mix.constant.csproj index 76c1e0ede..1da3696dc 100644 --- a/src/platform/mix.constant/mix.constant.csproj +++ b/src/platform/mix.constant/mix.constant.csproj @@ -7,10 +7,6 @@ Mix.Constant - - - - diff --git a/src/platform/mix.database/Base/BaseDbContext.cs b/src/platform/mix.database/Base/BaseDbContext.cs index 4d44f474e..8f6248d91 100644 --- a/src/platform/mix.database/Base/BaseDbContext.cs +++ b/src/platform/mix.database/Base/BaseDbContext.cs @@ -16,10 +16,11 @@ public BaseDbContext() { } - public BaseDbContext(DatabaseService databaseService, string connectionStringName) + public BaseDbContext(DatabaseService databaseService, string connectionStringName, MixDatabaseProvider? databaseProvider = null) { _databaseService = databaseService; _connectionStringName = connectionStringName; + _databaseProvider = databaseProvider ?? _databaseService.DatabaseProvider; _dbContextType = GetType(); } public BaseDbContext(string connectionString, MixDatabaseProvider databaseProvider) diff --git a/src/platform/mix.database/Entities/Account/EntityConfigurations/PermissionConfiguration.cs b/src/platform/mix.database/Entities/Account/EntityConfigurations/PermissionConfiguration.cs new file mode 100644 index 000000000..ea3a91239 --- /dev/null +++ b/src/platform/mix.database/Entities/Account/EntityConfigurations/PermissionConfiguration.cs @@ -0,0 +1,19 @@ +using Mix.Database.EntityConfigurations.Base; +using Mix.Database.Services; + +namespace Mix.Database.Entities.Account.EntityConfigurations +{ + public class PermissionConfiguration : EntityBaseConfiguration + + { + public PermissionConfiguration(DatabaseService databaseService) : base(databaseService) + { + } + + public override void Configure(EntityTypeBuilder builder) + { + builder.ToTable(MixDatabaseNames.SYSTEM_PERMISSION); + base.Configure(builder); + } + } +} diff --git a/src/platform/mix.database/Entities/Account/EntityConfigurations/SysMixDatabaseAssociationConfiguration.cs b/src/platform/mix.database/Entities/Account/EntityConfigurations/SysMixDatabaseAssociationConfiguration.cs new file mode 100644 index 000000000..fb2816282 --- /dev/null +++ b/src/platform/mix.database/Entities/Account/EntityConfigurations/SysMixDatabaseAssociationConfiguration.cs @@ -0,0 +1,28 @@ +using Mix.Database.EntityConfigurations.Base; +using Mix.Database.Services; + +namespace Mix.Database.Entities.Account.EntityConfigurations +{ + public class SysMixDatabaseAssociationConfiguration : EntityBaseConfiguration + + { + public SysMixDatabaseAssociationConfiguration(DatabaseService databaseService) : base(databaseService) + { + } + + public override void Configure(EntityTypeBuilder builder) + { + builder.ToTable(MixDatabaseNames.SYSTEM_DATA_RELATIONSHIP); + base.Configure(builder); + + builder.Property(e => e.ParentDatabaseName) + .HasColumnType($"{Config.NString}{Config.MediumLength}") + .HasCharSet(Config.CharSet) + .UseCollation(Config.DatabaseCollation); + + builder.Property(e => e.ChildDatabaseName) + .HasColumnType($"{Config.NString}{Config.MediumLength}") + .HasCharSet(Config.CharSet); + } + } +} diff --git a/src/platform/mix.database/Entities/Account/Permission.cs b/src/platform/mix.database/Entities/Account/Permission.cs new file mode 100644 index 000000000..fc886676a --- /dev/null +++ b/src/platform/mix.database/Entities/Account/Permission.cs @@ -0,0 +1,17 @@ +using Mix.Heart.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Database.Entities.Account +{ + public class Permission : EntityBase + { + public int MixTenantId { get; set; } + public string DisplayName { get; set; } + public string Group { get; set; } + public string Key { get; set; } + } +} diff --git a/src/platform/mix.database/Entities/Account/SysMixDatabaseAssociation.cs b/src/platform/mix.database/Entities/Account/SysMixDatabaseAssociation.cs new file mode 100644 index 000000000..a2ae1d9e9 --- /dev/null +++ b/src/platform/mix.database/Entities/Account/SysMixDatabaseAssociation.cs @@ -0,0 +1,15 @@ +using Mix.Heart.Entities; + +namespace Mix.Database.Entities.Account +{ + public class SysMixDatabaseAssociation : EntityBase + { + public int MixTenantId { get; set; } + public string ParentDatabaseName { get; set; } + public string ChildDatabaseName { get; set; } + public Guid? GuidParentId { get; set; } + public Guid? GuidChildId { get; set; } + public int ParentId { get; set; } + public int ChildId { get; set; } + } +} diff --git a/src/platform/mix.database/Entities/Account/_MixCmsAccountContext.cs b/src/platform/mix.database/Entities/Account/_MixCmsAccountContext.cs index 1a0506752..4838ccf57 100644 --- a/src/platform/mix.database/Entities/Account/_MixCmsAccountContext.cs +++ b/src/platform/mix.database/Entities/Account/_MixCmsAccountContext.cs @@ -6,6 +6,7 @@ using Mix.Database.Services; using MySqlConnector; +using System.Security; namespace Mix.Database.Entities.Account { @@ -22,7 +23,8 @@ public partial class MixCmsAccountContext : BaseDbContext public virtual DbSet MixRoles { get; set; } public virtual DbSet OAuthClient { get; set; } public virtual DbSet OAuthToken { get; set; } - + public DbSet Permission { get; set; } + public DbSet SysMixDatabaseAssociation { get; set; } /// /// Initializes a new instance of the class. diff --git a/src/platform/mix.database/Entities/AuditLog/EntityConfigurations/AuditLogConfiguration.cs b/src/platform/mix.database/Entities/AuditLog/EntityConfigurations/AuditLogConfiguration.cs index 2a6d0175b..e025f5bfb 100644 --- a/src/platform/mix.database/Entities/AuditLog/EntityConfigurations/AuditLogConfiguration.cs +++ b/src/platform/mix.database/Entities/AuditLog/EntityConfigurations/AuditLogConfiguration.cs @@ -3,43 +3,20 @@ using Mix.Database.EntityConfigurations; using Mix.Database.Services; using Newtonsoft.Json.Linq; - +using Mix.Database.EntityConfigurations.Base; +using Microsoft.Extensions.DependencyModel.Resolution; namespace Mix.Database.Entities.AuditLog.EntityConfigurations { - internal class AuditLogConfiguration : IEntityTypeConfiguration + internal class AuditLogConfiguration : EntityBaseConfiguration { - public IDatabaseConstants Config; - public AuditLogConfiguration() + public AuditLogConfiguration(DatabaseService databaseService) : base(databaseService) { - Config = new SqliteDatabaseConstants(); } - public void Configure(EntityTypeBuilder builder) + public override void Configure(EntityTypeBuilder builder) { - builder.Property(e => e.IsDeleted) - .HasColumnType(Config.Boolean); - - builder.Property(e => e.CreatedDateTime) - .HasColumnType(Config.DateTime); - - builder.Property(e => e.LastModified) - .HasColumnType(Config.DateTime); - - builder.Property(e => e.CreatedBy) - .HasColumnType($"{Config.String}{Config.MediumLength}"); - - builder.Property(e => e.ModifiedBy) - .HasColumnType($"{Config.String}{Config.MediumLength}"); - - builder.Property(e => e.Priority) - .HasColumnType(Config.Integer); - - builder.Property(e => e.Status) - .IsRequired() - .HasConversion(new EnumToStringConverter()) - .HasColumnType($"{Config.String}{Config.SmallLength}") - .HasCharSet(Config.CharSet); + base.Configure(builder); builder.Property(e => e.Body) .HasConversion( diff --git a/src/platform/mix.database/Entities/AuditLog/_AuditLogDbContext.cs b/src/platform/mix.database/Entities/AuditLog/_AuditLogDbContext.cs index f39c9af98..90c153b69 100644 --- a/src/platform/mix.database/Entities/AuditLog/_AuditLogDbContext.cs +++ b/src/platform/mix.database/Entities/AuditLog/_AuditLogDbContext.cs @@ -1,30 +1,23 @@ using Mix.Database.Entities.AuditLog.EntityConfigurations; +using Mix.Database.Services; using Mix.Heart.Services; namespace Mix.Database.Entities.AuditLog { - public class AuditLogDbContext : DbContext + public class AuditLogDbContext : BaseDbContext { - private string _folder = DateTime.UtcNow.ToString("MM_yyyy"); - private string _cnn; - public AuditLogDbContext() + public AuditLogDbContext(DatabaseService databaseService) : base(databaseService, MixConstants.CONST_AUDIT_LOG_CONNECTION) { - _cnn = $"Data Source={MixFolders.MixAuditLogFolder}/{_folder}/auditlog_{DateTime.Now.ToString("dd_MM_yyyy")}.sqlite"; } - public AuditLogDbContext(DateTime date) - { - _folder = date.ToString("MM_yyyy"); - _cnn = $"Data Source={MixFolders.MixAuditLogFolder}/{_folder}/auditlog_{date.ToString("dd_MM_yyyy")}.sqlite"; - } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + + public AuditLogDbContext(DatabaseService databaseService, string connectionStringName) : base(databaseService, connectionStringName) { - MixFileHelper.CreateFolderIfNotExist($"{MixFolders.MixAuditLogFolder}/{_folder}"); - optionsBuilder.UseSqlite(_cnn); } - protected override void OnModelCreating(ModelBuilder modelBuilder) + + public AuditLogDbContext(string connectionString, MixDatabaseProvider databaseProvider) : base(connectionString, databaseProvider) { - modelBuilder.ApplyConfiguration(new AuditLogConfiguration()); } + public virtual DbSet AuditLog { get; set; } } diff --git a/src/platform/mix.database/Entities/AuditLog/_MySqlAuditLogDbContext.cs b/src/platform/mix.database/Entities/AuditLog/_MySqlAuditLogDbContext.cs new file mode 100644 index 000000000..dd6098493 --- /dev/null +++ b/src/platform/mix.database/Entities/AuditLog/_MySqlAuditLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.AuditLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.AuditLog +{ + public class MySqlAuditLogDbContext : AuditLogDbContext + { + public MySqlAuditLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Entities/AuditLog/_PostgresAuditLogDbContext.cs b/src/platform/mix.database/Entities/AuditLog/_PostgresAuditLogDbContext.cs new file mode 100644 index 000000000..10efcbf70 --- /dev/null +++ b/src/platform/mix.database/Entities/AuditLog/_PostgresAuditLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.AuditLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.AuditLog +{ + public class PostgresAuditLogDbContext : AuditLogDbContext + { + public PostgresAuditLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Entities/AuditLog/_SqlServerAuditLogDbContext.cs b/src/platform/mix.database/Entities/AuditLog/_SqlServerAuditLogDbContext.cs new file mode 100644 index 000000000..5cacad224 --- /dev/null +++ b/src/platform/mix.database/Entities/AuditLog/_SqlServerAuditLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.AuditLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.AuditLog +{ + public class SqlServerAuditLogDbContext : AuditLogDbContext + { + public SqlServerAuditLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Entities/AuditLog/_SqliteAuditLogDbContext.cs b/src/platform/mix.database/Entities/AuditLog/_SqliteAuditLogDbContext.cs new file mode 100644 index 000000000..d2166d0f8 --- /dev/null +++ b/src/platform/mix.database/Entities/AuditLog/_SqliteAuditLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.AuditLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.AuditLog +{ + public class SqlITEAuditLogDbContext : AuditLogDbContext + { + public SqlITEAuditLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Entities/MixDb/MixPermission.cs b/src/platform/mix.database/Entities/MixDb/MixPermission.cs index d120d26c3..a3ab0b7e6 100644 --- a/src/platform/mix.database/Entities/MixDb/MixPermission.cs +++ b/src/platform/mix.database/Entities/MixDb/MixPermission.cs @@ -2,12 +2,11 @@ { public sealed class MixPermission : EntityBase { - public string Title { get; set; } - public string Type { get; set; } - public string Icon { get; set; } public int MixTenantId { get; set; } + public string DisplayName { get; set; } + public string Group { get; set; } + public string Key { get; set; } } - public sealed class Metadata { public string Description { get; set; } diff --git a/src/platform/mix.database/Entities/QueueLog/EntityConfigurations/QueueLogConfiguration.cs b/src/platform/mix.database/Entities/QueueLog/EntityConfigurations/QueueLogConfiguration.cs new file mode 100644 index 000000000..e3640c7b6 --- /dev/null +++ b/src/platform/mix.database/Entities/QueueLog/EntityConfigurations/QueueLogConfiguration.cs @@ -0,0 +1,70 @@ +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Mix.Database.EntityConfigurations.Base; +using Mix.Database.Services; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Database.Entities.QueueLog.EntityConfigurations +{ + internal class QueueLogConfiguration : EntityBaseConfiguration + { + public QueueLogConfiguration(DatabaseService databaseService): base(databaseService) + { + } + + public override void Configure(EntityTypeBuilder builder) + { + base.Configure(builder); + + builder.Property(e => e.TopicId) + .HasColumnType($"{Config.String}{Config.MediumLength}"); + + builder.Property(e => e.SubscriptionId) + .HasColumnType($"{Config.String}{Config.MediumLength}"); + + builder.Property(e => e.DataTypeFullName) + .HasColumnType($"{Config.String}{Config.MediumLength}"); + + builder.Property(e => e.Action) + .HasColumnType($"{Config.String}{Config.MediumLength}"); + + builder.Property(e => e.Note) + .HasColumnType($"{Config.String}{Config.MediumLength}"); + + builder.Property(e => e.State) + .IsRequired() + .HasConversion(new EnumToStringConverter()) + .HasColumnType($"{Config.String}{Config.SmallLength}") + .HasCharSet(Config.CharSet); + + builder.Property(e => e.StringData) + .HasColumnType(Config.Text); + + builder.Property(e => e.ObjectData) + .HasConversion( + v => v.ToString(Newtonsoft.Json.Formatting.None), + v => !string.IsNullOrEmpty(v) ? JObject.Parse(v) : new()) + .IsRequired(false) + .HasColumnType(Config.Text); + + builder.Property(e => e.Exception) + .HasConversion( + v => v.ToString(Newtonsoft.Json.Formatting.None), + v => !string.IsNullOrEmpty(v) ? JObject.Parse(v) : new()) + .IsRequired(false) + .HasColumnType(Config.Text); + + builder.Property(e => e.Subscriptions) + .HasConversion( + v => v.ToString(Newtonsoft.Json.Formatting.None), + v => !string.IsNullOrEmpty(v) ? JArray.Parse(v) : new()) + .IsRequired(false) + .HasColumnType(Config.Text); + } + } +} diff --git a/src/platform/mix.database/Entities/QueueLog/QueueLog.cs b/src/platform/mix.database/Entities/QueueLog/QueueLog.cs new file mode 100644 index 000000000..af21a544e --- /dev/null +++ b/src/platform/mix.database/Entities/QueueLog/QueueLog.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Database.Entities.QueueLog +{ + public sealed class QueueLog : EntityBase + { + public Guid? QueueMessageId { get; set; } + public string TopicId { get; set; } + public string SubscriptionId { get; set; } + public string Action { get; set; } + public string StringData { get; set; } + public JObject ObjectData { get; set; } + public JObject Exception { get; set; } + public JArray Subscriptions { get; set; } + public string DataTypeFullName { get; set; } + public string Note { get; set; } + public MixQueueMessageLogState State { get; set; } + public int TenantId { get; set; } + } +} diff --git a/src/platform/mix.database/Entities/QueueLog/_MySqlQueueLogDbContext.cs b/src/platform/mix.database/Entities/QueueLog/_MySqlQueueLogDbContext.cs new file mode 100644 index 000000000..291fa6d92 --- /dev/null +++ b/src/platform/mix.database/Entities/QueueLog/_MySqlQueueLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.QueueLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.QueueLog +{ + public class MySqlQueueLogDbContext : QueueLogDbContext + { + public MySqlQueueLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Entities/QueueLog/_PostgresQueueLogDbContext.cs b/src/platform/mix.database/Entities/QueueLog/_PostgresQueueLogDbContext.cs new file mode 100644 index 000000000..0b9c240a8 --- /dev/null +++ b/src/platform/mix.database/Entities/QueueLog/_PostgresQueueLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.QueueLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.QueueLog +{ + public class PostgresQueueLogDbContext : QueueLogDbContext + { + public PostgresQueueLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Entities/QueueLog/_QueueLogDbContext.cs b/src/platform/mix.database/Entities/QueueLog/_QueueLogDbContext.cs new file mode 100644 index 000000000..80ecafdae --- /dev/null +++ b/src/platform/mix.database/Entities/QueueLog/_QueueLogDbContext.cs @@ -0,0 +1,25 @@ +using Mix.Database.Entities.QueueLog.EntityConfigurations; +using Mix.Database.Entities.QueueLog; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.QueueLog +{ + public class QueueLogDbContext : BaseDbContext + { + public QueueLogDbContext(DatabaseService databaseService) : base(databaseService, MixConstants.CONST_QUEUE_LOG_CONNECTION) + { + } + + public QueueLogDbContext(DatabaseService databaseService, string connectionStringName) : base(databaseService, connectionStringName) + { + } + + public QueueLogDbContext(string connectionString, MixDatabaseProvider databaseProvider) : base(connectionString, databaseProvider) + { + } + + public virtual DbSet QueueLog { get; set; } + + } +} diff --git a/src/platform/mix.database/Entities/QueueLog/_SqlServerQueueLogDbContext.cs b/src/platform/mix.database/Entities/QueueLog/_SqlServerQueueLogDbContext.cs new file mode 100644 index 000000000..bdfba57cb --- /dev/null +++ b/src/platform/mix.database/Entities/QueueLog/_SqlServerQueueLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.QueueLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.QueueLog +{ + public class SqlServerQueueLogDbContext : QueueLogDbContext + { + public SqlServerQueueLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Entities/QueueLog/_SqliteQueueLogDbContext.cs b/src/platform/mix.database/Entities/QueueLog/_SqliteQueueLogDbContext.cs new file mode 100644 index 000000000..80c9283c5 --- /dev/null +++ b/src/platform/mix.database/Entities/QueueLog/_SqliteQueueLogDbContext.cs @@ -0,0 +1,13 @@ +using Mix.Database.Entities.QueueLog.EntityConfigurations; +using Mix.Database.Services; +using Mix.Heart.Services; + +namespace Mix.Database.Entities.QueueLog +{ + public class SqlITEQueueLogDbContext : QueueLogDbContext + { + public SqlITEQueueLogDbContext(DatabaseService databaseService) : base(databaseService) + { + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/MySql/20240310051036_InitAuditLog.Designer.cs b/src/platform/mix.database/Migrations/AuditLogDb/MySql/20240310051036_InitAuditLog.Designer.cs new file mode 100644 index 000000000..c8c3b4087 --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/MySql/20240310051036_InitAuditLog.Designer.cs @@ -0,0 +1,91 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; + +#nullable disable + +namespace Mix.Database.Migrations.MySqlAuditLogDb +{ + [DbContext(typeof(MySqlAuditLogDbContext))] + [Migration("20240310051036_InitAuditLog")] + partial class InitAuditLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("longtext"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("tinyint(1)"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("longtext"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("longtext"); + + b.Property("RequestIp") + .HasColumnType("longtext"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)"); + + MySqlPropertyBuilderExtensions.HasCharSet(b.Property("Status"), "utf8"); + + b.Property("StatusCode") + .HasColumnType("int"); + + b.Property("Success") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/MySql/20240310051036_InitAuditLog.cs b/src/platform/mix.database/Migrations/AuditLogDb/MySql/20240310051036_InitAuditLog.cs new file mode 100644 index 000000000..035e5a04d --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/MySql/20240310051036_InitAuditLog.cs @@ -0,0 +1,63 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.MySqlAuditLogDb +{ + /// + public partial class InitAuditLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "AuditLog", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, defaultValueSql: "gen_random_uuid()", collation: "ascii_general_ci"), + Success = table.Column(type: "tinyint(1)", nullable: false), + StatusCode = table.Column(type: "int", nullable: false), + RequestIp = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Endpoint = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Method = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + QueryString = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Body = table.Column(type: "text", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Response = table.Column(type: "text", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Exception = table.Column(type: "text", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CreatedDateTime = table.Column(type: "timestamp with time zone(6)", nullable: false), + LastModified = table.Column(type: "timestamp with time zone(6)", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false) + .Annotation("MySql:CharSet", "utf8"), + IsDeleted = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AuditLog", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AuditLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/MySql/MySqlAuditLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/AuditLogDb/MySql/MySqlAuditLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..7662398f7 --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/MySql/MySqlAuditLogDbContextModelSnapshot.cs @@ -0,0 +1,88 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; + +#nullable disable + +namespace Mix.Database.Migrations.MySqlAuditLogDb +{ + [DbContext(typeof(MySqlAuditLogDbContext))] + partial class MySqlAuditLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("longtext"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("tinyint(1)"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("longtext"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("longtext"); + + b.Property("RequestIp") + .HasColumnType("longtext"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)"); + + MySqlPropertyBuilderExtensions.HasCharSet(b.Property("Status"), "utf8"); + + b.Property("StatusCode") + .HasColumnType("int"); + + b.Property("Success") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/20240310045005_InitAuditLog.Designer.cs b/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/20240310045005_InitAuditLog.Designer.cs new file mode 100644 index 000000000..6f0dd6580 --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/20240310045005_InitAuditLog.Designer.cs @@ -0,0 +1,93 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.PostgresAuditLogDb +{ + [DbContext(typeof(PostgresAuditLogDbContext))] + [Migration("20240310045005_InitAuditLog")] + partial class InitAuditLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("text"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("text"); + + b.Property("RequestIp") + .HasColumnType("text"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/20240310045005_InitAuditLog.cs b/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/20240310045005_InitAuditLog.cs new file mode 100644 index 000000000..3c61affbd --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/20240310045005_InitAuditLog.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.PostgresAuditLogDb +{ + /// + public partial class InitAuditLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AuditLog", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + Success = table.Column(type: "boolean", nullable: false), + StatusCode = table.Column(type: "integer", nullable: false), + RequestIp = table.Column(type: "text", nullable: true), + Endpoint = table.Column(type: "text", nullable: true), + Method = table.Column(type: "text", nullable: true), + QueryString = table.Column(type: "text", nullable: true), + Body = table.Column(type: "text", nullable: true), + Response = table.Column(type: "text", nullable: true), + Exception = table.Column(type: "text", nullable: true), + CreatedDateTime = table.Column(type: "timestamp with time zone", nullable: false), + LastModified = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false), + IsDeleted = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AuditLog", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AuditLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/PostgresAuditLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/PostgresAuditLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..1a1537488 --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/Postgresql/PostgresAuditLogDbContextModelSnapshot.cs @@ -0,0 +1,90 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.PostgresAuditLogDb +{ + [DbContext(typeof(PostgresAuditLogDbContext))] + partial class PostgresAuditLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("text"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("text"); + + b.Property("RequestIp") + .HasColumnType("text"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/20240310051318_InitAuditLog.Designer.cs b/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/20240310051318_InitAuditLog.Designer.cs new file mode 100644 index 000000000..91c233bcd --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/20240310051318_InitAuditLog.Designer.cs @@ -0,0 +1,93 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; + +#nullable disable + +namespace Mix.Database.Migrations.SqlServerAuditLogDb +{ + [DbContext(typeof(SqlServerAuditLogDbContext))] + [Migration("20240310051318_InitAuditLog")] + partial class InitAuditLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("nvarchar(max)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestIp") + .HasColumnType("nvarchar(max)"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StatusCode") + .HasColumnType("int"); + + b.Property("Success") + .HasColumnType("bit"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/20240310051318_InitAuditLog.cs b/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/20240310051318_InitAuditLog.cs new file mode 100644 index 000000000..4aa50cde5 --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/20240310051318_InitAuditLog.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.SqlServerAuditLogDb +{ + /// + public partial class InitAuditLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AuditLog", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false, defaultValueSql: "gen_random_uuid()"), + Success = table.Column(type: "bit", nullable: false), + StatusCode = table.Column(type: "int", nullable: false), + RequestIp = table.Column(type: "nvarchar(max)", nullable: true), + Endpoint = table.Column(type: "nvarchar(max)", nullable: true), + Method = table.Column(type: "nvarchar(max)", nullable: true), + QueryString = table.Column(type: "nvarchar(max)", nullable: true), + Body = table.Column(type: "text", nullable: true), + Response = table.Column(type: "text", nullable: true), + Exception = table.Column(type: "text", nullable: true), + CreatedDateTime = table.Column(type: "timestamp with time zone", nullable: false), + LastModified = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AuditLog", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AuditLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/SqlServerAuditLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/SqlServerAuditLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..b7606ca85 --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/SqlServer/SqlServerAuditLogDbContextModelSnapshot.cs @@ -0,0 +1,90 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; + +#nullable disable + +namespace Mix.Database.Migrations.SqlServerAuditLogDb +{ + [DbContext(typeof(SqlServerAuditLogDbContext))] + partial class SqlServerAuditLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("nvarchar(max)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestIp") + .HasColumnType("nvarchar(max)"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StatusCode") + .HasColumnType("int"); + + b.Property("Success") + .HasColumnType("bit"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/20240310050457_InitAuditLog.Designer.cs b/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/20240310050457_InitAuditLog.Designer.cs new file mode 100644 index 000000000..ca4472250 --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/20240310050457_InitAuditLog.Designer.cs @@ -0,0 +1,88 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; + +#nullable disable + +namespace Mix.Database.Migrations.SqlITEAuditLogDb +{ + [DbContext(typeof(SqlITEAuditLogDbContext))] + [Migration("20240310050457_InitAuditLog")] + partial class InitAuditLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.2"); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("TEXT"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("INTEGER"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("TEXT"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("TEXT"); + + b.Property("RequestIp") + .HasColumnType("TEXT"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StatusCode") + .HasColumnType("INTEGER"); + + b.Property("Success") + .HasColumnType("INTEGER"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/20240310050457_InitAuditLog.cs b/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/20240310050457_InitAuditLog.cs new file mode 100644 index 000000000..2137c8d1c --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/20240310050457_InitAuditLog.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.SqlITEAuditLogDb +{ + /// + public partial class InitAuditLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AuditLog", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false, defaultValueSql: "gen_random_uuid()"), + Success = table.Column(type: "INTEGER", nullable: false), + StatusCode = table.Column(type: "INTEGER", nullable: false), + RequestIp = table.Column(type: "TEXT", nullable: true), + Endpoint = table.Column(type: "TEXT", nullable: true), + Method = table.Column(type: "TEXT", nullable: true), + QueryString = table.Column(type: "TEXT", nullable: true), + Body = table.Column(type: "text", nullable: true), + Response = table.Column(type: "text", nullable: true), + Exception = table.Column(type: "text", nullable: true), + CreatedDateTime = table.Column(type: "timestamp with time zone", nullable: false), + LastModified = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false), + IsDeleted = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AuditLog", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AuditLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/SqlITEAuditLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/SqlITEAuditLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..790f2e1bb --- /dev/null +++ b/src/platform/mix.database/Migrations/AuditLogDb/Sqlite/SqlITEAuditLogDbContextModelSnapshot.cs @@ -0,0 +1,85 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.AuditLog; + +#nullable disable + +namespace Mix.Database.Migrations.SqlITEAuditLogDb +{ + [DbContext(typeof(SqlITEAuditLogDbContext))] + partial class SqlITEAuditLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.2"); + + modelBuilder.Entity("Mix.Database.Entities.AuditLog.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Body") + .HasColumnType("text"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Endpoint") + .HasColumnType("TEXT"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("INTEGER"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("Method") + .HasColumnType("TEXT"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueryString") + .HasColumnType("TEXT"); + + b.Property("RequestIp") + .HasColumnType("TEXT"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StatusCode") + .HasColumnType("INTEGER"); + + b.Property("Success") + .HasColumnType("INTEGER"); + + b.HasKey("Id") + .HasName("PK_AuditLog"); + + b.ToTable("AuditLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/Cms/MySqlMixCms/MySqlMixCmsContextModelSnapshot.cs b/src/platform/mix.database/Migrations/Cms/MySqlMixCms/MySqlMixCmsContextModelSnapshot.cs index b5513c111..db11c1d83 100644 --- a/src/platform/mix.database/Migrations/Cms/MySqlMixCms/MySqlMixCmsContextModelSnapshot.cs +++ b/src/platform/mix.database/Migrations/Cms/MySqlMixCms/MySqlMixCmsContextModelSnapshot.cs @@ -17,7 +17,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.1") + .HasAnnotation("ProductVersion", "7.0.9") .HasAnnotation("Relational:MaxIdentifierLength", 64); modelBuilder.Entity("Mix.Database.Entities.Cms.MixApplication", b => @@ -714,12 +714,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("ModifiedBy") .HasColumnType("varchar(250)"); - b.Property("NamingConvention") - .IsRequired() - .HasColumnType("varchar(50)"); - - MySqlPropertyBuilderExtensions.HasCharSet(b.Property("NamingConvention"), "utf8"); - b.Property("Priority") .HasColumnType("int"); diff --git a/src/platform/mix.database/Migrations/Cms/SqlServerMixCms/SqlServerMixCmsContextModelSnapshot.cs b/src/platform/mix.database/Migrations/Cms/SqlServerMixCms/SqlServerMixCmsContextModelSnapshot.cs index dbd4df35c..577495c49 100644 --- a/src/platform/mix.database/Migrations/Cms/SqlServerMixCms/SqlServerMixCmsContextModelSnapshot.cs +++ b/src/platform/mix.database/Migrations/Cms/SqlServerMixCms/SqlServerMixCmsContextModelSnapshot.cs @@ -18,7 +18,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.1") + .HasAnnotation("ProductVersion", "7.0.9") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -679,11 +679,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("ModifiedBy") .HasColumnType("varchar(250)"); - b.Property("NamingConvention") - .IsRequired() - .HasColumnType("nvarchar(50)") - .HasAnnotation("MySql:CharSet", "utf8"); - b.Property("Priority") .HasColumnType("int"); diff --git a/src/platform/mix.database/Migrations/Cms/SqliteMixCms/SqliteMixCmsContextModelSnapshot.cs b/src/platform/mix.database/Migrations/Cms/SqliteMixCms/SqliteMixCmsContextModelSnapshot.cs index 2813da7dc..b83a65f04 100644 --- a/src/platform/mix.database/Migrations/Cms/SqliteMixCms/SqliteMixCmsContextModelSnapshot.cs +++ b/src/platform/mix.database/Migrations/Cms/SqliteMixCms/SqliteMixCmsContextModelSnapshot.cs @@ -16,7 +16,7 @@ partial class SqliteMixCmsContextModelSnapshot : ModelSnapshot protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.1"); + modelBuilder.HasAnnotation("ProductVersion", "7.0.9"); modelBuilder.Entity("Mix.Database.Entities.Cms.MixApplication", b => { @@ -658,11 +658,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("ModifiedBy") .HasColumnType("varchar(250)"); - b.Property("NamingConvention") - .IsRequired() - .HasColumnType("varchar(50)") - .HasAnnotation("MySql:CharSet", "utf8"); - b.Property("Priority") .HasColumnType("integer"); diff --git a/src/platform/mix.database/Migrations/QueueLog/MySql/20240310062243_InitQueueLog.Designer.cs b/src/platform/mix.database/Migrations/QueueLog/MySql/20240310062243_InitQueueLog.Designer.cs new file mode 100644 index 000000000..5b72c890c --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/MySql/20240310062243_InitQueueLog.Designer.cs @@ -0,0 +1,104 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.MySqlQueueLogDb +{ + [DbContext(typeof(MySqlQueueLogDbContext))] + [Migration("20240310062243_InitQueueLog")] + partial class InitQueueLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/MySql/20240310062243_InitQueueLog.cs b/src/platform/mix.database/Migrations/QueueLog/MySql/20240310062243_InitQueueLog.cs new file mode 100644 index 000000000..d1de18839 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/MySql/20240310062243_InitQueueLog.cs @@ -0,0 +1,52 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.MySqlQueueLogDb +{ + /// + public partial class InitQueueLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "QueueLog", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + QueueMessageId = table.Column(type: "uuid", nullable: true), + TopicId = table.Column(type: "varchar(250)", nullable: true), + SubscriptionId = table.Column(type: "varchar(250)", nullable: true), + Action = table.Column(type: "varchar(250)", nullable: true), + StringData = table.Column(type: "text", nullable: true), + ObjectData = table.Column(type: "text", nullable: true), + Exception = table.Column(type: "text", nullable: true), + Subscriptions = table.Column(type: "text", nullable: true), + DataTypeFullName = table.Column(type: "varchar(250)", nullable: true), + Note = table.Column(type: "varchar(250)", nullable: true), + State = table.Column(type: "varchar(50)", nullable: false), + TenantId = table.Column(type: "integer", nullable: false), + CreatedDateTime = table.Column(type: "timestamp with time zone", nullable: false), + LastModified = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false), + IsDeleted = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QueueLog", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "QueueLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/MySql/MySqlQueueLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/QueueLog/MySql/MySqlQueueLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..be833808e --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/MySql/MySqlQueueLogDbContextModelSnapshot.cs @@ -0,0 +1,101 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.MySqlQueueLogDb +{ + [DbContext(typeof(MySqlQueueLogDbContext))] + partial class MySqlQueueLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/Postgres/20240310061825_InitQueueLog.Designer.cs b/src/platform/mix.database/Migrations/QueueLog/Postgres/20240310061825_InitQueueLog.Designer.cs new file mode 100644 index 000000000..510696890 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/Postgres/20240310061825_InitQueueLog.Designer.cs @@ -0,0 +1,104 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.PostgresQueueLogDb +{ + [DbContext(typeof(PostgresQueueLogDbContext))] + [Migration("20240310061825_InitQueueLog")] + partial class InitQueueLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/Postgres/20240310061825_InitQueueLog.cs b/src/platform/mix.database/Migrations/QueueLog/Postgres/20240310061825_InitQueueLog.cs new file mode 100644 index 000000000..675bd6b65 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/Postgres/20240310061825_InitQueueLog.cs @@ -0,0 +1,52 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.PostgresQueueLogDb +{ + /// + public partial class InitQueueLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "QueueLog", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + QueueMessageId = table.Column(type: "uuid", nullable: true), + TopicId = table.Column(type: "varchar(250)", nullable: true), + SubscriptionId = table.Column(type: "varchar(250)", nullable: true), + Action = table.Column(type: "varchar(250)", nullable: true), + StringData = table.Column(type: "text", nullable: true), + ObjectData = table.Column(type: "text", nullable: true), + Exception = table.Column(type: "text", nullable: true), + Subscriptions = table.Column(type: "text", nullable: true), + DataTypeFullName = table.Column(type: "varchar(250)", nullable: true), + Note = table.Column(type: "varchar(250)", nullable: true), + State = table.Column(type: "varchar(50)", nullable: false), + TenantId = table.Column(type: "integer", nullable: false), + CreatedDateTime = table.Column(type: "timestamp with time zone", nullable: false), + LastModified = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false), + IsDeleted = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QueueLog", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "QueueLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/Postgres/PostgresQueueLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/QueueLog/Postgres/PostgresQueueLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..f8a7bac8d --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/Postgres/PostgresQueueLogDbContextModelSnapshot.cs @@ -0,0 +1,101 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.PostgresQueueLogDb +{ + [DbContext(typeof(PostgresQueueLogDbContext))] + partial class PostgresQueueLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/SqlServer/20240310062419_InitQueueLog.Designer.cs b/src/platform/mix.database/Migrations/QueueLog/SqlServer/20240310062419_InitQueueLog.Designer.cs new file mode 100644 index 000000000..700cb0070 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/SqlServer/20240310062419_InitQueueLog.Designer.cs @@ -0,0 +1,104 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.SqlServerQueueLogDb +{ + [DbContext(typeof(SqlServerQueueLogDbContext))] + [Migration("20240310062419_InitQueueLog")] + partial class InitQueueLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/SqlServer/20240310062419_InitQueueLog.cs b/src/platform/mix.database/Migrations/QueueLog/SqlServer/20240310062419_InitQueueLog.cs new file mode 100644 index 000000000..f90f9fa82 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/SqlServer/20240310062419_InitQueueLog.cs @@ -0,0 +1,52 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.SqlServerQueueLogDb +{ + /// + public partial class InitQueueLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "QueueLog", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + QueueMessageId = table.Column(type: "uuid", nullable: true), + TopicId = table.Column(type: "varchar(250)", nullable: true), + SubscriptionId = table.Column(type: "varchar(250)", nullable: true), + Action = table.Column(type: "varchar(250)", nullable: true), + StringData = table.Column(type: "text", nullable: true), + ObjectData = table.Column(type: "text", nullable: true), + Exception = table.Column(type: "text", nullable: true), + Subscriptions = table.Column(type: "text", nullable: true), + DataTypeFullName = table.Column(type: "varchar(250)", nullable: true), + Note = table.Column(type: "varchar(250)", nullable: true), + State = table.Column(type: "varchar(50)", nullable: false), + TenantId = table.Column(type: "integer", nullable: false), + CreatedDateTime = table.Column(type: "timestamp with time zone", nullable: false), + LastModified = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false), + IsDeleted = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QueueLog", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "QueueLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/SqlServer/SqlServerQueueLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/QueueLog/SqlServer/SqlServerQueueLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..b43055604 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/SqlServer/SqlServerQueueLogDbContextModelSnapshot.cs @@ -0,0 +1,101 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.SqlServerQueueLogDb +{ + [DbContext(typeof(SqlServerQueueLogDbContext))] + partial class SqlServerQueueLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/Sqlite/20240310062056_InitQueueLog.Designer.cs b/src/platform/mix.database/Migrations/QueueLog/Sqlite/20240310062056_InitQueueLog.Designer.cs new file mode 100644 index 000000000..b9e9901aa --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/Sqlite/20240310062056_InitQueueLog.Designer.cs @@ -0,0 +1,104 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.SqlITEQueueLogDb +{ + [DbContext(typeof(SqlITEQueueLogDbContext))] + [Migration("20240310062056_InitQueueLog")] + partial class InitQueueLog + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/Sqlite/20240310062056_InitQueueLog.cs b/src/platform/mix.database/Migrations/QueueLog/Sqlite/20240310062056_InitQueueLog.cs new file mode 100644 index 000000000..0f2973cb1 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/Sqlite/20240310062056_InitQueueLog.cs @@ -0,0 +1,52 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Mix.Database.Migrations.SqlITEQueueLogDb +{ + /// + public partial class InitQueueLog : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "QueueLog", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + QueueMessageId = table.Column(type: "uuid", nullable: true), + TopicId = table.Column(type: "varchar(250)", nullable: true), + SubscriptionId = table.Column(type: "varchar(250)", nullable: true), + Action = table.Column(type: "varchar(250)", nullable: true), + StringData = table.Column(type: "text", nullable: true), + ObjectData = table.Column(type: "text", nullable: true), + Exception = table.Column(type: "text", nullable: true), + Subscriptions = table.Column(type: "text", nullable: true), + DataTypeFullName = table.Column(type: "varchar(250)", nullable: true), + Note = table.Column(type: "varchar(250)", nullable: true), + State = table.Column(type: "varchar(50)", nullable: false), + TenantId = table.Column(type: "integer", nullable: false), + CreatedDateTime = table.Column(type: "timestamp with time zone", nullable: false), + LastModified = table.Column(type: "timestamp with time zone", nullable: true), + CreatedBy = table.Column(type: "varchar(250)", nullable: true), + ModifiedBy = table.Column(type: "varchar(250)", nullable: true), + Priority = table.Column(type: "int", nullable: false), + Status = table.Column(type: "varchar(50)", nullable: false), + IsDeleted = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_QueueLog", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "QueueLog"); + } + } +} diff --git a/src/platform/mix.database/Migrations/QueueLog/Sqlite/SqlITEQueueLogDbContextModelSnapshot.cs b/src/platform/mix.database/Migrations/QueueLog/Sqlite/SqlITEQueueLogDbContextModelSnapshot.cs new file mode 100644 index 000000000..713fe5586 --- /dev/null +++ b/src/platform/mix.database/Migrations/QueueLog/Sqlite/SqlITEQueueLogDbContextModelSnapshot.cs @@ -0,0 +1,101 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Mix.Database.Entities.QueueLog; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mix.Database.Migrations.SqlITEQueueLogDb +{ + [DbContext(typeof(SqlITEQueueLogDbContext))] + partial class SqlITEQueueLogDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mix.Database.Entities.QueueLog.QueueLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Action") + .HasColumnType("varchar(250)"); + + b.Property("CreatedBy") + .HasColumnType("varchar(250)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("DataTypeFullName") + .HasColumnType("varchar(250)"); + + b.Property("Exception") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("LastModified") + .HasColumnType("timestamp with time zone"); + + b.Property("ModifiedBy") + .HasColumnType("varchar(250)"); + + b.Property("Note") + .HasColumnType("varchar(250)"); + + b.Property("ObjectData") + .HasColumnType("text"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("QueueMessageId") + .HasColumnType("uuid"); + + b.Property("State") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .IsRequired() + .HasColumnType("varchar(50)") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StringData") + .HasColumnType("text"); + + b.Property("SubscriptionId") + .HasColumnType("varchar(250)"); + + b.Property("Subscriptions") + .HasColumnType("text"); + + b.Property("TenantId") + .HasColumnType("integer"); + + b.Property("TopicId") + .HasColumnType("varchar(250)"); + + b.HasKey("Id") + .HasName("PK_QueueLog"); + + b.ToTable("QueueLog"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/platform/mix.database/Readme.md b/src/platform/mix.database/Readme.md index c8e7bd4b1..9c0abd7ee 100644 --- a/src/platform/mix.database/Readme.md +++ b/src/platform/mix.database/Readme.md @@ -28,4 +28,17 @@ return "Server=localhost;port=3306;Database=mixcore_structure;User=root;Password ``` DatabaseProvider = MixDatabaseProvider.SQLSERVER; return "Server=localhost;Database=mixcore_structure;UID=sa;Pwd=myPassword;MultipleActiveResultSets=true;TrustServerCertificate=True;"; +``` + +``` +Scaffold-DbContext [CONNECTION_STRING] Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models\Cms -force +ex: [CONNECTION_STRING] = "Server=localhost;Database=mixcore_structure;UID=sa;Pwd=myPassword;MultipleActiveResultSets=true;" + +dotnet ef dbcontext scaffold "Host=localhost;Database=mixcore_structure;Username=my_user;Password=myPassword" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Models\Cms\PostgreSQL -force +Scaffold-DbContext "Host=localhost;Database=mixcore_structure;Username=postgre;Password=myPassword" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Entities\Cms\PostgreSQL -Context PostgresqlMixCmsContext -f +ex: [CONNECTION_STRING] = "Host=my_host;Database=mixcore_structure;Username=my_user;Password=my_pw" + +Scaffold-DbContext [CONNECTION_STRING] Pomelo.EntityFrameworkCore.MySql -OutputDir [OUTPUT DIRECTORY] -Context [NAME OF CONTEXT CLASS] -f +ex: [CONNECTION_STRING] = "Server=localhost;port=3306;Database=mixcore_structure;User=root;Password=;" + ``` \ No newline at end of file diff --git a/src/platform/mix.database/Services/DatabaseService.cs b/src/platform/mix.database/Services/DatabaseService.cs index 3f4fafc85..29f69c8a8 100644 --- a/src/platform/mix.database/Services/DatabaseService.cs +++ b/src/platform/mix.database/Services/DatabaseService.cs @@ -1,8 +1,10 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Mix.Database.Entities.Account; +using Mix.Database.Entities.AuditLog; using Mix.Database.Entities.MixDb; using Mix.Database.Entities.Quartz; +using Mix.Database.Entities.QueueLog; using Mix.Heart.Constants; using Mix.Heart.Entities.Cache; using Mix.Heart.Services; @@ -16,7 +18,7 @@ namespace Mix.Database.Services { public class DatabaseService : ConfigurationServiceBase { - public MixDatabaseProvider DatabaseProvider => AppSettings.DatabaseProvider; + public MixDatabaseProvider DatabaseProvider => AppSettings.DatabaseProvider; protected IHttpContextAccessor HttpContextAccessor; protected IConfiguration Configuration; public DatabaseService(IHttpContextAccessor httpContextAccessor, IConfiguration configuration) : base(MixAppConfigFilePaths.Database, true) @@ -38,6 +40,10 @@ public string GetConnectionString(string name) { case MixConstants.CONST_CMS_CONNECTION: return AppSettings.ConnectionStrings?.MixCmsConnection; + case MixConstants.CONST_AUDIT_LOG_CONNECTION: + return AppSettings.ConnectionStrings?.MixAuditLogConnection; + case MixConstants.CONST_QUEUE_LOG_CONNECTION: + return AppSettings.ConnectionStrings?.MixQueueLogConnection; case MixConstants.CONST_ACCOUNT_CONNECTION: return AppSettings.ConnectionStrings?.MixAccountConnection; case MixConstants.CONST_MIXDB_CONNECTION: @@ -52,6 +58,7 @@ public string GetConnectionString(string name) public void SetConnectionString(string name, string value) { + RawSettings["ConnectionStrings"][name] = value; switch (name) { case MixConstants.CONST_QUARTZ_CONNECTION: @@ -66,6 +73,13 @@ public void SetConnectionString(string name, string value) case MixConstants.CONST_MIXDB_CONNECTION: AppSettings.ConnectionStrings.MixDbConnection = value; break; + case MixConstants.CONST_AUDIT_LOG_CONNECTION: + AppSettings.ConnectionStrings.MixAuditLogConnection = value; + break; + case MixConstants.CONST_QUEUE_LOG_CONNECTION: + AppSettings.ConnectionStrings.MixQueueLogConnection = value; + RawSettings["MixQuartzConnection"] = value; + break; default: break; } @@ -121,6 +135,29 @@ public MixCmsAccountContext GetAccountDbContext() _ => null, }; } + + public AuditLogDbContext GetAuditLogDbContext() + { + return DatabaseProvider switch + { + MixDatabaseProvider.SQLSERVER => new SqlServerAuditLogDbContext(this), + MixDatabaseProvider.MySQL => new MySqlAuditLogDbContext(this), + MixDatabaseProvider.SQLITE => new SqlITEAuditLogDbContext(this), + MixDatabaseProvider.PostgreSQL => new PostgresAuditLogDbContext(this), + _ => null, + }; + } + public QueueLogDbContext GetQueueLogDbContext() + { + return DatabaseProvider switch + { + MixDatabaseProvider.SQLSERVER => new SqlServerQueueLogDbContext(this), + MixDatabaseProvider.MySQL => new MySqlQueueLogDbContext(this), + MixDatabaseProvider.SQLITE => new SqlITEQueueLogDbContext(this), + MixDatabaseProvider.PostgreSQL => new PostgresQueueLogDbContext(this), + _ => null, + }; + } public QuartzDbContext GetQuartzDbContext() { @@ -156,12 +193,16 @@ public void InitConnectionStrings(string connectionString, SetConnectionString(MixConstants.CONST_QUARTZ_CONNECTION, connectionString.Replace(".sqlite", "") + "-quartz.sqlite"); SetConnectionString(MixConstants.CONST_ACCOUNT_CONNECTION, connectionString.Replace(".sqlite", "") + "-account.sqlite"); SetConnectionString(MixConstants.CONST_MIXDB_CONNECTION, connectionString.Replace(".sqlite", "") + "-mixdb.sqlite"); + SetConnectionString(MixConstants.CONST_AUDIT_LOG_CONNECTION, connectionString.Replace(".sqlite", "") + "-audit-log.sqlite"); + SetConnectionString(MixConstants.CONST_QUEUE_LOG_CONNECTION, connectionString.Replace(".sqlite", "") + "-queue-log.sqlite"); } else { SetConnectionString(MixConstants.CONST_QUARTZ_CONNECTION, connectionString); SetConnectionString(MixConstants.CONST_ACCOUNT_CONNECTION, connectionString); SetConnectionString(MixConstants.CONST_MIXDB_CONNECTION, connectionString); + SetConnectionString(MixConstants.CONST_AUDIT_LOG_CONNECTION, connectionString); + SetConnectionString(MixConstants.CONST_QUEUE_LOG_CONNECTION, connectionString); } AppSettings.DatabaseProvider = databaseProvider; @@ -193,6 +234,12 @@ public void UpdateMixCmsContext() using var mixdbCtx = GetMixDbDbContext(); if (mixdbCtx.Database.GetPendingMigrations().Count() > 0) mixdbCtx.Database.Migrate(); + using var auditlogCtx = GetAuditLogDbContext(); + if (auditlogCtx.Database.GetPendingMigrations().Count() > 0) + auditlogCtx.Database.Migrate(); + using var queuelogCtx = GetQueueLogDbContext(); + if (queuelogCtx.Database.GetPendingMigrations().Count() > 0) + queuelogCtx.Database.Migrate(); } public async Task InitQuartzContextAsync() diff --git a/src/platform/mix.database/mix.database.csproj b/src/platform/mix.database/mix.database.csproj index a84253c13..c2c5cea90 100644 --- a/src/platform/mix.database/mix.database.csproj +++ b/src/platform/mix.database/mix.database.csproj @@ -16,10 +16,10 @@ - - - - + + + + @@ -41,7 +41,7 @@ - + diff --git a/src/platform/mix.identity/Dtos/GrantPermissionsDto.cs b/src/platform/mix.identity/Dtos/GrantPermissionsDto.cs new file mode 100644 index 000000000..99638dc73 --- /dev/null +++ b/src/platform/mix.identity/Dtos/GrantPermissionsDto.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Identity.Dtos +{ + public sealed class GrantPermissionsDto + { + public List Permissions { get; set; } + public bool IsActive { get; set; } + public string? RequestedBy { get; set; } + } + public sealed class PermissionDto + { + public Guid RoleId { get; set; } + public int PermissionId { get; set; } + } +} diff --git a/src/platform/mix.identity/Interfaces/IOAuthClientService.cs b/src/platform/mix.identity/Interfaces/IOAuthClientService.cs index e99e104c5..dcb20651e 100644 --- a/src/platform/mix.identity/Interfaces/IOAuthClientService.cs +++ b/src/platform/mix.identity/Interfaces/IOAuthClientService.cs @@ -7,6 +7,6 @@ public interface IOAuthClientService { List Clients { get; set; } - List LoadClients(bool isReload = false); + List LoadClients(MixCmsAccountContext accContext, bool isReload = false); } } \ No newline at end of file diff --git a/src/platform/mix.identity/Interfaces/IOAuthTokenService.cs b/src/platform/mix.identity/Interfaces/IOAuthTokenService.cs index ea3b40f17..7354f8cbf 100644 --- a/src/platform/mix.identity/Interfaces/IOAuthTokenService.cs +++ b/src/platform/mix.identity/Interfaces/IOAuthTokenService.cs @@ -10,6 +10,6 @@ public interface IOAuthTokenService { AuthorizeResponse AuthorizeRequest(IHttpContextAccessor httpContextAccessor, OAuthRequest authorizationRequest); TokenResult GenerateJWTToken(IEnumerable scopes, string tokenType, OAuthClient client); - TokenResponse GenerateToken(OAuthTokenRequest tokenRequest); + OAuthTokenResponse GenerateToken(OAuthTokenRequest tokenRequest); } } \ No newline at end of file diff --git a/src/platform/mix.identity/Models/RoleBOModel.cs b/src/platform/mix.identity/Models/RoleBOModel.cs new file mode 100644 index 000000000..c805a44fb --- /dev/null +++ b/src/platform/mix.identity/Models/RoleBOModel.cs @@ -0,0 +1,19 @@ +using Mix.Database.Entities.Account; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Identity.Models +{ + public sealed class RoleBOModel + { + public Guid Id { get; set; } + public string Name { get; set; } + public string NormalizedName { get; set; } + public string ConcurrencyStamp { get; set; } + + public List Permissions { get; set; } + } +} diff --git a/src/platform/mix.identity/Services/OAuthClientService.cs b/src/platform/mix.identity/Services/OAuthClientService.cs index fbef3ff7d..60ac9cf98 100644 --- a/src/platform/mix.identity/Services/OAuthClientService.cs +++ b/src/platform/mix.identity/Services/OAuthClientService.cs @@ -17,21 +17,22 @@ public sealed class OAuthClientService : IOAuthClientService public OAuthClientService(IServiceProvider serviceProvider) { this._serviceProvider = serviceProvider; - LoadClients(); + + using (var scope = _serviceProvider.CreateScope()) + { + var accContext = scope.ServiceProvider.GetService(); + LoadClients(accContext); + } } - public List LoadClients(bool isReload = false) + public List LoadClients(MixCmsAccountContext accContext, bool isReload = false) { - using (var scope = _serviceProvider.CreateScope()) + if (isReload || Clients == null) { - var _accContext = scope.ServiceProvider.GetService(); - if (isReload || Clients == null) - { - Clients = _accContext.OAuthClient.ToList(); - } - _accContext.Dispose(); - return Clients; + Clients = accContext.OAuthClient.ToList(); + accContext.Dispose(); } + return Clients; } } } diff --git a/src/platform/mix.identity/Services/OAuthTokenService.cs b/src/platform/mix.identity/Services/OAuthTokenService.cs index cb87618f0..96b08a8d8 100644 --- a/src/platform/mix.identity/Services/OAuthTokenService.cs +++ b/src/platform/mix.identity/Services/OAuthTokenService.cs @@ -15,6 +15,7 @@ using Mix.Identity.Interfaces; using Mix.Auth.Common; using Mix.Auth.Enums; +using Mix.Shared.Services; namespace Mix.Identity.Services { @@ -24,18 +25,20 @@ public sealed class OAuthTokenService : IOAuthTokenService private readonly IOAuthClientService _clientService; private readonly IOAuthCodeStoreService _codeStoreService; private readonly OAuthServerOptions _options; - private readonly MixCmsAccountContext _context; + private readonly AuthConfigService _authConfigService; private readonly MixAuthenticationConfigurations _authConfigs; public OAuthTokenService(IOAuthCodeStoreService codeStoreService, IOptions options, IConfiguration configuration, - IOAuthClientService clientService) + IOAuthClientService clientService, + AuthConfigService authConfigService) { _clientService = clientService; _codeStoreService = codeStoreService; _options = options.Value; - _authConfigs = configuration.GetSection(MixAppSettingsSection.Authentication).Get(); + _authConfigService = authConfigService; + _authConfigs = _authConfigService.AppSettings; } public AuthorizeResponse AuthorizeRequest(IHttpContextAccessor httpContextAccessor, OAuthRequest authorizationRequest) { @@ -163,16 +166,16 @@ private CheckOAuthClientResult VerifyClientById(Guid clientId, bool checkWithSec } - public TokenResponse GenerateToken(OAuthTokenRequest tokenRequest) + public OAuthTokenResponse GenerateToken(OAuthTokenRequest tokenRequest) { - var result = new TokenResponse(); + var result = new OAuthTokenResponse(); var serchBySecret = SearchForClientBySecret(tokenRequest.grant_type); var checkClientResult = VerifyClientById(tokenRequest.client_id, serchBySecret, tokenRequest.client_secret, tokenRequest.grant_type); if (!checkClientResult.IsSuccess) { - return new TokenResponse { Error = checkClientResult.Error, ErrorDescription = checkClientResult.ErrorDescription }; + return new OAuthTokenResponse { Error = checkClientResult.Error, ErrorDescription = checkClientResult.ErrorDescription }; } // Check first if the authorization_grant is client_credentials... @@ -190,6 +193,7 @@ public TokenResponse GenerateToken(OAuthTokenRequest tokenRequest) var clientCredentialAccessTokenResult = GenerateJWTToken(scopes, OAuthConstants.TokenTypes.JWTAcceseccToken, checkClientResult.Client); result.access_token = clientCredentialAccessTokenResult.AccessToken; + result.expired_at = clientCredentialAccessTokenResult.ExpirationDate; result.id_token = null; // I have to use data shaping here to remove this property or I can customize the return data in the json result, but for now null is ok. result.code = tokenRequest.code; return result; @@ -199,13 +203,13 @@ public TokenResponse GenerateToken(OAuthTokenRequest tokenRequest) // check code from the Concurrent Dictionary var clientCodeChecker = _codeStoreService.GetClientDataByCode(tokenRequest.code); if (clientCodeChecker == null) - return new TokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; + return new OAuthTokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; // check if the current client who is one made this authentication request if (tokenRequest.client_id != clientCodeChecker.ClientId) - return new TokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; + return new OAuthTokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; // TODO: // also I have to check the rediret uri @@ -217,7 +221,7 @@ public TokenResponse GenerateToken(OAuthTokenRequest tokenRequest) clientCodeChecker.CodeChallenge, clientCodeChecker.CodeChallengeMethod); if (!pkceResult) - return new TokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; + return new OAuthTokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; } @@ -226,14 +230,14 @@ public TokenResponse GenerateToken(OAuthTokenRequest tokenRequest) { if (!clientCodeChecker.Subject.Identity!.IsAuthenticated) // I have to inform the caller to redirect the user to the login page - return new TokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; + return new OAuthTokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; var currentUserName = clientCodeChecker.Subject.Identity.Name; var userId = clientCodeChecker.Subject.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(currentUserName)) - return new TokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; + return new OAuthTokenResponse { Error = ErrorTypeEnum.InvalidGrant.GetEnumDescription() }; // Generate Identity Token int iat = (int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; diff --git a/src/platform/mix.identity/ViewModels/PermissionViewModel.cs b/src/platform/mix.identity/ViewModels/PermissionViewModel.cs new file mode 100644 index 000000000..c57323611 --- /dev/null +++ b/src/platform/mix.identity/ViewModels/PermissionViewModel.cs @@ -0,0 +1,32 @@ +using Mix.Database.Entities.Account; + +namespace Mix.Identity.ViewModels +{ + public class PermissionViewModel : ViewModelBase + { + #region Contructors + + public PermissionViewModel() + { + } + public PermissionViewModel(UnitOfWorkInfo unitOfWorkInfo) : base(unitOfWorkInfo) + { + } + + public PermissionViewModel(Permission entity, UnitOfWorkInfo uowInfo) : base(entity, uowInfo) + { + } + + #endregion + + #region Properties + + public int MixTenantId { get; set; } + public string Title { get; set; } + public string Name { get; set; } + public string Icon { get; set; } + public string Type { get; set; } + + #endregion + } +} diff --git a/src/platform/mix.identity/mix.identity.csproj b/src/platform/mix.identity/mix.identity.csproj index ce3fdc1ac..f48ca6911 100644 --- a/src/platform/mix.identity/mix.identity.csproj +++ b/src/platform/mix.identity/mix.identity.csproj @@ -21,16 +21,15 @@ - - - - - - - - + + + + + + + - + diff --git a/src/platform/mix.library/Attributes/MixAuthorizeAttribute.cs b/src/platform/mix.library/Attributes/MixAuthorizeAttribute.cs index f34eaad17..269209ffd 100644 --- a/src/platform/mix.library/Attributes/MixAuthorizeAttribute.cs +++ b/src/platform/mix.library/Attributes/MixAuthorizeAttribute.cs @@ -48,7 +48,7 @@ public void OnAuthorization(AuthorizationFilterContext context) if (!IsInRoles()) { //_logger.LogError("Not in role"); - if (!ValidEnpointPermission(context)) + if (!ValidEndpointPermission(context)) { //_logger.LogError("forbidden"); context.Result = new ForbidResult(); @@ -66,7 +66,7 @@ public void OnAuthorization(AuthorizationFilterContext context) #region Privates - private bool ValidEnpointPermission(AuthorizationFilterContext context) + private bool ValidEndpointPermission(AuthorizationFilterContext context) { return _permissionService.CheckEndpointPermissionAsync(UserRoles, context.HttpContext.Request.Path, context.HttpContext.Request.Method).Result; } diff --git a/src/platform/mix.library/Base/MixQueryEntityApiControllerBase.cs b/src/platform/mix.library/Base/MixQueryEntityApiControllerBase.cs index 320151d60..a71b71bc6 100644 --- a/src/platform/mix.library/Base/MixQueryEntityApiControllerBase.cs +++ b/src/platform/mix.library/Base/MixQueryEntityApiControllerBase.cs @@ -7,6 +7,7 @@ using Mix.Lib.Models.Common; using Mix.Lib.Services; using Mix.Mq.Lib.Models; +using NuGet.Protocol.Plugins; using System.Linq.Expressions; namespace Mix.Lib.Base @@ -32,7 +33,7 @@ public MixQueryEntityApiControllerBase( TDbContext context, IMemoryQueueService queueService, MixCacheDbContext cacheDbContext, IMixTenantService mixTenantService) - : base(httpContextAccessor, + : base(httpContextAccessor, configuration, cacheService, translator, mixIdentityService, queueService, mixTenantService) { Context = context; @@ -64,28 +65,19 @@ public override void OnActionExecuted(ActionExecutedContext context) [HttpGet] public virtual async Task>> Get([FromQuery] SearchRequestDto req) + { + var result = await GetHandler(req); + return Ok(result); + } + + protected virtual async Task> GetHandler(SearchRequestDto req) { var searchRequest = BuildSearchRequest(req); if (!string.IsNullOrEmpty(req.Columns)) { Repository.SetSelectedMembers(req.Columns.Replace(" ", string.Empty).Split(',')); } - var result = await Repository.GetPagingAsync(searchRequest.Predicate, searchRequest.PagingData); - if (!string.IsNullOrEmpty(req.Columns)) - { - List objects = new(); - foreach (var item in result.Items) - { - objects.Add(ReflectionHelper.GetMembers(item, Repository.SelectedMembers)); - } - return Ok(new PagingResponseModel() - { - Items = objects, - PagingData = result.PagingData - }); - } - - return result; + return await Repository.GetPagingAsync(searchRequest.Predicate, searchRequest.PagingData); } [HttpGet("{id}")] diff --git a/src/platform/mix.library/Conventions/ControllerDocumentationConvention.cs b/src/platform/mix.library/Conventions/ControllerDocumentationConvention.cs index 7a3be330c..bdd2e5fca 100644 --- a/src/platform/mix.library/Conventions/ControllerDocumentationConvention.cs +++ b/src/platform/mix.library/Conventions/ControllerDocumentationConvention.cs @@ -1,5 +1,4 @@ using Microsoft.AspNetCore.Mvc.ApplicationModels; -using Mix.Heart.Extensions; namespace Mix.Lib.Conventions { diff --git a/src/platform/mix.library/Dtos/ExportThemeDto.cs b/src/platform/mix.library/Dtos/ExportThemeDto.cs index 69e2fa9c7..04c419141 100644 --- a/src/platform/mix.library/Dtos/ExportThemeDto.cs +++ b/src/platform/mix.library/Dtos/ExportThemeDto.cs @@ -35,6 +35,7 @@ public class SelectedExport public List ModuleIds { get; set; } public List ModuleContentIds { get; set; } + public List MixDatabaseContextIds { get; set; } public List MixDatabaseIds { get; set; } } } diff --git a/src/platform/mix.library/Filters/HttpResponseExceptionFilter.cs b/src/platform/mix.library/Filters/HttpResponseExceptionFilter.cs index 79586dcfd..1f0e2cc68 100644 --- a/src/platform/mix.library/Filters/HttpResponseExceptionFilter.cs +++ b/src/platform/mix.library/Filters/HttpResponseExceptionFilter.cs @@ -15,42 +15,51 @@ public void OnActionExecuted(ActionExecutedContext context) if (context.Exception != null) { - var auditlogData = context.HttpContext.RequestServices.GetService(typeof(AuditLogDataModel)) as AuditLogDataModel; - auditlogData.Exception = ReflectionHelper.ParseObject(context.Exception); + var auditLogData = context.HttpContext.RequestServices.GetService(typeof(AuditLogDataModel)) as AuditLogDataModel; + auditLogData.Exception = ReflectionHelper.ParseObject(context.Exception); if (context.Exception is MixException exception) { + var result = new ExceptionResponseResult(exception.GetType().Name, exception.Errors, exception.Message, exception.StackTrace); context.Result = exception.Status switch { - MixErrorStatus.UnAuthorized => new UnauthorizedObjectResult(exception.Errors) + MixErrorStatus.UnAuthorized => new UnauthorizedObjectResult(result) { StatusCode = (int)exception.Status, }, MixErrorStatus.Forbidden => new ForbidResult() { }, - MixErrorStatus.Badrequest => new BadRequestObjectResult(exception.Errors) + MixErrorStatus.Badrequest => new BadRequestObjectResult(result) { StatusCode = (int)exception.Status, }, - MixErrorStatus.ServerError => new ObjectResult(exception.Errors) + MixErrorStatus.ServerError => new ObjectResult(result) { StatusCode = (int)exception.Status, }, - MixErrorStatus.NotFound => new NotFoundObjectResult(exception.Errors) + MixErrorStatus.NotFound => new NotFoundObjectResult(result) { StatusCode = (int)exception.Status, }, - _ => new ObjectResult(exception.Value) + _ => new ObjectResult(result) { StatusCode = (int)exception.Status, }, }; context.ExceptionHandled = true; } - context.ExceptionHandled = true; + //context.ExceptionHandled = true; } - + } } + + public class ExceptionResponseResult(string code, string[] errors, string message, string stackTrace) + { + public string Code { get; set; } = code; + public string Message { get; set; } = message; // TODO: must be ignored in production + public string[] Errors { get; set; } = errors; + public string StackTrace { get; set; } = stackTrace; // TODO: must be ignored in production + } } diff --git a/src/platform/mix.library/Helpers/MixCmsHelper.cs b/src/platform/mix.library/Helpers/MixCmsHelper.cs index 2fc54dfff..b69df7d2f 100644 --- a/src/platform/mix.library/Helpers/MixCmsHelper.cs +++ b/src/platform/mix.library/Helpers/MixCmsHelper.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; +using Mix.Shared.Models.Configurations; using System.Text.RegularExpressions; namespace Mix.Lib.Helpers { @@ -80,7 +81,7 @@ public static WebApplicationBuilder CreateWebApplicationBuilder(string[] args) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/azure.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/queue.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/mix_heart.json",true, true) - .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/authentication.json",true, true) + //.AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/authentication.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/google_credential.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/google_firebase.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/smtp.json",true, true) @@ -89,6 +90,13 @@ public static WebApplicationBuilder CreateWebApplicationBuilder(string[] args) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/log.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/rate_limit.json",true, true) .AddEnvironmentVariables(); + + if (GlobalConfigService.Instance.InitStatus == InitStep.Blank + && string.IsNullOrEmpty(GlobalConfigService.Instance.AppSettings.ApiEncryptKey)) + { + GlobalConfigService.Instance.SetConfig(nameof(GlobalSettingsModel.ApiEncryptKey), AesEncryptionHelper.GenerateCombinedKeys()); + GlobalConfigService.Instance.SaveSettings(); + } return builder; } public static IHostBuilder CreateHostBuilder(string[] args) where TStartup : class @@ -114,7 +122,7 @@ public static IHostBuilder CreateHostBuilder(string[] args) where TSta .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/storage.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/queue.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/mix_heart.json",true, true) - .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/authentication.json",true, true) + //.AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/authentication.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/google_credential.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/google_firebase.json",true, true) .AddJsonFile($"{Environment.CurrentDirectory}/{MixAppConfigFilePaths.Shared}/appconfigs/smtp.json",true, true) diff --git a/src/platform/mix.library/Interfaces/IMixEdmService.cs b/src/platform/mix.library/Interfaces/IMixEdmService.cs index 2c74972e4..65cf02db1 100644 --- a/src/platform/mix.library/Interfaces/IMixEdmService.cs +++ b/src/platform/mix.library/Interfaces/IMixEdmService.cs @@ -5,7 +5,7 @@ public interface IMixEdmService public void SetTenantId(int tenantId); public void SetTenant(MixTenantSystemModel tenant); public Task GetEdmTemplate(string filename); - public Task SendMailWithEdmTemplate(string subject, string templateName, JObject data, string to, string cc = null, string from = null); - Task SendMailWithTemplate(string subject, string template, JObject data, string to, string cc = null, string from = null); + public Task SendMailWithEdmTemplate(string subject, string templateName, JObject data, string to, string cc = null, string from = null, string fromName = null); + Task SendMailWithTemplate(string subject, string template, JObject data, string to, string cc = null, string from = null, string fromName = null); } } diff --git a/src/platform/mix.library/Interfaces/IMixIdentityService.cs b/src/platform/mix.library/Interfaces/IMixIdentityService.cs index 93f239ed5..0d98fbf9e 100644 --- a/src/platform/mix.library/Interfaces/IMixIdentityService.cs +++ b/src/platform/mix.library/Interfaces/IMixIdentityService.cs @@ -14,15 +14,15 @@ public interface IMixIdentityService public List Roles { get; set; } public bool CheckEndpointPermission(ClaimsPrincipal user, PathString path, string method); public Claim CreateClaim(string type, string value); - public Task ExternalLogin(RegisterExternalBindingModel model, CancellationToken cancellationToken = default); - public Task GenerateAccessTokenAsync(MixUser user, bool isRemember, string aesKey, string rsaPublicKey, CancellationToken cancellationToken = default); - public Task GenerateTokenAsync(MixUser user, JObject info, DateTime expires, string refreshToken, string aesKey, string rsaPublicKey, MixAuthenticationConfigurations appConfigs); - public Task GetAuthData(MixUser user, bool rememberMe, int tenantId, CancellationToken cancellationToken = default); + public Task ExternalLogin(RegisterExternalBindingModel model, CancellationToken cancellationToken = default); + public Task GenerateAccessTokenAsync(MixUser user, bool isRemember, JObject additionalData = default, CancellationToken cancellationToken = default); + public Task GenerateTokenAsync(MixUser user, JObject info, DateTime expires, string refreshToken, MixAuthenticationConfigurations appConfigs); + public Task GetAuthData(MixUser user, bool rememberMe, int tenantId, JObject additionalData = default, CancellationToken cancellationToken = default); public string GetClaim(ClaimsPrincipal User, string claimType); - public Task GetTokenAsync(GetTokenModel model, CancellationToken cancellationToken = default); - public Task LoginAsync(LoginRequestModel model, CancellationToken cancellationToken = default); - public Task RegisterAsync(RegisterRequestModel model, int tenantId, UnitOfWorkInfo _cmsUOW, CancellationToken cancellationToken = default); - public Task RenewTokenAsync(RenewTokenDto refreshTokenDto, CancellationToken cancellationToken = default); + public Task GetTokenAsync(GetTokenModel model, CancellationToken cancellationToken = default); + public Task LoginAsync(LoginRequestModel model, CancellationToken cancellationToken = default); + public Task RegisterAsync(RegisterRequestModel model, int tenantId, UnitOfWorkInfo _cmsUOW, JObject additionalData = default, CancellationToken cancellationToken = default); + public Task RenewTokenAsync(RenewTokenDto refreshTokenDto, CancellationToken cancellationToken = default); public Task VerifyExternalAccessTokenAsync(MixExternalLoginProviders provider, string accessToken, MixAuthenticationConfigurations appConfigs); } } \ No newline at end of file diff --git a/src/platform/mix.library/Middlewares/AuditlogMiddleware.cs b/src/platform/mix.library/Middlewares/AuditlogMiddleware.cs index 4cbcebd49..c595b8646 100644 --- a/src/platform/mix.library/Middlewares/AuditlogMiddleware.cs +++ b/src/platform/mix.library/Middlewares/AuditlogMiddleware.cs @@ -4,9 +4,7 @@ using Mix.Lib.Services; using Mix.Log.Lib.Interfaces; using Mix.Log.Lib.Models; -using Mix.Service.Interfaces; using Mix.Shared.Models.Configurations; -using System.Configuration; using System.Text; namespace Mix.Lib.Middlewares @@ -14,25 +12,22 @@ namespace Mix.Lib.Middlewares public class AuditlogMiddleware { private readonly RequestDelegate _next; - private IAuditLogService _auditlogService; - private AuditLogDataModel _auditlogData; - private IConfiguration _configuration; - private GlobalSettingsModel _globalConfig; - private bool _isLog { get; set; } + private readonly IAuditLogService _auditlogService; + private readonly IConfiguration _configuration; + private readonly GlobalSettingsModel _globalConfig; public AuditlogMiddleware(RequestDelegate next, IConfiguration configuration, IAuditLogService auditlogService) { _configuration = configuration; _globalConfig = _configuration.Get(); _next = next; - _auditlogData = new(); _auditlogService = auditlogService; } - public async Task InvokeAsync(HttpContext context) + public async Task InvokeAsync(HttpContext context, AuditLogDataModel auditLogData) { var logConfigurations = _configuration.GetSection(MixAppSettingsSection.Log).Get(); - _isLog = CheckAuditLogPath(context.Request.Path); - if (!_isLog) + var isLog = CheckAuditLogPath(context.Request.Path); + if (!isLog) { await _next(context); } @@ -40,8 +35,7 @@ public async Task InvokeAsync(HttpContext context) else { //Copy a pointer to the original response body stream - await LogRequest(context); - + await LogRequest(context, auditLogData); //Copy a pointer to the original response body stream var originalBodyStream = context.Response.Body; @@ -50,62 +44,56 @@ public async Task InvokeAsync(HttpContext context) { if (logConfigurations.EnableAuditLog) { - _auditlogService.QueueRequest(_auditlogData); + _auditlogService.QueueRequest(auditLogData); } await _next(context); } else { - //Create a new memory stream... + //POST a new memory stream... using (var responseBody = new MemoryStream()) { - //...and use that for the temporary response body - context.Response.Body = responseBody; - //Continue down the Middleware pipeline, eventually returning to this class await _next(context); //Format the response from the server - await LogResponse(context); - - //Copy the contents of the new memory stream (which contains the response) to the original stream, which is then returned to the client. - await responseBody.CopyToAsync(originalBodyStream); - - _auditlogService.QueueRequest(_auditlogData); - responseBody.Dispose(); + await LogResponse(context, auditLogData); + _auditlogService.QueueRequest(auditLogData); } } } - _auditlogData.StatusCode = context.Response.StatusCode; - if (logConfigurations.IsLogStream && _isLog) + auditLogData.StatusCode = context.Response.StatusCode; + if (logConfigurations.IsLogStream && isLog) { - await _auditlogService.LogStream(_auditlogData.Endpoint, _auditlogData.Exception ?? _auditlogData.Body, isSuccess: _auditlogData.StatusCode < 300); + await _auditlogService.LogStream(auditLogData.Endpoint, auditLogData.Exception ?? auditLogData.Body, isSuccess: auditLogData.StatusCode < 300); } } + private bool CheckAuditLogPath(string path) { return !_globalConfig.IsInit && (path.IndexOf("/api") >= 0 && path.IndexOf("audit-log") < 0 && path.IndexOf("queue-log") < 0); } - private async Task LogRequest(HttpContext context) + private async Task LogRequest(HttpContext context, AuditLogDataModel auditLogData) { var idService = context.RequestServices.GetService(typeof(MixIdentityService)) as MixIdentityService; var request = await FormatRequest(context.Request); - _auditlogData.CreatedBy = idService.GetClaim(context.User, MixClaims.Username); - _auditlogData.RequestIp = context.Request.HttpContext?.Connection?.RemoteIpAddress?.ToString(); - _auditlogData.Endpoint = context.Request.Path; - _auditlogData.Method = context.Request.Method; - _auditlogData.QueryString = context.Request.QueryString.ToString(); - _auditlogData.Body = request.IsJsonString() ? JObject.Parse(request) : new JObject(new JProperty("data", request)); + auditLogData.CreatedBy = idService.GetClaim(context.User, MixClaims.Username); + auditLogData.RequestIp = context.Request.HttpContext?.Connection?.RemoteIpAddress?.ToString(); + auditLogData.Endpoint = context.Request.Path; + auditLogData.Method = context.Request.Method; + auditLogData.QueryString = context.Request.QueryString.ToString(); + auditLogData.Body = request.IsJsonString() ? JObject.Parse(request) : new JObject(new JProperty("data", request)); } - private async Task LogResponse(HttpContext context) + + private async Task LogResponse(HttpContext context, AuditLogDataModel auditLogData) { if (context.Response.Body.CanSeek) { var response = await FormatResponse(context.Response); - _auditlogData.StatusCode = context.Response.StatusCode; - _auditlogData.Response = response.IsJsonString() ? JObject.Parse(response) : new JObject(new JProperty("data", response)); + auditLogData.StatusCode = context.Response.StatusCode; + auditLogData.Response = response.IsJsonString() ? JObject.Parse(response) : new JObject(new JProperty("data", response)); } } @@ -114,14 +102,10 @@ private async Task FormatResponse(HttpResponse response) //We need to read the response stream from the beginning... response.Body.Seek(0, SeekOrigin.Begin); - //...and copy it into a string - string text = await new StreamReader(response.Body).ReadToEndAsync(); - - //We need to reset the reader for the response so that the client can read it. - response.Body.Seek(0, SeekOrigin.Begin); - - //Return the string for the response, including the status code (e.g. 200, 404, 401, etc.) - return text; + var requestReader = new StreamReader(response.Body); + var bodyAsText = await requestReader.ReadToEndAsync(); + response.Body.Position = 0; + return bodyAsText; } private async Task FormatRequest(HttpRequest request) @@ -131,20 +115,12 @@ private async Task FormatRequest(HttpRequest request) //This line allows us to set the reader for the request back at the beginning of its stream. request.EnableBuffering(); - //We now need to read the request stream. First, we create a new byte[] with the same length as the request stream... - var buffer = new byte[Convert.ToInt32(request.ContentLength)]; - - //...Then we copy the entire request stream into the new buffer. - await request.Body.ReadAsync(buffer, 0, buffer.Length); - - //We convert the byte[] into a string using UTF8 encoding... - var bodyAsText = Encoding.UTF8.GetString(buffer); - - //..and finally, assign the read body back to the request body, which is allowed because of EnableRewind() - request.Body.Seek(0, SeekOrigin.Begin); + var requestReader = new StreamReader(request.Body); + var bodyAsText = await requestReader.ReadToEndAsync(); + request.Body.Position = 0; return bodyAsText; } return string.Empty; } } -} +} \ No newline at end of file diff --git a/src/platform/mix.library/Readme.md b/src/platform/mix.library/Readme.md index 157df01c1..55023882e 100644 --- a/src/platform/mix.library/Readme.md +++ b/src/platform/mix.library/Readme.md @@ -4,3 +4,4 @@ TView vm = new(); vm.SetDbContext(injectedContext); ``` + diff --git a/src/platform/mix.library/Services/MixConfigurationService.cs b/src/platform/mix.library/Services/MixConfigurationService.cs index f850a6492..8817d3cae 100644 --- a/src/platform/mix.library/Services/MixConfigurationService.cs +++ b/src/platform/mix.library/Services/MixConfigurationService.cs @@ -12,9 +12,9 @@ public sealed class MixConfigurationService : TenantServiceBase, IMixConfigurati public List Configs { get; set; } public MixConfigurationService( - IHttpContextAccessor httpContextAccessor, + IHttpContextAccessor httpContextAccessor, DatabaseService databaseService, MixCacheService cacheService, - IMixTenantService mixTenantService) + IMixTenantService mixTenantService) : base(httpContextAccessor, cacheService, mixTenantService) { _databaseService = databaseService; @@ -32,9 +32,20 @@ public async Task Reload(UnitOfWorkInfo uow = null) else { uow = new(new MixCmsContext(_databaseService)); - Configs = await MixConfigurationContentViewModel.GetRepository(uow, CacheService).GetAllAsync( - m => m.MixTenantId == CurrentTenant.Id); - uow.Dispose(); + try + { + Configs = await MixConfigurationContentViewModel + .GetRepository(uow, CacheService) + .GetAllAsync(p => true); + } + catch (Exception ex) + { + Console.WriteLine($"MixConfigurationService getting config error {ex.Message}"); + } + finally + { + uow.Dispose(); + } } } } @@ -80,7 +91,7 @@ public async Task GetConfig(string name, string culture, T defaultValue = await Reload(); } var config = Configs.FirstOrDefault(m => m.Specificulture == culture && m.SystemName == name); - return config != null ? config.GetValue(): defaultValue; + return config != null ? config.GetValue() : defaultValue; } } } diff --git a/src/platform/mix.library/Services/MixEdmService.cs b/src/platform/mix.library/Services/MixEdmService.cs index 40e8e9855..76c192b25 100644 --- a/src/platform/mix.library/Services/MixEdmService.cs +++ b/src/platform/mix.library/Services/MixEdmService.cs @@ -38,7 +38,8 @@ public virtual async Task SendMailWithEdmTemplate( string subject, string templateName, JObject data, string to, string cc = null, - string from = null) + string from = null, + string fromName = null) { var template = await GetEdmTemplate(templateName); if (string.IsNullOrEmpty(template)) @@ -59,6 +60,7 @@ public virtual async Task SendMailWithEdmTemplate( Subject = subject, Message = template, From = from, + FromName = fromName, CC = cc, To = to }; @@ -69,7 +71,8 @@ public virtual async Task SendMailWithTemplate( string subject, string template, JObject data, string to, string cc = null, - string from = null) + string from = null, + string fromName = null) { foreach (var prop in data.Properties().ToList()) { @@ -84,6 +87,7 @@ public virtual async Task SendMailWithTemplate( Subject = subject, Message = template, From = from, + FromName = fromName, CC = cc, To = to }; diff --git a/src/platform/mix.library/Services/MixHubContext.cs b/src/platform/mix.library/Services/MixHubContext.cs new file mode 100644 index 000000000..2795ead9b --- /dev/null +++ b/src/platform/mix.library/Services/MixHubContext.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNetCore.Http; + +namespace Mix.Lib.Services +{ + public sealed class MixHubContext(IHttpContextAccessor contextAccessor) + { + public string? ConnectionId + { + get + { + if (contextAccessor?.HttpContext?.Request == null) + { + return null; + } + + return contextAccessor.HttpContext.Request.Headers["hub-connection-id"]; + } + private set { } + } + } +} diff --git a/src/platform/mix.library/Services/MixIdentityService.cs b/src/platform/mix.library/Services/MixIdentityService.cs index 5b29fde41..212a02561 100644 --- a/src/platform/mix.library/Services/MixIdentityService.cs +++ b/src/platform/mix.library/Services/MixIdentityService.cs @@ -1,4 +1,6 @@ -using Microsoft.AspNetCore.Http; +using DocumentFormat.OpenXml.Drawing.Charts; +using DocumentFormat.OpenXml.Office2010.Excel; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; @@ -13,10 +15,12 @@ using Mix.Identity.Enums; using Mix.Identity.ViewModels; using Mix.Lib.Interfaces; - +using Mix.Mq.Lib.Models; using Mix.RepoDb.Interfaces; using Mix.RepoDb.Repositories; +using Mix.Service.Commands; using Mix.Shared.Models.Configurations; +using MySqlX.XDevAPI.Common; using Newtonsoft.Json; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; @@ -29,6 +33,7 @@ public class MixIdentityService : IMixIdentityService { protected const string TenantIdFieldName = "MixTenantId"; protected const string datetimeFormat = "yyyy-MM-ddTHH:mm:ss.FFFZ"; + protected readonly IMemoryQueueService QueueService; protected IConfiguration Configuration; protected readonly UnitOfWorkInfo AccountUow; protected readonly UnitOfWorkInfo CmsUow; @@ -78,7 +83,8 @@ public MixIdentityService( DatabaseService databaseService, MixCmsAccountContext accContext, UnitOfWorkInfo mixDbUow, - IMixDbDataService mixDbDataService, IConfiguration configuration) + IMixDbDataService mixDbDataService, IConfiguration configuration, + IMemoryQueueService queueService) { Session = httpContextAccessor.HttpContext?.Session; Configuration = configuration; @@ -99,6 +105,7 @@ public MixIdentityService( MixDbUow = mixDbUow; MixDbDataService = mixDbDataService; GlobalConfig = Configuration.GetSection(MixAppSettingsSection.GlobalSettings).Get(); + QueueService = queueService; } public virtual async Task Any(Guid userId) @@ -122,7 +129,7 @@ public virtual async Task GetUserAsync(Guid userId) return null; } - public virtual async Task LoginAsync(LoginRequestModel model, CancellationToken cancellationToken = default) + public virtual async Task LoginAsync(LoginRequestModel model, CancellationToken cancellationToken = default) { try { @@ -158,7 +165,7 @@ public virtual async Task LoginAsync(LoginRequestModel model, Cancellat if (result.Succeeded) { - return await GetAuthData(user, model.RememberMe, CurrentTenant.Id, cancellationToken); + return await GetAuthData(user, model.RememberMe, CurrentTenant.Id, default, cancellationToken); } else { @@ -169,42 +176,40 @@ public virtual async Task LoginAsync(LoginRequestModel model, Cancellat { throw; } - catch(Exception ex) + catch (Exception ex) { throw new MixException(MixErrorStatus.ServerError, ex); } } - public virtual async Task GetAuthData(MixUser user, bool rememberMe, int tenantId, CancellationToken cancellationToken = default) + public virtual async Task GetAuthData(MixUser user, bool rememberMe, int tenantId, JObject additionalData = default, CancellationToken cancellationToken = default) { - var rsaKeys = RSAEncryptionHelper.GenerateKeys(); - var aesKey = GlobalConfig.ApiEncryptKey; - var token = await GenerateAccessTokenAsync(user, rememberMe, aesKey, rsaKeys[MixConstants.CONST_RSA_PUBLIC_KEY], cancellationToken); - if (token != null) - { - var data = ReflectionHelper.ParseObject(token); - if (CurrentTenant.Configurations.IsEncryptApi) - { - var encryptedInfo = AesEncryptionHelper.EncryptString(data.ToString(Formatting.None), aesKey); - - var resp = new JObject() - { - //new JProperty(MixEncryptKeywords.AESKey, aesKey), - //new JProperty(MixEncryptKeywords.RSAKey, rsaKeys[MixConstants.CONST_RSA_PRIVATE_KEY]), - new JProperty(MixEncryptKeywords.Message, encryptedInfo) - }; - return resp; - } - else - { - return data; - } - } - return default; + return await GenerateAccessTokenAsync(user, rememberMe, additionalData, cancellationToken); + ////if (token != null) + ////{ + //// var data = ReflectionHelper.ParseObject(token); + //// if (CurrentTenant.Configurations.IsEncryptApi) + //// { + //// var encryptedInfo = AesEncryptionHelper.EncryptString(data.ToString(Formatting.None), aesKey); + + //// var resp = new JObject() + //// { + //// //new JProperty(MixEncryptKeywords.AESKey, aesKey), + //// //new JProperty(MixEncryptKeywords.RSAKey, rsaKeys[MixConstants.CONST_RSA_PRIVATE_KEY]), + //// new JProperty(MixEncryptKeywords.Message, encryptedInfo) + //// }; + //// return resp; + //// } + //// else + //// { + //// return data; + //// } + ////} + //return default; } - public virtual async Task GetTokenAsync(GetTokenModel model, CancellationToken cancellationToken = default) + public virtual async Task GetTokenAsync(GetTokenModel model, CancellationToken cancellationToken = default) { MixUser user = null; if (!string.IsNullOrEmpty(model.Email)) @@ -218,12 +223,12 @@ public virtual async Task GetTokenAsync(GetTokenModel model, Cancellati if (user != null) { - return await GetAuthData(user, true, CurrentTenant.Id, cancellationToken); + return await GetAuthData(user, true, CurrentTenant.Id, default, cancellationToken); } return default; } - public virtual async Task RegisterAsync(RegisterRequestModel model, int tenantId, UnitOfWorkInfo cmsUow, CancellationToken cancellationToken = default) + public virtual async Task RegisterAsync(RegisterRequestModel model, int tenantId, UnitOfWorkInfo cmsUow, JObject additionalData = default, CancellationToken cancellationToken = default) { var user = new MixUser { @@ -254,12 +259,13 @@ public virtual async Task RegisterAsync(RegisterRequestModel model, int await UserManager.AddToTenant(user, tenantId); user = await UserManager.FindByNameAsync(model.UserName).ConfigureAwait(false); + await GetOrCreateUserData(user, additionalData, cancellationToken); return user; } throw new MixException(MixErrorStatus.Badrequest, createResult.Errors.First().Description); } - public virtual async Task GetOrCreateUserData(MixUser user, CancellationToken cancellationToken = default) + public virtual async Task GetOrCreateUserData(MixUser user, JObject additionalData = default, CancellationToken cancellationToken = default) { try { @@ -280,7 +286,23 @@ public virtual async Task GetOrCreateUserData(MixUser user, Cancellatio new JProperty("PhoneNumber", user.PhoneNumber), }; - await MixDbDataService.CreateData(MixDatabaseNames.SYSTEM_USER_DATA, u); + if (additionalData != null) + { + u.Add(additionalData.Properties()); + } + + var id = await MixDbDataService.CreateData(MixDatabaseNames.SYSTEM_USER_DATA, u); + + QueueService.PushMemoryQueue( + CurrentTenant.Id, + MixQueueTopics.MixBackgroundTasks, + MixQueueActions.MixDbEvent, + new MixDbEventCommand(user.UserName, MixDbCommandQueueAction.POST.ToString(), MixDatabaseNames.SYSTEM_USER_DATA, new Shared.Models.MixDbAuditLogModel() + { + Id = id, + MixDbName = MixDatabaseNames.SYSTEM_USER_DATA, + After = u + })); } return u; } @@ -301,8 +323,7 @@ public virtual async Task GetOrCreateUserData(MixUser user, Cancellatio public virtual async Task GenerateAccessTokenAsync( MixUser user, bool isRemember, - string aesKey, - string rsaPublicKey, + JObject additionalData = default, CancellationToken cancellationToken = default) { try @@ -312,7 +333,7 @@ public virtual async Task GenerateAccessTokenAsync( var dtRefreshTokenExpired = dtIssued.AddMinutes(AuthConfigService.AppSettings.RefreshTokenExpiration); var refreshTokenId = Guid.Empty; var refreshToken = Guid.Empty; - //var userInfo = await GetOrCreateUserData(user, cancellationToken); + var userInfo = await GetOrCreateUserData(user, additionalData, cancellationToken); if (isRemember) { refreshToken = Guid.NewGuid(); @@ -333,11 +354,11 @@ public virtual async Task GenerateAccessTokenAsync( var token = new TokenResponseModel() { - Info = new(), + Info = userInfo, EmailConfirmed = user.EmailConfirmed, IsActive = user.IsActived, AccessToken = await GenerateTokenAsync( - user, new(), dtExpired, refreshToken.ToString(), aesKey, rsaPublicKey, AuthConfigService.AppSettings), + user, new(), dtExpired, refreshToken.ToString(), AuthConfigService.AppSettings), RefreshToken = refreshTokenId, TokenType = AuthConfigService.AppSettings.TokenType, ExpiresIn = AuthConfigService.AppSettings.AccessTokenExpiration, @@ -354,7 +375,7 @@ public virtual async Task GenerateAccessTokenAsync( } } - public virtual async Task ExternalLogin(RegisterExternalBindingModel model, CancellationToken cancellationToken = default) + public virtual async Task ExternalLogin(RegisterExternalBindingModel model, CancellationToken cancellationToken = default) { try { @@ -363,17 +384,30 @@ public virtual async Task ExternalLogin(RegisterExternalBindingModel mo { var user = await UserManager.FindByLoginAsync(model.Provider.ToString(), verifiedAccessToken.user_id); + if (user == null && !string.IsNullOrEmpty(model.Email)) + { + user = await UserManager.FindByEmailAsync(model.Email); + } + + if (user == null && !string.IsNullOrEmpty(model.PhoneNumber)) + { + user = await UserManager.FindByPhoneNumberAsync(model.PhoneNumber); + } + if (user == null && !string.IsNullOrEmpty(model.UserName)) + { + user = await UserManager.FindByNameAsync(model.UserName); + } // return local token if already register if (user != null) { - return await GetAuthData(user, true, CurrentTenant.Id, cancellationToken); + return await GetAuthData(user, true, CurrentTenant.Id, model.Data, cancellationToken); } // register new account else { - string userName = model.UserName ?? model.Email ?? model.PhoneNumber; + string userName = model.UserName ?? model.Email?.Split('@')[0] ?? model.PhoneNumber; if (!string.IsNullOrEmpty(userName)) { @@ -390,9 +424,10 @@ public virtual async Task ExternalLogin(RegisterExternalBindingModel mo }, CurrentTenant.Id, CmsUow, + model.Data, cancellationToken); - return await GetAuthData(user, true, CurrentTenant.Id, cancellationToken); + return await GetAuthData(user, true, CurrentTenant.Id, model.Data, cancellationToken); } else { @@ -412,9 +447,9 @@ public virtual async Task ExternalLogin(RegisterExternalBindingModel mo } } - public async Task RenewTokenAsync(RenewTokenDto refreshTokenDto, CancellationToken cancellationToken = default) + public async Task RenewTokenAsync(RenewTokenDto refreshTokenDto, CancellationToken cancellationToken = default) { - JObject result = new(); + var result = new TokenResponseModel(); var oldToken = await RefreshTokenRepo.GetSingleAsync(t => t.Id == refreshTokenDto.RefreshToken, cancellationToken); if (oldToken != null) { @@ -424,10 +459,10 @@ public async Task RenewTokenAsync(RenewTokenDto refreshTokenDto, Cancel var principle = GetPrincipalFromExpiredToken(refreshTokenDto.AccessToken, AuthConfigService.AppSettings); if (principle != null && oldToken.Username == GetClaim(principle, MixClaims.Username)) { - var user = await UserManager.FindByEmailAsync(oldToken.Email); + var user = await UserManager.FindByNameAsync(oldToken.Username); await SignInManager.SignInAsync(user, true).ConfigureAwait(false); - var token = await GetAuthData(user, true, CurrentTenant.Id, cancellationToken); + var token = await GetAuthData(user, true, CurrentTenant.Id, default, cancellationToken); if (token != null) { await oldToken.DeleteAsync(cancellationToken); @@ -534,13 +569,11 @@ public async Task VerifyExternalAccessTokenAsync( return parsedToken; } - public async Task GenerateTokenAsync( + public virtual async Task GenerateTokenAsync( MixUser user, JObject info, DateTime expires, string refreshToken, - string aesKey, - string rsaPublicKey, MixAuthenticationConfigurations appConfigs) { var userRoles = await UserManager.GetUserRolesAsync(user); @@ -560,8 +593,6 @@ public async Task GenerateTokenAsync( CreateClaim(MixClaims.TenantId, CurrentTenant.Id.ToString()), CreateClaim(MixClaims.RefreshToken, refreshToken), CreateClaim(MixClaims.Avatar, info?.Value("avatar") ?? MixConstants.CONST_DEFAULT_AVATAR), - CreateClaim(MixClaims.AESKey, aesKey), - CreateClaim(MixClaims.RSAPublicKey, rsaPublicKey), CreateClaim(MixClaims.ExpireAt, expires.ToString(datetimeFormat)) }); @@ -575,7 +606,19 @@ public async Task GenerateTokenAsync( return new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken); } - + public async Task> LoadUserRoles(string username) + { + try + { + var user = await UserManager.FindByNameAsync(username); + return user != null ? (await UserManager.GetUserRolesAsync(user)).ToList() : default; + } + catch (Exception ex) + { + await MixLogService.LogExceptionAsync(ex); + return default; + } + } protected async Task> GetClaimsAsync(MixUser user, IList userRoles) { List claims = new(); diff --git a/src/platform/mix.library/Services/MixThemeExportService.cs b/src/platform/mix.library/Services/MixThemeExportService.cs index fe75dd002..197544d5a 100644 --- a/src/platform/mix.library/Services/MixThemeExportService.cs +++ b/src/platform/mix.library/Services/MixThemeExportService.cs @@ -3,6 +3,7 @@ using Mix.Lib.Dtos; using Mix.Lib.Interfaces; using Mix.RepoDb.Repositories; +using Mix.Shared.Models; using System.Linq.Expressions; namespace Mix.Lib.Services @@ -74,7 +75,7 @@ private string ZipTheme() // Zip to [theme_name].zip ( wwwroot for web path) string filePath = MixFileHelper.ZipFolder(_tempPath, _outputPath, _fileName); - // Delete temp folder + // DELETE temp folder MixFileHelper.DeleteFolder($"{_outputPath}/{MixThemePackageConstants.AssetFolder}"); MixFileHelper.DeleteFolder($"{_outputPath}/{MixThemePackageConstants.UploadFolder}"); MixFileHelper.DeleteFolder($"{_outputPath}/{MixThemePackageConstants.SchemaFolder}"); @@ -222,7 +223,23 @@ private async Task ExportMixDbAsync() { foreach (var database in _siteData.MixDatabases) { - _repository.InitTableName(database.SystemName); + if (database.MixDatabaseContextId.HasValue) + { + var dbContext = _siteData.MixDatabaseContexts.First(m => m.Id == database.MixDatabaseContextId.Value); + if (dbContext == null) + { + return; + } + var cnn = dbContext.ConnectionString.IsBase64() + ? AesEncryptionHelper.DecryptString(dbContext.ConnectionString, GlobalConfigService.Instance.AppSettings.ApiEncryptKey) + : dbContext.ConnectionString; + _repository.Init(database.SystemName, dbContext.DatabaseProvider, cnn); + } + else + { + _repository.InitTableName(database.SystemName); + + } var data = await _repository.GetAllAsync(); if (data != null) { @@ -342,14 +359,18 @@ private async Task ExportPosts() private async Task ExportDatabases() { - _siteData.MixDatabaseColumns = await _context.MixDatabaseColumn - .Where(m => _dto.Content.MixDatabaseIds.Any(p => p == m.MixDatabaseId)) + _siteData.MixDatabaseContexts = await _context.MixDatabaseContext + .Where(m => _dto.Content.MixDatabaseContextIds.Any(p => p == m.Id)) .AsNoTracking() .ToListAsync(); _siteData.MixDatabases = await _context.MixDatabase .Where(m => _dto.Content.MixDatabaseIds.Any(p => p == m.Id)) .AsNoTracking() .ToListAsync(); + _siteData.MixDatabaseColumns = await _context.MixDatabaseColumn + .Where(m => _dto.Content.MixDatabaseIds.Any(p => p == m.MixDatabaseId)) + .AsNoTracking() + .ToListAsync(); _siteData.MixDatabaseRelationships = await _context.MixDatabaseRelationship .Where(m => _dto.Content.MixDatabaseIds.Any(p => p == m.ParentId)) .AsNoTracking() diff --git a/src/platform/mix.library/Services/MixThemeImportService.cs b/src/platform/mix.library/Services/MixThemeImportService.cs index f3dff291a..ed7711d94 100644 --- a/src/platform/mix.library/Services/MixThemeImportService.cs +++ b/src/platform/mix.library/Services/MixThemeImportService.cs @@ -5,20 +5,24 @@ using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Mix.Auth.Constants; using Mix.Database.Base; using Mix.Database.Entities.MixDb; using Mix.Database.Services; using Mix.Lib.Interfaces; +using Mix.RepoDb.Helpers; using Mix.RepoDb.Interfaces; using Mix.RepoDb.Repositories; using Mix.RepoDb.ViewModels; +using Mix.Signalr.Hub.Models; namespace Mix.Lib.Services { public class MixThemeImportService : IMixThemeImportService { private MixRepoDbRepository _repository { get; set; } - private MixCacheService _cacheService{ get; set; } + private FieldNameService _fieldNameService { get; set; } + private MixCacheService _cacheService { get; set; } private readonly CancellationTokenSource _cts; private readonly DatabaseService _databaseService; private readonly IDatabaseConstants _databaseConstant; @@ -107,22 +111,15 @@ public Task LoadSchema() public async Task LoadSchema(string folder) { - try + using (var serviceScope = _serviceProvider.CreateScope()) { - using (var serviceScope = _serviceProvider.CreateScope()) - { - _uow = serviceScope.ServiceProvider.GetRequiredService>(); - _context = _uow.DbContext; - var strSchema = MixFileHelper.GetFile(MixThemePackageConstants.SchemaFilename, MixFileExtensions.Json, folder); - var siteStructures = JObject.Parse(strSchema.Content).ToObject(); - await ValidateSiteData(siteStructures); - serviceScope.Dispose(); - return siteStructures; - } - } - catch(Exception ex) - { - throw new MixException(MixErrorStatus.ServerError, ex); + _uow = serviceScope.ServiceProvider.GetRequiredService>(); + _context = _uow.DbContext; + var strSchema = MixFileHelper.GetFile(MixThemePackageConstants.SchemaFilename, MixFileExtensions.Json, folder); + var siteStructures = JObject.Parse(strSchema.Content).ToObject(); + await ValidateSiteData(siteStructures); + serviceScope.Dispose(); + return siteStructures; } } @@ -286,7 +283,7 @@ private async Task ImportMixDatabases(UnitOfWorkInfo uow, MixCach { cancellationToken.ThrowIfCancellationRequested(); - await ImportDatabaseContextsAsync(uow.DbContext); + //await ImportDatabaseContextsAsync(uow.DbContext); await ImportDatabasesAsync(uow.DbContext); await ImportDatabaseRelationshipsAsync(uow.DbContext); await MigrateMixDatabaseAsync(uow, cacheService, mixDbService); @@ -457,6 +454,8 @@ private async Task ImportModuleContentsAsync() #endregion Import Module #region Import Database Data + + // TODO: should not import db context, it must be predefined before import database private async Task ImportDatabaseContextsAsync(MixCmsContext context) { @@ -464,21 +463,24 @@ private async Task ImportDatabaseContextsAsync(MixCmsContext context) { try { - var oldId = item.Id; - - while (context.MixDatabaseContext.Any(m => m.SystemName == item.SystemName)) + if (!context.MixDatabaseContext.Any(m => m.SystemName == item.SystemName)) { - item.SystemName = $"{item.SystemName}_1"; + var oldId = item.Id; + + while (context.MixDatabaseContext.Any(m => m.SystemName == item.SystemName)) + { + item.SystemName = $"{item.SystemName}_1"; + } + item.MixTenantId = CurrentTenant.Id; + item.Id = 0; + item.CreatedBy = _siteData.CreatedBy; + item.CreatedDateTime = DateTime.UtcNow; + item.DatabaseProvider = _databaseService.DatabaseProvider; + item.ConnectionString = _databaseService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); + context.Entry(item).State = EntityState.Added; + await context.SaveChangesAsync(_cts.Token); + _dicMixDatabaseContextIds.Add(oldId, item.Id); } - item.MixTenantId = CurrentTenant.Id; - item.Id = 0; - item.CreatedBy = _siteData.CreatedBy; - item.CreatedDateTime = DateTime.UtcNow; - item.DatabaseProvider = _databaseService.DatabaseProvider; - item.ConnectionString = _databaseService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); - context.Entry(item).State = EntityState.Added; - await context.SaveChangesAsync(_cts.Token); - _dicMixDatabaseContextIds.Add(oldId, item.Id); } catch (MixException) { @@ -499,12 +501,23 @@ private async Task ImportDatabasesAsync(MixCmsContext context) { try { + var oldDbContext = _siteData.MixDatabaseContexts.Find(m => m.Id == item.MixDatabaseContextId); var oldId = item.Id; var oldName = item.SystemName; + var currentDbContext = oldDbContext != null ? context.MixDatabaseContext.SingleOrDefault(m => m.SystemName == oldDbContext.SystemName) : default; var currentDb = context.MixDatabase.SingleOrDefault(m => m.SystemName == item.SystemName); + + + // Skip install database if there is no predefined db context + if (item.MixDatabaseContextId.HasValue && currentDbContext is null) + { + continue; + } + if (currentDb == null) { item.Id = 0; + item.MixDatabaseContextId = currentDbContext?.Id; item.CreatedBy = _siteData.CreatedBy; item.CreatedDateTime = DateTime.UtcNow; context.Entry(item).State = EntityState.Added; @@ -598,123 +611,67 @@ private async Task ImportDatabaseRelationshipsAsync(MixCmsContext dbContext) public async Task ImportMixDbDataAsync() { - foreach (var database in _siteData.MixDbModels) + var groupData = _siteData.MixDbModels.GroupBy(m => m.DatabaseName).ToList(); + foreach (var mixGroupData in groupData) { - // Not import user data from other site - if (database.DatabaseName == MixDatabaseNames.SYSTEM_USER_DATA) - { - continue; - } - - try + var oldDbContext = _siteData.MixDatabaseContexts.Find(m => m.Id == _siteData.MixDatabases.First(m => m.SystemName == mixGroupData.Key).MixDatabaseContextId); + var dbContext = oldDbContext != null ? _context.MixDatabaseContext.SingleOrDefault(m => m.SystemName == oldDbContext.SystemName) : default; + if (dbContext == null) { - var mixDb = _siteData.MixDatabases.FirstOrDefault(m => m.SystemName == database.DatabaseName); - if (mixDb != null && database.Data != null && database.Data.Count > 0) - { - var sql = GetInsertQuery(database, mixDb); - await _repository.ExecuteCommand(sql); - } + return; } - catch (MixException) + var mixDb = await RepoDbMixDatabaseViewModel.GetRepository(_uow, _cacheService).GetSingleAsync(m => m.SystemName == mixGroupData.Key); + if (mixDb.MixDatabaseContextId.HasValue) { - throw; + + var cnn = dbContext.ConnectionString.IsBase64() + ? AesEncryptionHelper.DecryptString(dbContext.ConnectionString, GlobalConfigService.Instance.AppSettings.ApiEncryptKey) + : dbContext.ConnectionString; + _repository.Init(mixDb.SystemName, dbContext.DatabaseProvider, cnn); + _fieldNameService = new FieldNameService(dbContext.NamingConvention); } - catch (Exception ex) + else { - throw new MixException(MixErrorStatus.Badrequest, nameof(ImportMixDbDataAsync), database.DatabaseName, ex.Message); - } - } - } + _repository.InitTableName(mixDb.SystemName); + _fieldNameService = new FieldNameService(MixDatabaseNamingConvention.TitleCase); - private string GetInsertQuery(MixDbModel database, MixDatabase mixDb) - { - List columns = new List { "Id", "CreatedDateTime", "LastModified", "MixTenantId", "CreatedBy", "ModifiedBy", "Priority", "Status", "IsDeleted" }; - columns.AddRange(_siteData.MixDatabaseColumns.Where(c => c.MixDatabaseName == database.DatabaseName).Select(c => c.SystemName.ToTitleCase()).ToList()); - List sqlList = new(); - var dbColumns = _siteData.MixDatabaseColumns.Where(m => m.MixDatabaseName == database.DatabaseName).ToList(); - foreach (var jToken in database.Data) - { - var item = (JObject)jToken; - List values = new(); - item["MixTenantId"] = CurrentTenant.Id; + } - if (mixDb.Type == MixDatabaseType.AdditionalData) + foreach (var mixData in mixGroupData) { - string parentType = item.Value("ParentType"); - if (parentType == "Post" && _dicPostContentIds.TryGetValue(item.Value("ParentId"), out int postId)) + // Not import user data from other site + if (mixData.DatabaseName == MixDatabaseNames.SYSTEM_USER_DATA) { - item["ParentId"] = postId; + continue; } - else if (parentType == "Page" && _dicPageIds.TryGetValue(item.Value("ParentId"), out int pageId)) + + try { - item["ParentId"] = pageId; + + + if (mixDb != null && mixData.Data != null && mixData.Data.Count > 0) + { + List lstDto = new(); + foreach (var jToken in mixData.Data) + { + lstDto.Add(await MixDbHelper.ParseDtoToEntityAsync((JObject)jToken, mixDb.Type, mixDb.Columns, _fieldNameService, username: _siteData.CreatedBy)); + } + await _repository.InsertManyAsync(lstDto, mixDb); + _repository.CompleteTransaction(); + } } - else + catch (MixException) { - continue; + throw; + } + catch (Exception ex) + { + throw new MixException(MixErrorStatus.Badrequest, nameof(ImportMixDbDataAsync), mixData.DatabaseName, ex.Message); } } - - foreach (var col in columns) - { - var colType = dbColumns.FirstOrDefault(c => c.SystemName.Equals(col, StringComparison.OrdinalIgnoreCase))?.DataType; - var defaultValue = dbColumns.FirstOrDefault(c => c.SystemName.Equals(col, StringComparison.OrdinalIgnoreCase))?.DefaultValue; - string objValue = GetColumnValue(col, colType, item, defaultValue, mixDb.Type); - values.Add(objValue); - } - - - - sqlList.Add($"Insert into {_databaseConstant.BacktickOpen}{database.DatabaseName}{_databaseConstant.BacktickClose} " + - $"({string.Join(',', columns.Select(c => $"{_databaseConstant.BacktickOpen}{c}{_databaseConstant.BacktickClose}"))}) " + - $"Values ({string.Join(',', values)})"); - } - return string.Join(';', sqlList); - } - - private string GetColumnValue(string col, MixDataType? colDataType, JObject item, string defaultValue, MixDatabaseType mixDbType) - { - switch (col) - { - case "CreatedDateTime": - case "LastModified": - colDataType = MixDataType.Date; - break; - case "IsDeleted": - colDataType = MixDataType.Boolean; - break; - case "Id": - case "MixTenantId": - case "Priority": - colDataType = MixDataType.Integer; - break; } - var strValue = item.Value(col); - - if (strValue != null && strValue.Contains("'")) - { - strValue = strValue.Replace("'", "\\'"); - } - if (string.IsNullOrEmpty(defaultValue)) - { - defaultValue = "NULL"; - } - return colDataType switch - { - MixDataType.Boolean => string.IsNullOrEmpty(strValue) ? defaultValue : strValue, - MixDataType.Integer => string.IsNullOrEmpty(strValue) ? defaultValue : strValue, - MixDataType.Reference => string.IsNullOrEmpty(strValue) ? defaultValue : strValue, - MixDataType.Date => item.Value(col) != null - ? $"'{item.Value(col)?.ToString("yyyy-MM-dd HH-mm-ss")}'" - : defaultValue, - MixDataType.DateTime => item.Value(col) != null - ? $"'{item.Value(col)?.ToString("yyyy-MM-dd HH-mm-ss")}'" - : defaultValue, - _ => string.IsNullOrEmpty(strValue) ? defaultValue : $"'{strValue}'" - }; } - #endregion Import Module #endregion diff --git a/src/platform/mix.library/Services/MixUserConext.cs b/src/platform/mix.library/Services/MixUserConext.cs new file mode 100644 index 000000000..9bd3e532f --- /dev/null +++ b/src/platform/mix.library/Services/MixUserConext.cs @@ -0,0 +1,62 @@ +using Microsoft.AspNetCore.Http; +using Mix.Auth.Constants; +using System.Security.Claims; + +namespace Mix.Lib.Services +{ + public sealed class MixUserConext(IHttpContextAccessor contextAccessor) + { + public ClaimsPrincipal? User + { + get + { + if (contextAccessor.HttpContext?.User is not null) + { + return contextAccessor.HttpContext.User; + } + + return null; + } + } + + public string? UserName + { + get + { + return GetClaimValue(MixClaims.Username); + } + + private set { } + } + + public string? Role + { + get + { + return GetClaimValue(MixClaims.Role); + } + + private set { } + } + + private List GetClaimsByType(string type) + { + if (User is null) + { + return []; + } + + return User.Claims.Where(c => c.Type == type).ToList(); + } + + private string? GetClaimValue(string type) + { + if (User is null) + { + return null; + } + + return string.Join(',', GetClaimsByType(type).Select(m => m.Value)); + } + } +} diff --git a/src/platform/mix.library/Services/TenantUserManager.cs b/src/platform/mix.library/Services/TenantUserManager.cs index a59f969e0..7039676fc 100644 --- a/src/platform/mix.library/Services/TenantUserManager.cs +++ b/src/platform/mix.library/Services/TenantUserManager.cs @@ -120,7 +120,7 @@ public async Task> GetUserRolesAsync(MixUser user) var roles = from ur in Context.AspNetUserRoles join r in Context.MixRoles on ur.RoleId equals r.Id - where ur.UserId == user.Id && ur.MixTenantId == CurrentTenant.Id + where ur.UserId == user.Id select r; return await roles.ToListAsync(); } diff --git a/src/platform/mix.library/Startup/AuthServiceCollectionExtensions.cs b/src/platform/mix.library/Startup/AuthServiceCollectionExtensions.cs index f39129673..644886e2e 100644 --- a/src/platform/mix.library/Startup/AuthServiceCollectionExtensions.cs +++ b/src/platform/mix.library/Startup/AuthServiceCollectionExtensions.cs @@ -17,6 +17,8 @@ using Mix.Identity.Services; using Mix.Lib.Services; using Mix.Shared.Models.Configurations; +using Mix.Shared.Services; +using RabbitMQ.Client; using System.Reflection; using System.Text; namespace Microsoft.Extensions.DependencyInjection @@ -27,19 +29,31 @@ public static class AuthServiceCollectionExtensions public static IServiceCollection AddMixAuthorize(this IServiceCollection services, IConfiguration configuration) where TDbContext : DbContext { - AuthConfigService authConfigService = services.GetService(); + services.TryAddScoped(); + var _globalConfig = configuration.Get()!; + var authConfigService = services.GetService(); if (_globalConfig.IsInit) { - authConfigService.AppSettings.SecretKey = Guid.NewGuid().ToString("N"); + authConfigService.SetConfig(nameof(MixAuthenticationConfigurations.SecretKey), Guid.NewGuid().ToString("N")); authConfigService.SaveSettings(); } + services.AddMixIdentityConfigurations(configuration); + + services.AddMixIdentityServices(); + return services; + } + public static IServiceCollection AddMixIdentityConfigurations(this IServiceCollection services, IConfiguration configuration) + where TDbContext : DbContext + { + services.TryAddScoped(); + var authConfigService = services.GetService(); var authConfigurations = authConfigService.AppSettings; PasswordOptions pOpt = new() { RequireDigit = false, - RequiredLength = 6, + RequiredLength = 4, RequireLowercase = false, RequireNonAlphanumeric = false, RequireUppercase = false @@ -116,16 +130,21 @@ public static IServiceCollection AddMixAuthorize(this IServiceCollec // options.SlidingExpiration = true; //}); // Firebase service must be singleton (only one firebase default instance) + + services.TryAddSingleton(); + services.TryAddSingleton(); + services.TryAddScoped(); + services.TryAddScoped(); + return services; + } + + public static IServiceCollection AddMixIdentityServices(this IServiceCollection services) + { services.TryAddSingleton(); + services.TryAddSingleton(); services.TryAddScoped(); services.TryAddScoped>(); - services.AddSingleton(); - services.AddSingleton(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - - + services.TryAddScoped(); return services; } diff --git a/src/platform/mix.library/Startup/MixTenant.cs b/src/platform/mix.library/Startup/MixTenant.cs index 77802e0d8..b5c5516d2 100644 --- a/src/platform/mix.library/Startup/MixTenant.cs +++ b/src/platform/mix.library/Startup/MixTenant.cs @@ -15,16 +15,17 @@ public static partial class ServiceCollectionExtensions { public static IServiceCollection AddMixTenant(this IServiceCollection services, IConfiguration configuration) { - var authConfig = configuration.GetSection(MixAppSettingsSection.Authentication).Get(); + services.TryAddScoped(); + var authConfigService = services.GetService(); services.AddMixCache(configuration); services.AddSession( options => { - options.IdleTimeout = TimeSpan.FromMinutes(authConfig.AccessTokenExpiration); + options.IdleTimeout = TimeSpan.FromMinutes(authConfigService.AppSettings.AccessTokenExpiration); options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Strict; options.Cookie.HttpOnly = true; - options.Cookie.Name = authConfig.Issuer; + options.Cookie.Name = authConfigService.AppSettings.Issuer; } ); diff --git a/src/platform/mix.library/Startup/Swagger.cs b/src/platform/mix.library/Startup/Swagger.cs index 4f8f0af09..368bea827 100644 --- a/src/platform/mix.library/Startup/Swagger.cs +++ b/src/platform/mix.library/Startup/Swagger.cs @@ -57,8 +57,8 @@ public static IApplicationBuilder UseMixSwaggerApps(this IApplicationBuilder app string routeTemplate = "swagger/{documentName}/swagger.json"; string endPoint = $"/swagger/{version}/swagger.json"; - //if (isDevelop) - //{ + if (isDevelop) + { var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; app.UseSwagger(opt => @@ -76,7 +76,7 @@ public static IApplicationBuilder UseMixSwaggerApps(this IApplicationBuilder app c.EnableFilter(); c.EnableDeepLinking(); }); - //} + } return app; } diff --git a/src/platform/mix.library/Startup/UnitOfWorks.cs b/src/platform/mix.library/Startup/UnitOfWorks.cs index ac06c77bb..879c67f38 100644 --- a/src/platform/mix.library/Startup/UnitOfWorks.cs +++ b/src/platform/mix.library/Startup/UnitOfWorks.cs @@ -2,7 +2,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Mix.Database.Entities.Account; using Mix.Database.Entities.AuditLog; -using Mix.Database.Entities.Queue; +using Mix.Database.Entities.QueueLog; using Mix.Lib.Middlewares; namespace Microsoft.Extensions.DependencyInjection @@ -12,18 +12,18 @@ public static partial class ServiceCollectionExtensions public static IServiceCollection AddUoWs(this IServiceCollection services) { services.AddDbContext(); - services.AddDbContext(); + services.AddDbContext(); services.TryAddScoped>(); services.TryAddScoped>(); services.TryAddScoped>(); services.TryAddScoped>(); - services.TryAddScoped>(); + services.TryAddScoped>(); UnitOfWorkMiddleware.AddUnitOfWork>(); UnitOfWorkMiddleware.AddUnitOfWork>(); UnitOfWorkMiddleware.AddUnitOfWork>(); UnitOfWorkMiddleware.AddUnitOfWork>(); - UnitOfWorkMiddleware.AddUnitOfWork>(); + UnitOfWorkMiddleware.AddUnitOfWork>(); return services; } diff --git a/src/platform/mix.library/Startup/_ServiceCollectionExtensions.cs b/src/platform/mix.library/Startup/_ServiceCollectionExtensions.cs index 3105ff721..4f7bfb28a 100644 --- a/src/platform/mix.library/Startup/_ServiceCollectionExtensions.cs +++ b/src/platform/mix.library/Startup/_ServiceCollectionExtensions.cs @@ -39,9 +39,6 @@ public static IServiceCollection AddMixServices(this IServiceCollection services var globalConfig = configuration.GetSection(MixAppSettingsSection.GlobalSettings) .Get(); - var authConfig = configuration.GetSection(MixAppSettingsSection.Authentication) - .Get(); - var redisCnn = configuration.GetSection("Redis").GetValue("ConnectionString"); services.Configure(options => { @@ -57,7 +54,7 @@ public static IServiceCollection AddMixServices(this IServiceCollection services { var redis = ConnectionMultiplexer.Connect(configuration.GetSection("Redis").GetValue("ConnectionString")); services.AddDataProtection() - .SetApplicationName(authConfig.Issuer) + .SetApplicationName(Assembly.GetExecutingAssembly().FullName) .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys"); var sp = services.BuildServiceProvider(); @@ -72,7 +69,7 @@ public static IServiceCollection AddMixServices(this IServiceCollection services { services.AddDataProtection() .UnprotectKeysWithAnyCertificate() - .SetApplicationName(authConfig.Issuer); + .SetApplicationName(Assembly.GetExecutingAssembly().FullName); } @@ -94,7 +91,6 @@ public static IServiceCollection AddMixServices(this IServiceCollection services services.AddMixTenant(configuration); services.AddGeneratedPublisher(); - services.AddMixModuleServices(configuration); services.AddGeneratedRestApi(MixAssemblies); @@ -120,11 +116,8 @@ public static IServiceCollection AddMixTestServices(this IServiceCollection serv { // Clone Settings from shared folder var globalConfig = configuration.GetSection(MixAppSettingsSection.GlobalSettings).Get()!; - var authConfig = configuration.GetSection(MixAppSettingsSection.Authentication) - .Get(); services.AddMvc().AddSessionStateTempDataProvider(); - services.AddMixCommonServices(configuration); services.TryAddScoped(); services.TryAddScoped(); @@ -149,8 +142,6 @@ public static IServiceCollection AddMixTestServices(this IServiceCollection serv services.AddMixSwaggerServices(executingAssembly); services.AddSSL(); - - services.Configure( options => options.Level = System.IO.Compression.CompressionLevel.Fastest); services.AddResponseCaching(); diff --git a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDatabaseColumnViewModelHandler.cs b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDatabaseColumnViewModelHandler.cs index 0beb8bdc7..6801402a7 100644 --- a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDatabaseColumnViewModelHandler.cs +++ b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDatabaseColumnViewModelHandler.cs @@ -27,8 +27,8 @@ public static async Task MessageQueueHandler(MessageQueueModel data, IMixDbServi await mixDbService.AddColumn(repoCol); break; case "Put": - case "Patch": - case "Delete": + case "PATCH": + case "DELETE": default: break; } diff --git a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDomainViewModelHandler.cs b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDomainViewModelHandler.cs index c2b18b49b..1645f7f39 100644 --- a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDomainViewModelHandler.cs +++ b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixDomainViewModelHandler.cs @@ -19,8 +19,8 @@ public static Task MessageQueueHandler(MessageQueueModel data, IMixTenantService break; case "Post": case "Put": - case "Patch": - case "Delete": + case "PATCH": + case "DELETE": return mixTenantService.Reload(); default: break; diff --git a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixTenantSystemViewModelHandler.cs b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixTenantSystemViewModelHandler.cs index 12831086c..eaa946042 100644 --- a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixTenantSystemViewModelHandler.cs +++ b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/MixTenantSystemViewModelHandler.cs @@ -16,12 +16,12 @@ public static Task MessageQueueHandler(MessageQueueModel data, IMixTenantService switch (data.Action) { case "Get": - case "Patch": + case "PATCH": break; case "Post": case "Put": break; - case "Delete": + case "DELETE": return mixTenantService.Reload(); default: break; diff --git a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/PageContentHandler.cs b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/PageContentHandler.cs index 63e478ac1..caf1b8787 100644 --- a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/PageContentHandler.cs +++ b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/PageContentHandler.cs @@ -13,8 +13,8 @@ public static Task MessageQueueHandler(MessageQueueModel data, MixCacheService c break; case "Post": case "Put": - case "Patch": - case "Delete": + case "PATCH": + case "DELETE": return DeleteCacheAsync(template, cacheService); default: break; diff --git a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/TemplateHandler.cs b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/TemplateHandler.cs index 54327274b..5ea9c6810 100644 --- a/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/TemplateHandler.cs +++ b/src/platform/mix.library/Subscribers/Handlers/MixViewModelChangedHandlers/TemplateHandler.cs @@ -15,13 +15,13 @@ public static Task MessageQueueHandler(MessageQueueModel data) switch (data.Action) { case "Get": - case "Patch": + case "PATCH": break; case "Post": case "Put": SaveTemplate(template); break; - case "Delete": + case "DELETE": DeleteTemplate(template); break; default: diff --git a/src/platform/mix.library/Subscribers/MixBackgroundTaskSubscriber.cs b/src/platform/mix.library/Subscribers/MixBackgroundTaskSubscriber.cs index ada869dc1..ed0c88d3b 100644 --- a/src/platform/mix.library/Subscribers/MixBackgroundTaskSubscriber.cs +++ b/src/platform/mix.library/Subscribers/MixBackgroundTaskSubscriber.cs @@ -59,12 +59,12 @@ public override Task StartAsync(CancellationToken cancellationToken = default) } catch (Exception ex) { - _logger.LogError(GetType().Name, ex); + Logger.LogError(GetType().Name, ex); } } }); } - public override async Task Handler(MessageQueueModel model) + public override async Task Handler(MessageQueueModel model, CancellationToken cancellationToken) { if (!allowActions.Contains(model.Action)) { diff --git a/src/platform/mix.library/Subscribers/MixDbCommandSubscriber.cs b/src/platform/mix.library/Subscribers/MixDbCommandSubscriber.cs index 24f853217..10f586d40 100644 --- a/src/platform/mix.library/Subscribers/MixDbCommandSubscriber.cs +++ b/src/platform/mix.library/Subscribers/MixDbCommandSubscriber.cs @@ -21,6 +21,7 @@ namespace Mix.Lib.Subscribers { public class MixDbCommandSubscriber : SubscriberBase { + private readonly string[] _allowActions; private const string TopicId = MixQueueTopics.MixDbCommand; public MixDbCommandSubscriber( @@ -31,17 +32,24 @@ public MixDbCommandSubscriber( IPooledObjectPolicy rabbitMqObjectPolicy = null) : base(TopicId, nameof(MixDbCommandSubscriber), 20, serviceProvider, configuration, queueService, logger, rabbitMqObjectPolicy) { + _allowActions = [.. Enum.GetNames(typeof(MixDbCommandQueueAction))]; } - public override async Task Handler(MessageQueueModel model) + public override async Task Handler(MessageQueueModel model, CancellationToken cancellationToken) { + if (!_allowActions.Contains(model.Action)) + { + return; + } + IMixDbDataService mixDbDataService = GetRequiredService(); IMixDbCommandHubClientService mixDbCommandHub = GetRequiredService(); UnitOfWorkInfo uow = GetRequiredService>(); mixDbDataService.SetUOW(uow); - switch (model.Action) + Enum.TryParse(model.Action, out MixDbCommandQueueAction action); + switch (action) { - case MixDbCommandQueueActions.Create: + case MixDbCommandQueueAction.POST: var cmd = model.ParseData(); if (cmd != null) { @@ -53,7 +61,7 @@ await mixDbCommandHub.SendPrivateMessageAsync( } } break; - case MixDbCommandQueueActions.Update: + case MixDbCommandQueueAction.PUT: var updCmd = model.ParseData(); if (updCmd != null) { diff --git a/src/platform/mix.library/Subscribers/MixViewModelChangedSubscriber.cs b/src/platform/mix.library/Subscribers/MixViewModelChangedSubscriber.cs index ee9e9a8a1..ba1960bf8 100644 --- a/src/platform/mix.library/Subscribers/MixViewModelChangedSubscriber.cs +++ b/src/platform/mix.library/Subscribers/MixViewModelChangedSubscriber.cs @@ -29,28 +29,28 @@ public MixViewModelChangedSubscriber( _mixTenantService = mixTenantService; } - public override async Task Handler(MessageQueueModel data) + public override async Task Handler(MessageQueueModel model, CancellationToken cancellationToken) { CacheService ??= GetRequiredService(); - await UpdateCacheHandler(data); - switch (data.DataTypeFullName) + await UpdateCacheHandler(model); + switch (model.DataTypeFullName) { case var m when m == typeof(MixTemplateViewModel).FullName: - await TemplateHandler.MessageQueueHandler(data); + await TemplateHandler.MessageQueueHandler(model); break; case var m when m == typeof(MixPageContentViewModel).FullName: - await PageContentHandler.MessageQueueHandler(data, CacheService); + await PageContentHandler.MessageQueueHandler(model, CacheService); break; case var m when m == typeof(MixTenantSystemViewModel).FullName: - await MixTenantSystemViewModelHandler.MessageQueueHandler(data, _mixTenantService); + await MixTenantSystemViewModelHandler.MessageQueueHandler(model, _mixTenantService); break; case var m when m == typeof(MixTenantSystemViewModel).FullName: - await MixDomainViewModelHandler.MessageQueueHandler(data, _mixTenantService); + await MixDomainViewModelHandler.MessageQueueHandler(model, _mixTenantService); break; case var m when m == typeof(MixDatabaseColumnViewModel).FullName: var mixDbService = GetRequiredService(); if (mixDbService != null) { - await MixDatabaseColumnViewModelHandler.MessageQueueHandler(data,mixDbService); + await MixDatabaseColumnViewModelHandler.MessageQueueHandler(model,mixDbService); } break; default: @@ -71,10 +71,10 @@ private async Task UpdateCacheHandler(MessageQueueModel data) var cacheService = serviceScope.ServiceProvider.GetRequiredService(); switch (data.Action) { - case "Patch": + case "PATCH": case "Post": case "Put": - case "Delete": + case "DELETE": var modifiedEntities = vm.Value("modifiedEntities")?.ToObject>(); await cacheService.RemoveCachesAsync(modifiedEntities); break; diff --git a/src/platform/mix.library/ViewModels/MixDatabaseContextViewModel.cs b/src/platform/mix.library/ViewModels/MixDatabaseContextViewModel.cs index 1d85c4c1e..bcb2ce59b 100644 --- a/src/platform/mix.library/ViewModels/MixDatabaseContextViewModel.cs +++ b/src/platform/mix.library/ViewModels/MixDatabaseContextViewModel.cs @@ -1,4 +1,6 @@ -namespace Mix.Lib.ViewModels +using System.Text.Json.Serialization; + +namespace Mix.Lib.ViewModels { public sealed class MixDatabaseContextViewModel : TenantDataViewModelBase @@ -11,6 +13,9 @@ public sealed class MixDatabaseContextViewModel public string SystemName { get; set; } public List Databases { get; set; } = new(); + + [JsonIgnore] + public string DecryptedConnectionString { get; set; } #endregion #region Constructors @@ -34,8 +39,24 @@ public MixDatabaseContextViewModel(MixDatabaseContext entity, UnitOfWorkInfo uow #region Overrides public override async Task ExpandView(CancellationToken cancellationToken = default) { - var dbRepo = MixDatabaseViewModel.GetRepository(UowInfo, CacheService); - Databases = await dbRepo.GetListAsync(m => m.MixDatabaseContextId == Id, cancellationToken); + Databases = await MixDatabaseViewModel.GetRepository(UowInfo, CacheService).GetListAsync(m => m.MixDatabaseContextId == Id, cancellationToken); + if (ConnectionString.IsBase64()) + { + DecryptedConnectionString ??= AesEncryptionHelper.DecryptString(ConnectionString, GlobalConfigService.Instance.AppSettings.ApiEncryptKey); + } + else + { + DecryptedConnectionString = ConnectionString; + } + } + + public override Task ParseEntity(CancellationToken cancellationToken = default) + { + if (!string.IsNullOrEmpty(DecryptedConnectionString)) + { + ConnectionString = AesEncryptionHelper.EncryptString(DecryptedConnectionString, GlobalConfigService.Instance.AppSettings.ApiEncryptKey); + } + return base.ParseEntity(cancellationToken); } protected override async Task DeleteHandlerAsync(CancellationToken cancellationToken = default) diff --git a/src/platform/mix.library/ViewModels/MixDatabaseViewModel.cs b/src/platform/mix.library/ViewModels/MixDatabaseViewModel.cs index dc08bfbdb..a1feee785 100644 --- a/src/platform/mix.library/ViewModels/MixDatabaseViewModel.cs +++ b/src/platform/mix.library/ViewModels/MixDatabaseViewModel.cs @@ -71,7 +71,7 @@ public override async Task ExpandView(CancellationToken cancellationToken = defa protected override async Task SaveEntityRelationshipAsync(MixDatabase parentEntity, CancellationToken cancellationToken = default) { var fieldNameService = GetFielNameService(); - + if (Columns != null) { @@ -143,7 +143,7 @@ private async Task CreateRefColumn(MixDatabaseRelationshipViewModel item, FieldN if (item.Type == MixDatabaseRelationshipType.OneToMany) { var referenceColumnName = fieldNameService.GetParentId(item.SourceDatabaseName); - + if (!Context.MixDatabaseColumn.Any(m => m.MixDatabaseName == item.DestinateDatabaseName && m.SystemName == referenceColumnName)) { var srcDb = Context.MixDatabase.FirstOrDefault(m => m.SystemName == item.SourceDatabaseName); @@ -152,7 +152,7 @@ private async Task CreateRefColumn(MixDatabaseRelationshipViewModel item, FieldN { MixDatabaseName = item.DestinateDatabaseName, MixDatabaseId = destDb.Id, - DataType = MixDataType.Reference, + DataType = srcDb.Type == MixDatabaseType.GuidService ? MixDataType.Guid : MixDataType.Integer, CreatedBy = CreatedBy, DisplayName = item.ReferenceColumnName.ToTitleCase(), SystemName = referenceColumnName diff --git a/src/platform/mix.library/mix.library.csproj b/src/platform/mix.library/mix.library.csproj index 028856d00..178b4c2fc 100644 --- a/src/platform/mix.library/mix.library.csproj +++ b/src/platform/mix.library/mix.library.csproj @@ -41,7 +41,6 @@ - @@ -82,13 +81,13 @@ - - - - - - - + + + + + + + diff --git a/src/platform/mix.log/Interfaces/IMixQueueLog.cs b/src/platform/mix.log/Interfaces/IMixQueueLog.cs index c5458459a..d5904f87a 100644 --- a/src/platform/mix.log/Interfaces/IMixQueueLog.cs +++ b/src/platform/mix.log/Interfaces/IMixQueueLog.cs @@ -1,8 +1,4 @@ -using Microsoft.AspNetCore.Http; -using Mix.Database.Entities.Queue; -using Mix.Mq.Lib.Models; -using Mix.Service.Models; -using Newtonsoft.Json.Linq; +using Mix.Mq.Lib.Models; namespace Mix.Log.Lib.Interfaces { diff --git a/src/platform/mix.log/ServiceCollectionExtension.cs b/src/platform/mix.log/ServiceCollectionExtension.cs index d45e5258e..ee2a49949 100644 --- a/src/platform/mix.log/ServiceCollectionExtension.cs +++ b/src/platform/mix.log/ServiceCollectionExtension.cs @@ -1,11 +1,11 @@ -using Google.Api; -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; using Mix.Constant.Constants; using Mix.Database.Entities.AuditLog; -using Mix.Database.Entities.Queue; +using Mix.Database.Entities.QueueLog; using Mix.Database.Services; using Mix.Lib.Interfaces; using Mix.Log.Lib.Interfaces; @@ -17,22 +17,21 @@ using Mix.Queue.Interfaces; using Mix.Queue.Services; using Mix.Service.Services; -using Mix.Shared.Interfaces; using Mix.Shared.Models.Configurations; using Mix.Shared.Services; using Mix.SignalR.Interfaces; -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Mix.Log.Lib { public static class ServiceCollectionExtensions { - public static IServiceCollection AddMixLog(this IServiceCollection services, IConfiguration configuration) + // Only need to add these services to the main service + // which is use for subscribe and store log messages + // For other application: + // builder.Services.AddHostedService(); + // app.UseMiddleware(); + // For Ex: store log message to db, just need to add these services to main application only + public static IServiceCollection AddMixLogSubscriber(this IServiceCollection services, IConfiguration configuration) { var globalConfigs = configuration.GetSection(MixAppSettingsSection.GlobalSettings).Get()!; @@ -46,16 +45,25 @@ public static IServiceCollection AddMixLog(this IServiceCollection services, ICo services.AddDbContext(); - services.AddDbContext(); - services.TryAddScoped(); + services.AddDbContext(); + services.TryAddSingleton(); if (!globalConfigs!.IsInit) { - services.AddHostedService(); services.TryAddSingleton(); services.TryAddSingleton(); + services.AddHostedService(); } return services; } + + public static IHostApplicationBuilder AddMixLogPublisher(this IHostApplicationBuilder builder) + { + builder.Services.TryAddSingleton(); + builder.Services.TryAddScoped(); + builder.Services.AddHostedService(); + + return builder; + } } } diff --git a/src/platform/mix.log/Services/AuditLogService.cs b/src/platform/mix.log/Services/AuditLogService.cs index a86ce271e..7b2868164 100644 --- a/src/platform/mix.log/Services/AuditLogService.cs +++ b/src/platform/mix.log/Services/AuditLogService.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Mix.Constant.Constants; using Mix.Database.Entities.AuditLog; +using Mix.Database.Services; using Mix.Heart.Enums; using Mix.Heart.Helpers; using Mix.Log.Lib.Commands; @@ -17,27 +18,24 @@ namespace Mix.Log.Lib.Services { public class AuditLogService : IAuditLogService { + private readonly DatabaseService _databaseService; private readonly ILogStreamHubClientService _logStreamHub; private readonly IMemoryQueueService _queueService; private AuditLogDbContext _dbContext; public int TenantId { get; set; } - public AuditLogService(IMemoryQueueService queueService, ILogStreamHubClientService logStreamHub) + public AuditLogService(IMemoryQueueService queueService, ILogStreamHubClientService logStreamHub, DatabaseService databaseService) { _queueService = queueService; _logStreamHub = logStreamHub; + _databaseService = databaseService; } public async Task SaveRequestAsync(AuditLogDataModel request) { try { - using (_dbContext = new()) + using (_dbContext = _databaseService.GetAuditLogDbContext()) { - if (_dbContext.Database.GetPendingMigrations().Any()) - { - _dbContext.Database.Migrate(); - } - var log = new AuditLog() { Id = Guid.NewGuid(), diff --git a/src/platform/mix.log/Services/MixQueueLogService.cs b/src/platform/mix.log/Services/MixQueueLogService.cs index b10c6e20d..921ff4ebe 100644 --- a/src/platform/mix.log/Services/MixQueueLogService.cs +++ b/src/platform/mix.log/Services/MixQueueLogService.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Mix.Constant.Enums; -using Mix.Database.Entities.Queue; +using Mix.Database.Entities.QueueLog; +using Mix.Database.Services; using Mix.Heart.Enums; using Mix.Heart.Extensions; using Mix.Heart.Helpers; @@ -13,12 +14,14 @@ namespace Mix.Log.Lib.Services { public class MixQueueLogService : IMixQueueLog { - private MixQueueDbContext _dbContext; + private QueueLogDbContext _dbContext; + private readonly DatabaseService _databaseService; private MixQueueMessages _mixQueueService; public int TenantId { get; set; } - public MixQueueLogService() + public MixQueueLogService(DatabaseService databaseService) { _mixQueueService = new(); + _databaseService = databaseService; } @@ -26,16 +29,16 @@ public async Task EnqueueMessageAsync(MessageQueueModel queueMessage) { try { - using (_dbContext = new()) + using (_dbContext = _databaseService.GetQueueLogDbContext()) { InitDbContext(); if (queueMessage != null) { - var queueLog = new MixQueueMessageLog() + var queueLog = new QueueLog() { Id = queueMessage.Id, QueueMessageId = queueMessage.Id, - CreatedDateTime = DateTime.UtcNow, + CreatedDateTime = queueMessage.CreatedDate, Action = queueMessage.Action, TopicId = queueMessage.TopicId, DataTypeFullName = queueMessage.DataTypeFullName, @@ -51,7 +54,7 @@ public async Task EnqueueMessageAsync(MessageQueueModel queueMessage) { queueLog.StringData = queueMessage.Data; } - _dbContext.MixQueueMessage.Add(queueLog); + _dbContext.QueueLog.Add(queueLog); await _dbContext.SaveChangesAsync(); } @@ -67,11 +70,11 @@ public async Task AckQueueMessage(MessageQueueModel ackQueueMessage) { try { - using (_dbContext = new()) + using (_dbContext = _databaseService.GetQueueLogDbContext()) { InitDbContext(); - var rootLog = await _dbContext.MixQueueMessage.FirstOrDefaultAsync(m => m.Id == ackQueueMessage.Id); + var rootLog = await _dbContext.QueueLog.FirstOrDefaultAsync(m => m.Id == ackQueueMessage.Id); if (rootLog != null) { var subs = rootLog.Subscriptions.FirstOrDefault(m => @@ -86,7 +89,7 @@ public async Task AckQueueMessage(MessageQueueModel ackQueueMessage) rootLog.State = MixQueueMessageLogState.ACK; } rootLog.LastModified = DateTime.UtcNow; - _dbContext.MixQueueMessage.Update(rootLog); + _dbContext.QueueLog.Update(rootLog); await _dbContext.SaveChangesAsync(); } } @@ -101,11 +104,11 @@ public async Task FailedQueueMessage(MessageQueueModel log) { try { - using (_dbContext = new()) + using (_dbContext = _databaseService.GetQueueLogDbContext()) { InitDbContext(); - var rootLog = await _dbContext.MixQueueMessage.FirstOrDefaultAsync(m => m.Id == log.Id); + var rootLog = await _dbContext.QueueLog.FirstOrDefaultAsync(m => m.Id == log.Id); if (rootLog != null) { var subs = rootLog.Subscriptions.FirstOrDefault(m => m.Value("id") == log.Sender) as JObject; @@ -117,7 +120,7 @@ public async Task FailedQueueMessage(MessageQueueModel log) rootLog.State = MixQueueMessageLogState.FAILED; } rootLog.LastModified = DateTime.UtcNow; - _dbContext.MixQueueMessage.Update(rootLog); + _dbContext.QueueLog.Update(rootLog); await _dbContext.SaveChangesAsync(); } } @@ -132,11 +135,11 @@ public async Task DeadLetterMessageAsync(MessageQueueModel deadLetterQueueMessag { try { - using (_dbContext = new()) + using (_dbContext = _databaseService.GetQueueLogDbContext()) { InitDbContext(); - var rootLog = await _dbContext.MixQueueMessage.FirstOrDefaultAsync(m => m.Id == deadLetterQueueMessage.Id); + var rootLog = await _dbContext.QueueLog.FirstOrDefaultAsync(m => m.Id == deadLetterQueueMessage.Id); if (rootLog != null) { var subs = rootLog.Subscriptions.FirstOrDefault(m => m.Value("id") == deadLetterQueueMessage.Sender); @@ -147,7 +150,7 @@ public async Task DeadLetterMessageAsync(MessageQueueModel deadLetterQueueMessag } rootLog.State = MixQueueMessageLogState.DEADLETTER; rootLog.LastModified = DateTime.UtcNow; - _dbContext.MixQueueMessage.Update(rootLog); + _dbContext.QueueLog.Update(rootLog); await _dbContext.SaveChangesAsync(); } } diff --git a/src/platform/mix.log/Subscribers/MixLogSubscriber.cs b/src/platform/mix.log/Subscribers/MixLogSubscriber.cs index f3d49e6af..fae956f87 100644 --- a/src/platform/mix.log/Subscribers/MixLogSubscriber.cs +++ b/src/platform/mix.log/Subscribers/MixLogSubscriber.cs @@ -1,24 +1,17 @@ using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.ObjectPool; using Mix.Constant.Constants; -using Mix.Constant.Enums; -using Mix.Database.Entities.Queue; -using Mix.Heart.Enums; -using Mix.Heart.Extensions; -using Mix.Heart.Helpers; using Mix.Log.Lib.Commands; using Mix.Log.Lib.Interfaces; -using Mix.Log.Lib.Models; using Mix.Mq.Lib.Models; using Mix.Queue.Engines; -using Mix.Queue.Engines.MixQueue; using Mix.Queue.Interfaces; using Mix.Service.Services; using Mix.SignalR.Enums; using Mix.SignalR.Interfaces; using Mix.SignalR.Models; -using Newtonsoft.Json.Linq; namespace Mix.Log.Lib.Subscribers { @@ -55,7 +48,7 @@ public MixLogSubscriber( public override Task StartAsync(CancellationToken cancellationToken = default) { base.StartAsync(cancellationToken); - + return Task.Run(async () => { while (_portalHub.Connection == null || _portalHub.Connection.State != Microsoft.AspNetCore.SignalR.Client.HubConnectionState.Connected) @@ -65,72 +58,80 @@ public override Task StartAsync(CancellationToken cancellationToken = default) await Task.Delay(5000); await _portalHub.StartConnection(); } - catch(Exception ex) + catch (Exception ex) { - _logger.LogError(GetType().Name, ex); + Logger.LogError(GetType().Name, ex); } } }); } - public override async Task Handler(MessageQueueModel model) + public override async Task Handler(MessageQueueModel model, CancellationToken cancellationToken) { if (!allowActions.Contains(model.Action)) { return; } - - switch (model.Action) + try { - case MixQueueActions.AuditLog: - var auditLogCmd = model.ParseData(); - if (auditLogCmd != null) - { - await _auditLogService.SaveRequestAsync(auditLogCmd.Request); - } - break; - case MixQueueActions.EnqueueLog: - var queueMessage = model.ParseData(); + switch (model.Action) + { + case MixQueueActions.AuditLog: + var auditLogCmd = model.ParseData(); + if (auditLogCmd != null) + { + await _auditLogService.SaveRequestAsync(auditLogCmd.Request); + } + break; - if (queueMessage != null) - { - await _queueMessageLogService.EnqueueMessageAsync(queueMessage); - } - break; - case MixQueueActions.AckLog: - var ackQueueMessage = model.ParseData(); + case MixQueueActions.EnqueueLog: + var queueMessage = model.ParseData(); - if (ackQueueMessage != null) - { - ackQueueMessage.Sender = model.Sender; - await _queueMessageLogService.AckQueueMessage(ackQueueMessage); - } - break; + if (queueMessage != null) + { + await _queueMessageLogService.EnqueueMessageAsync(queueMessage); + } + break; + case MixQueueActions.AckLog: + var ackQueueMessage = model.ParseData(); - case MixQueueActions.ExceptionLog: - var ex = model.ParseData(); - await MixLogService.LogExceptionAsync(ex); - break; + if (ackQueueMessage != null) + { + ackQueueMessage.Sender = model.Sender; + await _queueMessageLogService.AckQueueMessage(ackQueueMessage); + } + break; - case MixQueueActions.QueueFailed: - var queueEx = model.ParseData(); - if (queueEx != null) - { - queueEx.Sender = model.Sender; - await _queueMessageLogService.FailedQueueMessage(queueEx); - } - break; + case MixQueueActions.ExceptionLog: + var ex = model.ParseData(); + await MixLogService.LogExceptionAsync(ex); + break; - case MixQueueActions.DeadLetter: - var deadLetterMsg = model.ParseData(); + case MixQueueActions.QueueFailed: + var queueEx = model.ParseData(); + if (queueEx != null) + { + queueEx.Sender = model.Sender; + await _queueMessageLogService.FailedQueueMessage(queueEx); + } + break; - if (deadLetterMsg != null) - { - deadLetterMsg.Sender = model.Sender; - - await _queueMessageLogService.DeadLetterMessageAsync(deadLetterMsg); - } - break; + case MixQueueActions.DeadLetter: + var deadLetterMsg = model.ParseData(); + + if (deadLetterMsg != null) + { + deadLetterMsg.Sender = model.Sender; + + await _queueMessageLogService.DeadLetterMessageAsync(deadLetterMsg); + } + break; + } + } + catch (Exception ex) + { + await MixLogService.LogExceptionAsync(ex); + await SendMessage(model.Action, false, ex); } } diff --git a/src/platform/mix.log/ViewModels/MixQueueMessageLogViewModel.cs b/src/platform/mix.log/ViewModels/MixQueueMessageLogViewModel.cs index 5b3bdd86a..cee7456cd 100644 --- a/src/platform/mix.log/ViewModels/MixQueueMessageLogViewModel.cs +++ b/src/platform/mix.log/ViewModels/MixQueueMessageLogViewModel.cs @@ -1,5 +1,5 @@ using Mix.Constant.Enums; -using Mix.Database.Entities.Queue; +using Mix.Database.Entities.QueueLog; using Mix.Heart.UnitOfWork; using Mix.Heart.ViewModel; using Newtonsoft.Json.Linq; @@ -7,7 +7,7 @@ namespace Mix.Log.Lib.ViewModels { public sealed class MixQueueMessageLogViewModel - : ViewModelBase + : ViewModelBase { #region Properties public Guid? QueueMessageId { get; set; } @@ -31,7 +31,7 @@ public MixQueueMessageLogViewModel() { } - public MixQueueMessageLogViewModel(MixQueueMessageLog entity, UnitOfWorkInfo? uowInfo) + public MixQueueMessageLogViewModel(QueueLog entity, UnitOfWorkInfo? uowInfo) : base(entity, uowInfo) { } diff --git a/src/platform/mix.mixdb/Services/RuntimeDbContextService.cs b/src/platform/mix.mixdb/Services/RuntimeDbContextService.cs index 8019d2684..ea5cc269b 100644 --- a/src/platform/mix.mixdb/Services/RuntimeDbContextService.cs +++ b/src/platform/mix.mixdb/Services/RuntimeDbContextService.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Http; +using Castle.Components.DictionaryAdapter.Xml; +using Microsoft.AspNetCore.Http; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.EntityFrameworkCore; @@ -18,6 +19,7 @@ using Mix.Database.Entities.Cms; using Mix.Database.Services; using Mix.Heart.Enums; +using Mix.Heart.Models; using Mix.Service.Services; using Npgsql.EntityFrameworkCore.PostgreSQL.Diagnostics.Internal; using Npgsql.EntityFrameworkCore.PostgreSQL.Scaffolding.Internal; @@ -42,23 +44,22 @@ public RuntimeDbContextService(IHttpContextAccessor httpContextAccessor, Databas { _httpContextAccessor = httpContextAccessor; _databaseService = databaseService; - LoadDbContextAssembly(); } - public void Reload() + public void Reload(string cnnString) { _assemblyLoadContext.Unload(); - LoadDbContextAssembly(); + LoadDbContextAssembly(cnnString); } #region Create Dynamic Context - public void LoadDbContextAssembly() + public void LoadDbContextAssembly(string cnnString) { - if (!string.IsNullOrEmpty(_databaseService.GetConnectionString(MixConstants.CONST_MIXDB_CONNECTION))) + if (!string.IsNullOrEmpty(cnnString)) { - var sourceFiles = CreateDynamicDbContext(); + var sourceFiles = CreateDynamicDbContext(cnnString); using var peStream = new MemoryStream(); var enableLazyLoading = false; var result = GenerateCode(sourceFiles, enableLazyLoading).Emit(peStream); @@ -80,13 +81,13 @@ public void LoadDbContextAssembly() } } - public DbContext? GetMixDatabaseDbContext() + public DbContext? GetMixDatabaseDbContext(string cnnString) { - if (!string.IsNullOrEmpty(_databaseService.GetConnectionString(MixConstants.CONST_MIXDB_CONNECTION))) + if (!string.IsNullOrEmpty(cnnString)) { if (_assembly == null) { - LoadDbContextAssembly(); + LoadDbContextAssembly(cnnString); } if (_assembly != null) { @@ -102,9 +103,9 @@ public void LoadDbContextAssembly() return default; } - public List CreateDynamicDbContext() + public List CreateDynamicDbContext(string cnnString) { - var sourceFiles = new List(); + var sourceFiles = new List(); using var _cmsContext = new MixCmsContext(_databaseService); var scaffolder = CreateScaffolder(); var databaseNames = _cmsContext.MixDatabase.Select(m => m.SystemName.ToLower()).ToList(); @@ -126,11 +127,12 @@ public List CreateDynamicDbContext() ContextName = "DataContext", ContextNamespace = "TypedDataContext.Context", //ModelNamespace = "TypedDataContext.Models", - SuppressConnectionStringWarning = true + SuppressConnectionStringWarning = true, + }; var scaffoldedModelSources = scaffolder.ScaffoldModel( - _databaseService.GetConnectionString(MixConstants.CONST_MIXDB_CONNECTION), + cnnString, dbOpts, modelOpts, codeGenOpts); @@ -142,13 +144,21 @@ public List CreateDynamicDbContext() { ReplaceEntityNaming(item, ref contextFileCode); } - sourceFiles.Add(item.Code); + sourceFiles.Add(new FileModel() + { + Filename = item.Path, + Content = item.Code + }); } if (_databaseService.DatabaseProvider == MixDatabaseProvider.PostgreSQL) { contextFileCode = $"using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;{contextFileCode}"; } - sourceFiles.Add(contextFileCode); + sourceFiles.Add(new FileModel() + { + Filename = scaffoldedModelSources.ContextFile.Path, + Content = contextFileCode + }); return sourceFiles; } @@ -256,11 +266,11 @@ List CompilationReferences(bool enableLazyLoading) return refs; } - public CSharpCompilation GenerateCode(List sourceFiles, bool enableLazyLoading) + public CSharpCompilation GenerateCode(List sourceFiles, bool enableLazyLoading) { var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp11); - var parsedSyntaxTrees = sourceFiles.Select(f => SyntaxFactory.ParseSyntaxTree(f, options)); + var parsedSyntaxTrees = sourceFiles.Select(f => SyntaxFactory.ParseSyntaxTree(f.Content, options)); return CSharpCompilation.Create($"DataContext.dll", parsedSyntaxTrees, diff --git a/src/platform/mix.mixdb/ViewModels/MixPermissionViewModel.cs b/src/platform/mix.mixdb/ViewModels/MixPermissionViewModel.cs index 69b3056e1..975e579fb 100644 --- a/src/platform/mix.mixdb/ViewModels/MixPermissionViewModel.cs +++ b/src/platform/mix.mixdb/ViewModels/MixPermissionViewModel.cs @@ -6,10 +6,10 @@ namespace Mix.Mixdb.ViewModels public class MixPermissionViewModel : ViewModelBase { #region Properties - public string Title { get; set; } - public string Type { get; set; } - public string Icon { get; set; } public int MixTenantId { get; set; } + public string DisplayName { get; set; } + public string Group { get; set; } + public string Key { get; set; } public Metadata? Metadata { get; set; } public List Endpoints { get; set; } #endregion diff --git a/src/platform/mix.mixdb/mix.mixdb.csproj b/src/platform/mix.mixdb/mix.mixdb.csproj index 865937440..76df21c3a 100644 --- a/src/platform/mix.mixdb/mix.mixdb.csproj +++ b/src/platform/mix.mixdb/mix.mixdb.csproj @@ -8,12 +8,12 @@ - - + + all - - + + diff --git a/src/platform/mix.quartz/mix.quartz.csproj b/src/platform/mix.quartz/mix.quartz.csproj index 84c9610c4..8ab42f793 100644 --- a/src/platform/mix.quartz/mix.quartz.csproj +++ b/src/platform/mix.quartz/mix.quartz.csproj @@ -6,11 +6,11 @@ - - - - - + + + + + diff --git a/src/platform/mix.queue/Engines/Mix/MixQueueSubscriber.cs b/src/platform/mix.queue/Engines/Mix/MixQueueSubscriber.cs index 71555befd..53650f45b 100644 --- a/src/platform/mix.queue/Engines/Mix/MixQueueSubscriber.cs +++ b/src/platform/mix.queue/Engines/Mix/MixQueueSubscriber.cs @@ -118,7 +118,7 @@ private void AckQueueMessage(T model) TopicId = MixQueueTopics.MixLog, Action = MixQueueActions.AckLog, Sender = _subscriptionId, - Data = ReflectionHelper.ParseObject(model).ToString(), + Data = ReflectionHelper.ParseObject(model).ToString(Newtonsoft.Json.Formatting.None), TenantId = 1, CreatedDate = DateTime.UtcNow }); diff --git a/src/platform/mix.queue/Engines/PublisherBase.cs b/src/platform/mix.queue/Engines/PublisherBase.cs index 3a0ccda21..90913666b 100644 --- a/src/platform/mix.queue/Engines/PublisherBase.cs +++ b/src/platform/mix.queue/Engines/PublisherBase.cs @@ -4,7 +4,6 @@ using Microsoft.Extensions.ObjectPool; using Mix.Heart.Exceptions; using Mix.Mq.Lib.Models; -using Mix.Queue.Engines.MixQueue; using Mix.Queue.Interfaces; using Mix.Queue.Models.QueueSetting; using Mix.Shared.Services; @@ -19,15 +18,17 @@ namespace Mix.Queue.Engines { public abstract class PublisherBase : BackgroundService { - protected readonly IMemoryQueueService _queueService; - protected List> _publishers; - protected readonly IConfiguration _configuration; - protected readonly MixEndpointService _mixEndpointService; + protected MixQueueProvider Provider; protected const int MaxConsumeLength = 100; protected readonly string _topicId; - protected MixQueueProvider _provider; - protected ILogger _logger; - protected readonly IPooledObjectPolicy _rabbitMqObjectPolicy; + protected List> Publishers; + + protected readonly IMemoryQueueService QueueService; + protected readonly IConfiguration Configuration; + protected readonly MixEndpointService MixEndpointService; + protected readonly ILogger ILogger; + protected readonly IPooledObjectPolicy RabbitMqObjectPolicy; + protected PublisherBase( string topicId, IMemoryQueueService queueService, @@ -36,12 +37,12 @@ protected PublisherBase( ILogger logger, IPooledObjectPolicy rabbitMqObjectPolicy) { - _queueService = queueService; - _configuration = configuration; _topicId = topicId; - _mixEndpointService = mixEndpointService; - _logger = logger; - _rabbitMqObjectPolicy = rabbitMqObjectPolicy; + ILogger = logger; + QueueService = queueService; + Configuration = configuration; + MixEndpointService = mixEndpointService; + RabbitMqObjectPolicy = rabbitMqObjectPolicy; } protected List> CreatePublisher( @@ -50,49 +51,49 @@ protected List> CreatePublisher( try { var queuePublishers = new List>(); - var providerSetting = _configuration["MessageQueueSetting:Provider"]; + var providerSetting = Configuration["MessageQueueSetting:Provider"]; if (string.IsNullOrEmpty(providerSetting)) { return default; } - _provider = Enum.Parse(providerSetting); + Provider = Enum.Parse(providerSetting); - switch (_provider) + switch (Provider) { case MixQueueProvider.AZURE: - var azureSettingPath = _configuration.GetSection("MessageQueueSetting:AzureServiceBus"); + var azureSettingPath = Configuration.GetSection("MessageQueueSetting:AzureServiceBus"); var azureSetting = new AzureQueueSetting(); azureSettingPath.Bind(azureSetting); queuePublishers.Add( QueueEngineFactory.CreatePublisher( - _provider, azureSetting, topicId, _mixEndpointService)); + Provider, azureSetting, topicId, MixEndpointService)); break; case MixQueueProvider.GOOGLE: - var googleSettingPath = _configuration.GetSection("MessageQueueSetting:GoogleQueueSetting"); + var googleSettingPath = Configuration.GetSection("MessageQueueSetting:GoogleQueueSetting"); var googleSetting = new GoogleQueueSetting(); googleSettingPath.Bind(googleSetting); googleSetting.CredentialFile = googleSetting.CredentialFile; queuePublishers.Add( QueueEngineFactory.CreatePublisher( - _provider, googleSetting, topicId, _mixEndpointService)); + Provider, googleSetting, topicId, MixEndpointService)); break; case MixQueueProvider.RABBITMQ: queuePublishers.Add( - QueueEngineFactory.CreateRabbitMqPublisher(_rabbitMqObjectPolicy, topicId)); + QueueEngineFactory.CreateRabbitMqPublisher(RabbitMqObjectPolicy, topicId)); break; case MixQueueProvider.MIX: - if (_mixEndpointService.MixMq != null) + if (MixEndpointService.MixMq != null) { - var mixSettingPath = _configuration.GetSection("MessageQueueSetting:Mix"); + var mixSettingPath = Configuration.GetSection("MessageQueueSetting:Mix"); var mixSetting = new MixQueueSetting(); mixSettingPath.Bind(mixSetting); queuePublishers.Add( - QueueEngineFactory.CreatePublisher(_provider, mixSetting, topicId, _mixEndpointService)); + QueueEngineFactory.CreatePublisher(Provider, mixSetting, topicId, MixEndpointService)); } break; } @@ -105,50 +106,42 @@ protected List> CreatePublisher( } } - protected virtual Task StartMixQueueEngine(CancellationToken cancellationToken = default) + protected virtual async Task StartMixQueueEngine(CancellationToken cancellationToken = default) { - return Task.Run(async () => + while (!cancellationToken.IsCancellationRequested) { - bool isProcessing = false; - while (!cancellationToken.IsCancellationRequested) + // Get messages from IQueueService + var inQueueItems = QueueService.ConsumeMemoryQueue(MaxConsumeLength, _topicId); + if (inQueueItems.Any() && Publishers != null) { - if (!isProcessing) + foreach (var publisher in Publishers) { - isProcessing = true; - // Get messages from IQueueService - var inQueueItems = _queueService.ConsumeMemoryQueue(MaxConsumeLength, _topicId); - - if (inQueueItems.Any() && _publishers != null) + // Publish messages to current Message Queue Provider + // If cannot send msg, try to wait 1s then retry + bool publishing = true; + while (publishing) { - foreach (var publisher in _publishers) + try { - // Publish messages to current Message Queue Provider - // If cannot send msg, try to wait 1s then retry - bool publishing = true; - while (publishing) - { - try - { - await publisher.SendMessages(inQueueItems); - publishing = false; - } - catch (Exception ex) { - _logger.LogError(ex, $"{_logger.GetType().FullName}: Cannot Send message to queue"); - await Task.Delay(1000, cancellationToken); - } - } + await publisher.SendMessages(inQueueItems); + publishing = false; + } + catch (Exception ex) + { + ILogger.LogError(ex, "{FullName}: Cannot Send message to queue", ILogger.GetType().FullName); + await Task.Delay(1000, cancellationToken); } } - isProcessing = false; } - await Task.Delay(1000, cancellationToken); } - }, cancellationToken); + + await Task.Delay(50, cancellationToken); + } } protected override Task ExecuteAsync(CancellationToken stoppingToken) { - _publishers = CreatePublisher(_topicId); + Publishers = CreatePublisher(_topicId); return StartMixQueueEngine(stoppingToken); } } diff --git a/src/platform/mix.queue/Engines/RabitMq/RabbitModelPooledObjectPolicy.cs b/src/platform/mix.queue/Engines/RabitMq/RabbitModelPooledObjectPolicy.cs index bca6397b2..e8fc77741 100644 --- a/src/platform/mix.queue/Engines/RabitMq/RabbitModelPooledObjectPolicy.cs +++ b/src/platform/mix.queue/Engines/RabitMq/RabbitModelPooledObjectPolicy.cs @@ -29,7 +29,7 @@ private IConnection GetConnection() factory.Port = _options.Port.Value; } - if (!string.IsNullOrEmpty(_options.UserName) && !string.IsNullOrEmpty(_options.UserName)) + if (!string.IsNullOrEmpty(_options.UserName) && !string.IsNullOrEmpty(_options.Password)) { factory.UserName = _options.UserName; factory.Password = _options.Password; diff --git a/src/platform/mix.queue/Engines/RabitMq/RabitMQSubscriber.cs b/src/platform/mix.queue/Engines/RabitMq/RabitMQSubscriber.cs index 8d37b8359..9aa21f31e 100644 --- a/src/platform/mix.queue/Engines/RabitMq/RabitMQSubscriber.cs +++ b/src/platform/mix.queue/Engines/RabitMq/RabitMQSubscriber.cs @@ -1,9 +1,11 @@ using Google.Cloud.PubSub.V1; using Microsoft.Extensions.ObjectPool; +using Mix.Heart.Extensions; using Mix.Mq.Lib.Models; using Mix.Queue.Interfaces; using Mix.Queue.Models.QueueSetting; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; @@ -55,10 +57,22 @@ private void InitializeQueue(IPooledObjectPolicy objectPolicy, string to _consumer.Received += (ch, ea) => { // received message - string body = System.Text.Encoding.UTF8.GetString(ea.Body.ToArray()); - var msg = JsonConvert.DeserializeObject(body); - _messageHandler(msg); - _channel.BasicAck(ea.DeliveryTag, false); + try + { + string body = System.Text.Encoding.UTF8.GetString(ea.Body.ToArray()); + if (body.IsJsonString()) + { + var msg = JObject.Parse(body).ToObject(); + _messageHandler(msg); + _channel.BasicAck(ea.DeliveryTag, false); + } + } + catch (Exception ex) + { + Console.Error.WriteLine($"Cannot process message {subscriptionId}"); + Console.Error.WriteLine(ex); + _channel.BasicNack(ea.DeliveryTag, false, false); + } }; _channel.BasicConsume(queueResult.QueueName, false, _consumer); } diff --git a/src/platform/mix.queue/Engines/RabitMq/RabitMqPublisher.cs b/src/platform/mix.queue/Engines/RabitMq/RabitMqPublisher.cs index 87a095ece..1aba166bd 100644 --- a/src/platform/mix.queue/Engines/RabitMq/RabitMqPublisher.cs +++ b/src/platform/mix.queue/Engines/RabitMq/RabitMqPublisher.cs @@ -13,11 +13,12 @@ namespace Mix.Queue.Engines.RabitMQ { - public class RabitMQPublisher : IQueuePublisher + public class RabitMQPublisher : IQueuePublisher where T : MessageQueueModel { private DefaultObjectPool _objectPool; - private string _topicId; + private readonly string _topicId; + public RabitMQPublisher(IPooledObjectPolicy objectPolicy, string topicId) { _topicId = topicId; @@ -39,10 +40,12 @@ public Task SendMessage(T message) var properties = channel.CreateBasicProperties(); properties.Persistent = true; - channel.BasicPublish(exchange: _topicId, - routingKey: $"{_topicId}", - basicProperties: properties, - body: sendBytes); + channel.BasicPublish( + exchange: _topicId, + routingKey: $"{_topicId}", + basicProperties: properties, + body: sendBytes); + return Task.CompletedTask; } catch @@ -57,7 +60,7 @@ public Task SendMessage(T message) public Task SendMessages(IList messages) { - List tasks = new List(); + List tasks = []; foreach (var item in messages) { tasks.Add(SendMessage(item)); diff --git a/src/platform/mix.queue/Engines/SubscriberBase.cs b/src/platform/mix.queue/Engines/SubscriberBase.cs index b90fa8e35..81175bcbf 100644 --- a/src/platform/mix.queue/Engines/SubscriberBase.cs +++ b/src/platform/mix.queue/Engines/SubscriberBase.cs @@ -1,13 +1,8 @@ -using Azure.Core; -using Google.Api; -using Google.Apis.Logging; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.ObjectPool; -using Mix.Heart.Enums; using Mix.Heart.Exceptions; using Mix.Heart.Helpers; using Mix.Heart.Services; @@ -16,9 +11,8 @@ using Mix.Queue.Engines.RabitMQ; using Mix.Queue.Interfaces; using Mix.Queue.Models.QueueSetting; -using Mix.Queue.Services; -using Mix.Shared.Helpers; using Mix.Shared.Services; +using RabbitMQ.Client; using System; using System.Threading; using System.Threading.Tasks; @@ -36,8 +30,8 @@ public abstract class SubscriberBase : BackgroundService protected MixCacheService CacheService; protected readonly IServiceProvider ServicesProvider; protected IServiceScope ServiceScope { get; set; } - protected ILogger _logger { get; set; } - private readonly IPooledObjectPolicy _rabbitMqObjectPolicy; + protected ILogger Logger { get; set; } + private readonly IPooledObjectPolicy _rabbitMqObjectPolicy; protected SubscriberBase( string topicId, @@ -47,7 +41,7 @@ protected SubscriberBase( IConfiguration configuration, IMemoryQueueService queueService, ILogger logger, - IPooledObjectPolicy rabbitMqObjectPolicy) + IPooledObjectPolicy rabbitMqObjectPolicy) { _timeout = timeout; _configuration = configuration; @@ -55,7 +49,7 @@ protected SubscriberBase( _moduleName = moduleName; _memQueueService = queueService; ServicesProvider = servicesProvider; - _logger = logger; + Logger = logger; _rabbitMqObjectPolicy = rabbitMqObjectPolicy; } protected async override Task ExecuteAsync(CancellationToken cancellationToken) @@ -73,14 +67,14 @@ public virtual async Task StopAsync(CancellationToken cancellationToken) Console.Error.WriteLine($"{_subscriber.SubscriptionId} stopped at {DateTime.UtcNow}"); if (_subscriber is MixQueueSubscriber) { - await (_subscriber as MixQueueSubscriber).Disconnect(); + await (_subscriber as MixQueueSubscriber).Disconnect(cancellationToken); } } #region Privates private async Task StartProcessQueue(CancellationToken cancellationToken) { - _logger.LogInformation($"StartProcessQueue: {_subscriber.SubscriptionId} started at {DateTime.UtcNow.AddHours(7)}"); + Logger.LogInformation($"StartProcessQueue: {_subscriber.SubscriptionId} started at {DateTime.UtcNow.AddHours(7)}"); while (!cancellationToken.IsCancellationRequested) { try @@ -88,14 +82,8 @@ private async Task StartProcessQueue(CancellationToken cancellationToken) if (_subscriber != null) { - await _subscriber.ProcessQueue(cancellationToken); } - await Task.Delay(1000, cancellationToken); - if (_subscriber is MixQueueSubscriber) - { - await (_subscriber as MixQueueSubscriber).Disconnect(); - } } catch (Exception ex) { @@ -104,14 +92,19 @@ private async Task StartProcessQueue(CancellationToken cancellationToken) await (_subscriber as MixQueueSubscriber).Disconnect(); } - _logger.LogError($"StartProcessQueue: {_subscriber.SubscriptionId} is broken at {DateTime.UtcNow.AddHours(7)}, Trying to reconnect from client: {ex.Message}", ex); + Logger.LogError($"StartProcessQueue: {_subscriber.SubscriptionId} is broken at {DateTime.UtcNow.AddHours(7)}, Trying to reconnect from client: {ex.Message}", ex); await Task.Delay(2000, cancellationToken); - _subscriber = CreateSubscriber(_topicId, $"{_topicId}_{_moduleName}"); + _subscriber = CreateSubscriber(_topicId, _subscriber.SubscriptionId); await StartProcessQueue(cancellationToken); } } - _logger.LogInformation($"StartProcessQueue: {_subscriber.SubscriptionId} stopped at {DateTime.UtcNow.AddHours(7)}"); + await Task.Delay(1000, cancellationToken); + if (_subscriber is MixQueueSubscriber) + { + await (_subscriber as MixQueueSubscriber).Disconnect(); + } + Logger.LogInformation($"StartProcessQueue: {_subscriber.SubscriptionId} stopped at {DateTime.UtcNow.AddHours(7)}"); } private IQueueSubscriber CreateSubscriber(string topicId, string subscriptionId) @@ -142,7 +135,7 @@ private IQueueSubscriber CreateSubscriber(string topicId, string subscriptionId) return QueueEngineFactory.CreateSubscriber( provider, googleSetting, topicId, subscriptionId, MessageHandler, _memQueueService, mixEndpointService); case MixQueueProvider.RABBITMQ: - return QueueEngineFactory.CreateRabbitMQSubscriber(_rabbitMqObjectPolicy, topicId,subscriptionId, MessageHandler); + return QueueEngineFactory.CreateRabbitMQSubscriber(_rabbitMqObjectPolicy, topicId, subscriptionId, MessageHandler); case MixQueueProvider.MIX: if (string.IsNullOrEmpty(mixEndpointService.MixMq)) { @@ -170,30 +163,27 @@ private IQueueSubscriber CreateSubscriber(string topicId, string subscriptionId) return ServiceScope.ServiceProvider.GetRequiredService(); } - public async Task MessageHandler(MessageQueueModel data) + public virtual async Task MessageHandler(MessageQueueModel data) { try { - if (_topicId != data.TopicId) + using var timeoutCancellationSource = new CancellationTokenSource(TimeSpan.FromSeconds(_timeout)); { - return; - } - - if (Handler(data).Wait(TimeSpan.FromSeconds(_timeout))) - { - return; + if (_topicId != data.TopicId) + { + return; + } + await Handler(data, timeoutCancellationSource.Token); } - else - await HandleDeadLetter(data); } - catch (Exception ex) + catch (OperationCanceledException ex) { + await HandleDeadLetter(data); await HandleException(data, ex); } - finally + catch (Exception ex) { - ServiceScope?.Dispose(); - ServiceScope = null; + await HandleException(data, ex); } } @@ -203,7 +193,7 @@ public virtual Task HandleDeadLetter(MessageQueueModel message) { Action = MixQueueActions.DeadLetter, TopicId = MixQueueTopics.MixLog, - Data = ReflectionHelper.ParseObject(message).ToString(), + Data = ReflectionHelper.ParseObject(message).ToString(Newtonsoft.Json.Formatting.None), Success = false }); return Task.CompletedTask; @@ -217,14 +207,14 @@ public virtual Task HandleException(MessageQueueModel data, Exception ex) TopicId = MixQueueTopics.MixLog, Id = data.Id, Sender = _subscriber.SubscriptionId, - Data = ReflectionHelper.ParseObject(data).ToString(), - Exception = ex, + Data = ReflectionHelper.ParseObject(data).ToString(Newtonsoft.Json.Formatting.None), + //Exception = ex, Success = false }); return Task.CompletedTask; } - public abstract Task Handler(MessageQueueModel model); + public abstract Task Handler(MessageQueueModel model, CancellationToken cancellationToken); #endregion } } diff --git a/src/platform/mix.queue/Services/MemoryQueueService.cs b/src/platform/mix.queue/Services/MemoryQueueService.cs index 95a5e5300..21701a420 100644 --- a/src/platform/mix.queue/Services/MemoryQueueService.cs +++ b/src/platform/mix.queue/Services/MemoryQueueService.cs @@ -77,7 +77,6 @@ public void PushMemoryQueue(MessageQueueModel model) queue.Enqueue(model); EnqueueLog(model); } - } public void PushMemoryQueue(int tenantId, string topicId, string action, object data) @@ -110,7 +109,7 @@ private void EnqueueLog(MessageQueueModel model) { TopicId = MixQueueTopics.MixLog, Action = MixQueueActions.EnqueueLog, - Data = ReflectionHelper.ParseObject(model).ToString(), + Data = ReflectionHelper.ParseObject(model).ToString(Newtonsoft.Json.Formatting.None), TenantId = 1, CreatedDate = DateTime.UtcNow }); diff --git a/src/platform/mix.queue/mix.queue.csproj b/src/platform/mix.queue/mix.queue.csproj index 2490ac833..ca0e6d259 100644 --- a/src/platform/mix.queue/mix.queue.csproj +++ b/src/platform/mix.queue/mix.queue.csproj @@ -15,16 +15,15 @@ - + - - - - - - - - + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/platform/mix.repodb/Dtos/AlterColumnDto.cs b/src/platform/mix.repodb/Dtos/AlterColumnDto.cs index c073f6834..4bccc7035 100644 --- a/src/platform/mix.repodb/Dtos/AlterColumnDto.cs +++ b/src/platform/mix.repodb/Dtos/AlterColumnDto.cs @@ -6,6 +6,7 @@ namespace Mix.RepoDb.Dtos { public class AlterColumnDto { + public bool IsDrop { get; set; } public string SystemName { get; set; } public string DisplayName { get; set; } public string MixDatabaseName { get; set; } diff --git a/src/platform/mix.repodb/Helpers/MixDbHelper.cs b/src/platform/mix.repodb/Helpers/MixDbHelper.cs index 6ddd7c14a..23f0b797e 100644 --- a/src/platform/mix.repodb/Helpers/MixDbHelper.cs +++ b/src/platform/mix.repodb/Helpers/MixDbHelper.cs @@ -14,7 +14,24 @@ namespace Mix.RepoDb.Helpers { public class MixDbHelper { - public static Task ParseDtoToEntityAsync(JObject dto, List columns, FieldNameService fieldNameService, int? tenantId = null, string? username = null) + public static Task ParseDynamicToEntityAsync(dynamic dto, MixDatabaseType mixdbType, List columns, FieldNameService fieldNameService, int? tenantId = null, string? username = null) + { + try + { + JObject result = JObject.FromObject(dto); + return ParseDtoToEntityAsync(result, mixdbType, columns, fieldNameService, tenantId, username); + } + catch (MixException) + { + throw; + } + catch (Exception ex) + { + throw new MixException(MixErrorStatus.Badrequest, ex); + } + } + + public static Task ParseDtoToEntityAsync(JObject dto, MixDatabaseType mixdbType, List columns, FieldNameService fieldNameService, int? tenantId = null, string? username = null) { try { @@ -25,7 +42,7 @@ public static Task ParseDtoToEntityAsync(JObject dto, List c.SystemName.Equals(colName, StringComparison.InvariantCultureIgnoreCase)); if (encryptedColumnNames.Contains(colName)) @@ -39,7 +56,7 @@ public static Task ParseDtoToEntityAsync(JObject dto, List ParseDtoToEntityAsync(JObject dto, List ParseDtoToEntityAsync(JObject dto, List ParseDtoToEntityAsync(JObject dto, List ParseImportDtoToEntityAsync(JObject dto, List(); + case MixDataType.Json: + case MixDataType.ArrayRadio: + return value.Type != JTokenType.String + ? JObject.FromObject(value).ToString(Formatting.None) + : value.Value(); ; + case MixDataType.Integer: + case MixDataType.Reference: + return int.Parse(strValue); + case MixDataType.Double: + return double.Parse(strValue); + case MixDataType.Guid: + Guid.TryParse(value.ToString(), out var guildResult); + return guildResult; + default: + return value.ToString(); + + } } } + catch (Exception ex) + { + throw new MixException(MixErrorStatus.Badrequest, ex); + } + return null; + } + public static object? ParseObjectValue(MixDataType? dataType, string strValue) + { + try + { + if (strValue != null) + { + switch (dataType) + { + case MixDataType.Date: + case MixDataType.DateTime: + return DateTime.Parse(strValue).ToUniversalTime(); + case MixDataType.Boolean: + return bool.Parse(strValue); + case MixDataType.Integer: + case MixDataType.Reference: + return int.Parse(strValue); + case MixDataType.Double: + return double.Parse(strValue); + case MixDataType.Guid: + Guid.TryParse(strValue, out var guildResult); + return guildResult; + case MixDataType.Array: + case MixDataType.ArrayMedia: + case MixDataType.Json: + case MixDataType.ArrayRadio: + default: + return strValue; + + } + } + } + catch (Exception ex) + { + throw new MixException(MixErrorStatus.Badrequest, ex); + } return null; } } diff --git a/src/platform/mix.repodb/Interfaces/IMixDbDataService.cs b/src/platform/mix.repodb/Interfaces/IMixDbDataService.cs index 72dae5ef2..db14107e2 100644 --- a/src/platform/mix.repodb/Interfaces/IMixDbDataService.cs +++ b/src/platform/mix.repodb/Interfaces/IMixDbDataService.cs @@ -3,6 +3,8 @@ using Mix.Heart.Models; using Mix.Heart.UnitOfWork; using Mix.RepoDb.Dtos; +using Mix.RepoDb.ViewModels; +using Mix.Service.Services; using Mix.Shared.Dtos; using Newtonsoft.Json.Linq; using RepoDb; @@ -11,24 +13,25 @@ namespace Mix.RepoDb.Interfaces { public interface IMixDbDataService : IDisposable { - public Task GetSingleByParent(string tableName, MixContentType parentType, int parentId, bool loadNestedData = false); + public Task GetSingleByParent(string tableName, MixContentType parentType, object parentId, bool loadNestedData = false); public Task> GetMyData(string tableName, SearchMixDbRequestDto req, string username); - public Task GetMyDataById(string tableName, string username, int id, bool loadNestedData); + public Task GetMyDataById(string tableName, string username, object id, bool loadNestedData); - public Task GetById(string tableName, int id, bool loadNestedData); + public Task GetById(string tableName, object id, bool loadNestedData); public Task GetSingleBy(string tableName, List queries); - public Task CreateData(string tableName, JObject data); + public Task CreateData(string tableName, JObject data); public Task UpdateData(string tableName, JObject data); - public Task DeleteData(string tableName, int id); + public Task DeleteData(string tableName, object id); void SetUOW(UnitOfWorkInfo uow); Task ParseDataAsync(string tableName, dynamic obj); Task GetSingleByGuidParent(string tableName, MixContentType parentType, Guid parentId, bool loadNestedData = false); - Task CreateDataRelationship(CreateDataRelationshipDto dto, CancellationToken cancellationToken); - Task DeleteDataRelationship(string relTableName, int id, CancellationToken cancellationToken); + Task CreateDataRelationship(CreateDataRelationshipDto dto, CancellationToken cancellationToken); + Task DeleteDataRelationship(string relTableName, object id, CancellationToken cancellationToken); Task> ParseListDataAsync(string tableName, List objs); + Task> LoadNestedData(RepoDbMixDatabaseViewModel database, FieldNameService fieldNameService, object parentId); } } diff --git a/src/platform/mix.repodb/Repositories/MixRepoDbRepository.cs b/src/platform/mix.repodb/Repositories/MixRepoDbRepository.cs index 2c2f6a7ed..083ee82b6 100644 --- a/src/platform/mix.repodb/Repositories/MixRepoDbRepository.cs +++ b/src/platform/mix.repodb/Repositories/MixRepoDbRepository.cs @@ -24,7 +24,9 @@ using Npgsql; using RepoDb; using RepoDb.Enumerations; +using RepoDb.Extensions; using RepoDb.Interfaces; +using RepoDb.StatementBuilders; using System.Data; using System.Reflection.Metadata; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; @@ -47,7 +49,7 @@ public class MixRepoDbRepository : IDisposable private bool _isRoot = true; #endregion - public MixRepoDbRepository(ICache cache, DatabaseService databaseService, UnitOfWorkInfo cmsUow) + public MixRepoDbRepository(ICache cache, DatabaseService databaseService) { Cache = cache; _settings = new AppSetting() @@ -109,7 +111,7 @@ public Task ExecuteCommand(string commandSql) } } - public async Task> GetPagingAsync(IEnumerable searchQueryFields, PagingRequestModel pagingRequest, string? selectFieldNames = null) + public async Task> GetPagingAsync(IEnumerable searchQueryFields, PagingRequestModel pagingRequest, bool iLike, MixConjunction conjunction, string? selectFieldNames = null) { List? fields = null; if (!string.IsNullOrEmpty(selectFieldNames)) @@ -122,20 +124,25 @@ public async Task> GetPagingAsync(IEnumerable queries = ParseSearchQuery(searchQueryFields); - return await GetPagingAsync(queries, pagingRequest, fields); + return await GetPagingAsync(queries, pagingRequest, iLike, conjunction, fields); } - public async Task> GetPagingAsync(IEnumerable queryFields, PagingRequestModel pagingRequest, IEnumerable? selectFields = null) + public async Task> GetPagingAsync(IEnumerable queryFields, PagingRequestModel pagingRequest, bool iLike, MixConjunction conjunction, IEnumerable? selectFields = null) { List orderFields = new() { - new OrderField(pagingRequest.SortBy ?? "Id", pagingRequest.SortDirection == SortDirection.Asc ? Order.Ascending: Order.Descending) + new OrderField(pagingRequest.SortBy, pagingRequest.SortDirection == SortDirection.Asc ? Order.Ascending: Order.Descending) }; BeginTransaction(); - var count = (int)_connection.Count(_tableName, queryFields, transaction: _dbTransaction); + var builder = iLike && this.DatabaseProvider == MixDatabaseProvider.PostgreSQL ? new OptimizedPostgresSqlStatementBuilder() : _connection.GetStatementBuilder(); int pageSize = pagingRequest.PageSize ?? 100; - var data = await _connection.BatchQueryAsync(_tableName, pagingRequest.PageIndex, - pageSize, orderFields, queryFields, selectFields, null, commandTimeout: _settings.CommandTimeout, transaction: _dbTransaction); + + var countCommandText = builder.CreateCount(_tableName, new QueryGroup(queryFields, conjunction == MixConjunction.Or ? Conjunction.Or : Conjunction.And)); + var count = (long)await _connection.ExecuteScalarAsync(countCommandText, queryFields, transaction: _dbTransaction); + + var commandText = builder.CreateBatchQuery(_tableName, selectFields, pagingRequest.PageIndex, pageSize, orderFields, new QueryGroup(queryFields, conjunction == MixConjunction.Or ? Conjunction.Or : Conjunction.And)); + var data = await _connection.ExecuteQueryAsync(commandText, queryFields, transaction: _dbTransaction); + return new PagingResponseModel() { Items = data.ToList(), @@ -339,7 +346,7 @@ private Operation ParseMixOperator(SearchQueryField field) } } - public async Task InsertAsync(JObject obj, RepoDbMixDatabaseViewModel mixDb) + public async Task InsertAsync(JObject obj, RepoDbMixDatabaseViewModel mixDb) { try { @@ -347,13 +354,14 @@ public async Task InsertAsync(JObject obj, RepoDbMixDatabaseViewModel mixD Dictionary dicObj = ParseDictionary(obj, mixDb); var fields = dicObj!.Keys.Select(m => new Field(m)).ToList(); - var result = await _connection.InsertAsync( - _tableName, + var result = await _connection.InsertAsync( + mixDb.SystemName, entity: dicObj, fields: fields, commandTimeout: _settings.CommandTimeout, transaction: _dbTransaction, trace: _trace); + CompleteTransaction(); return result; } catch (Exception ex) @@ -383,11 +391,12 @@ public async Task InsertAsync(JObject obj, RepoDbMixDatabaseViewModel mixD dicObjs.Add(dicObj); } } + var fields = dicObjs[0].Keys.Select(m => new Field(m)).ToList(); BeginTransaction(); var result = await _connection.InsertAllAsync( - _tableName, + mixDb.SystemName, entities: dicObjs, fields: fields, commandTimeout: _settings.CommandTimeout, @@ -426,7 +435,47 @@ public async Task InsertAsync(JObject obj, RepoDbMixDatabaseViewModel mixD } } - public async Task UpdateAsync(int id, JObject entity, RepoDbMixDatabaseViewModel mixDb) + public async Task UpdateManyAsync(List entities, RepoDbMixDatabaseViewModel mixDb) + { + try + { + if (entities.Count == 0) + { + return default; + } + + List> dicObjs = new(); + + foreach (var entity in entities) + { + var dicObj = ParseDictionary(entity, mixDb); + if (dicObj != null) + { + dicObjs.Add(dicObj); + } + } + + var fields = dicObjs[0].Keys.Select(m => new Field(m)).ToList(); + + BeginTransaction(); + var result = await _connection.UpdateAllAsync( + mixDb.SystemName, + entities: dicObjs, + fields: fields, + commandTimeout: _settings.CommandTimeout, + transaction: _dbTransaction, + trace: _trace); + CompleteTransaction(); + return result; + } + catch (Exception ex) + { + RollbackTransaction(); + throw new MixException(MixErrorStatus.ServerError, ex); + } + } + + public async Task UpdateAsync(object id, JObject entity, RepoDbMixDatabaseViewModel mixDb) { try { @@ -450,11 +499,11 @@ public async Task InsertAsync(JObject obj, RepoDbMixDatabaseViewModel mixD { RollbackTransaction(); await MixLogService.LogExceptionAsync(ex); - return default; + throw ex; } } - public async Task DeleteAsync(int id, FieldNameService fieldNameService) + public async Task DeleteAsync(object id, FieldNameService fieldNameService) { try { @@ -643,6 +692,7 @@ public void CompleteTransaction() if ((_isRoot || DatabaseProvider == MixDatabaseProvider.SQLITE) && _dbTransaction?.Connection != null) { _dbTransaction.Commit(); + _dbTransaction = null; } } @@ -675,18 +725,23 @@ public void Dispose() } } _connection.Close(); + _connection.Dispose(); } } private Dictionary ParseDictionary(JObject obj, RepoDbMixDatabaseViewModel mixDb) { var dicObj = obj.ToObject>(); - + var fieldNameService = new FieldNameService(mixDb.NamingConvention); // npgsql cannot auto parse from string to Guid var guidCols = mixDb.Columns.Where(c => c.DataType == MixDataType.Guid).ToList(); + if (dicObj != null && mixDb.Type == MixDatabaseType.GuidService && dicObj[fieldNameService.Id] != null) + { + dicObj[fieldNameService.Id] = Guid.Parse(dicObj[fieldNameService.Id].ToString()!); + } foreach (var item in guidCols) { - var colTitle = item.SystemName.ToTitleCase(); + var colTitle = item.SystemName; if (dicObj.ContainsKey(colTitle) && dicObj[colTitle] != null) { dicObj[colTitle] = Guid.Parse(dicObj[colTitle].ToString()!); diff --git a/src/platform/mix.repodb/Repositories/OptimizedPostgresSqlStatementBuilder.cs b/src/platform/mix.repodb/Repositories/OptimizedPostgresSqlStatementBuilder.cs new file mode 100644 index 000000000..a60ea3912 --- /dev/null +++ b/src/platform/mix.repodb/Repositories/OptimizedPostgresSqlStatementBuilder.cs @@ -0,0 +1,423 @@ +using Microsoft.Data.SqlClient; +using Npgsql; +using RepoDb; +using RepoDb.Exceptions; +using RepoDb.Extensions; +using RepoDb.Interfaces; +using RepoDb.Resolvers; +using RepoDb.StatementBuilders; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; + +namespace Mix.RepoDb.Repositories +{ + + /// + /// A class used to build a SQL Statement for SQL Server. This is the default statement builder used by the library. + /// + internal sealed class OptimizedPostgresSqlStatementBuilder : BaseStatementBuilder + { + Regex regex = new("(\"\\w+\")\\s(LIKE)"); + /// + /// Creates a new instance of object. + /// + public OptimizedPostgresSqlStatementBuilder() + : base(DbSettingMapper.Get(), + new PostgreSqlConvertFieldResolver(), + new ClientTypeToAverageableClientTypeResolver()) + { } + // + // Summary: + // Creates a new instance of RepoDb.StatementBuilders.PostgreSqlStatementBuilder + // class. + // + // Parameters: + // dbSetting: + // The database settings object currently in used. + // + // convertFieldResolver: + // The resolver used when converting a field in the database layer. + // + // averageableClientTypeResolver: + // The resolver used to identity the type for average. + public OptimizedPostgresSqlStatementBuilder(IDbSetting dbSetting, IResolver convertFieldResolver = null, IResolver averageableClientTypeResolver = null) + : base(dbSetting, convertFieldResolver, averageableClientTypeResolver) + { + } + + + #region Create Count + + public override string CreateCount(string tableName, QueryGroup where = null, string hints = null) + { + string query = base.CreateCount(tableName, where, hints); + return ReplaceLikeFilter(query, where); + } + #endregion + + #region Create Batch Query + // + // Summary: + // Creates a SQL Statement for batch query operation. + // + // Parameters: + // tableName: + // The name of the target table. + // + // fields: + // The list of fields to be queried. + // + // page: + // The page of the batch. + // + // rowsPerBatch: + // The number of rows per batch. + // + // orderBy: + // The list of fields for ordering. + // + // where: + // The query expression. + // + // hints: + // The table hints to be used. + // + // Returns: + // A sql statement for batch query operation. + + public override string CreateBatchQuery(string tableName, IEnumerable fields, int page, int rowsPerBatch, IEnumerable orderBy = null, QueryGroup where = null, string hints = null) + { + GuardTableName(tableName); + GuardHints(hints); + if (fields == null || !fields.Any()) + { + throw new EmptyException("The list of queryable fields must not be null for '" + tableName + "'."); + } + + if (orderBy == null || !orderBy.Any()) + { + throw new EmptyException("The argument 'orderBy' is required."); + } + + if (page < 0) + { + throw new ArgumentOutOfRangeException("page", "The page must be equals or greater than 0."); + } + + if (rowsPerBatch < 1) + { + throw new ArgumentOutOfRangeException("rowsPerBatch", "The rows per batch must be equals or greater than 1."); + } + + int value = page * rowsPerBatch; + QueryBuilder queryBuilder = new QueryBuilder(); + queryBuilder.Clear().Select().FieldsFrom(fields, base.DbSetting) + .From() + .TableNameFrom(tableName, base.DbSetting) + .WhereFrom(where, base.DbSetting) + .OrderByFrom(orderBy, base.DbSetting) + .LimitOffset(rowsPerBatch, value) + .End(); + + // Return the query + return ReplaceLikeFilter(queryBuilder.GetString(), where); + } + + private string ReplaceLikeFilter(string query, QueryGroup where = null) + { + query = regex.Replace(query, "unaccent($1) ILIKE"); + if (where != null) + { + foreach (var item in where.QueryFields) + { + query = query.Replace($"@{item.GetName()}", $"unaccent('{item.GetValue()}')"); + } + } + return query; + } + + + #endregion + + #region Create Merge + + // + // Summary: + // Creates a SQL Statement for merge operation. + // + // Parameters: + // tableName: + // The name of the target table. + // + // fields: + // The list of fields to be merged. + // + // qualifiers: + // The list of the qualifier RepoDb.Field objects. + // + // primaryField: + // The primary field from the database. + // + // identityField: + // The identity field from the database. + // + // hints: + // The table hints to be used. + // + // Returns: + // A sql statement for merge operation. + public override string CreateMerge(string tableName, IEnumerable fields, IEnumerable qualifiers = null, DbField primaryField = null, DbField identityField = null, string hints = null) + { + GuardTableName(tableName); + GuardHints(hints); + GuardPrimary(primaryField); + GuardIdentity(identityField); + if (fields == null || !fields.Any()) + { + throw new EmptyException("The list of fields cannot be null or empty."); + } + + IEnumerable enumerable = qualifiers; + if ((enumerable == null || !enumerable.Any()) && primaryField != null) + { + qualifiers = primaryField.AsField().AsEnumerable(); + } + + IEnumerable enumerable2 = qualifiers; + if (enumerable2 == null || !enumerable2.Any()) + { + if (primaryField == null) + { + throw new PrimaryFieldNotFoundException("The is no primary field from the table '" + tableName + "' that can be used as qualifier."); + } + + throw new InvalidQualifiersException("There are no defined qualifier fields."); + } + + QueryBuilder queryBuilder = new QueryBuilder(); + List fields2 = fields.Where(delegate (Field f) + { + IEnumerable enumerable3 = qualifiers; + return enumerable3 == null || !enumerable3.Any((Field qf) => string.Equals(qf.Name, f.Name, StringComparison.OrdinalIgnoreCase)); + }).AsList(); + queryBuilder.Clear().Insert().Into() + .TableNameFrom(tableName, base.DbSetting) + .OpenParen() + .FieldsFrom(fields, base.DbSetting) + .CloseParen(); + if (identityField != null) + { + queryBuilder.WriteText("OVERRIDING SYSTEM VALUE"); + } + + queryBuilder.Values().OpenParen().ParametersFrom(fields, 0, base.DbSetting) + .CloseParen() + .OnConflict(qualifiers, base.DbSetting) + .DoUpdate() + .Set() + .FieldsAndParametersFrom(fields2, 0, base.DbSetting); + DbField returnKeyColumnAsDbField = GetReturnKeyColumnAsDbField(primaryField, identityField); + string text = "NULL"; + if (returnKeyColumnAsDbField != null) + { + string databaseType = GetDatabaseType(returnKeyColumnAsDbField); + text = (string.IsNullOrWhiteSpace(databaseType) ? returnKeyColumnAsDbField.Name.AsQuoted(base.DbSetting) : $"CAST({returnKeyColumnAsDbField.Name.AsQuoted(base.DbSetting)} AS {databaseType})"); + } + + string text2 = "RETURNING " + text + " AS " + "Result".AsQuoted(base.DbSetting); + queryBuilder.WriteText(text2); + queryBuilder.End(); + return queryBuilder.GetString(); + } + + #endregion + + #region Create Merge all + + // + // Summary: + // Creates a SQL Statement for merge-all operation. + // + // Parameters: + // tableName: + // The name of the target table. + // + // fields: + // The list of fields to be merged. + // + // qualifiers: + // The list of the qualifier RepoDb.Field objects. + // + // batchSize: + // The batch size of the operation. + // + // primaryField: + // The primary field from the database. + // + // identityField: + // The identity field from the database. + // + // hints: + // The table hints to be used. + // + // Returns: + // A sql statement for merge operation. + public override string CreateMergeAll(string tableName, IEnumerable fields, IEnumerable qualifiers, int batchSize = 10, DbField primaryField = null, DbField identityField = null, string hints = null) + { + GuardTableName(tableName); + GuardHints(hints); + GuardPrimary(primaryField); + GuardIdentity(identityField); + if (fields == null || !fields.Any()) + { + throw new EmptyException("The list of fields cannot be null or empty."); + } + + IEnumerable enumerable = qualifiers; + if ((enumerable == null || !enumerable.Any()) && primaryField != null) + { + qualifiers = primaryField.AsField().AsEnumerable(); + } + + IEnumerable enumerable2 = qualifiers; + if (enumerable2 == null || !enumerable2.Any()) + { + if (primaryField == null) + { + throw new PrimaryFieldNotFoundException("The is no primary field from the table '" + tableName + "' that can be used as qualifier."); + } + + throw new InvalidQualifiersException("There are no defined qualifier fields."); + } + + QueryBuilder queryBuilder = new QueryBuilder(); + List fields2 = fields.Where(delegate (Field f) + { + IEnumerable enumerable3 = qualifiers; + return enumerable3 == null || !enumerable3.Any((Field qf) => string.Equals(qf.Name, f.Name, StringComparison.OrdinalIgnoreCase)); + }).AsList(); + DbField returnKeyColumnAsDbField = GetReturnKeyColumnAsDbField(primaryField, identityField); + string text = "NULL"; + if (returnKeyColumnAsDbField != null) + { + string databaseType = GetDatabaseType(returnKeyColumnAsDbField); + text = (string.IsNullOrWhiteSpace(databaseType) ? returnKeyColumnAsDbField.Name.AsQuoted(base.DbSetting) : $"CAST({returnKeyColumnAsDbField.Name.AsQuoted(base.DbSetting)} AS {databaseType})"); + } + + queryBuilder.Clear(); + for (int i = 0; i < batchSize; i++) + { + queryBuilder.Insert().Into().TableNameFrom(tableName, base.DbSetting) + .OpenParen() + .FieldsFrom(fields, base.DbSetting) + .CloseParen(); + if (identityField != null) + { + queryBuilder.WriteText("OVERRIDING SYSTEM VALUE"); + } + + queryBuilder.Values().OpenParen().ParametersFrom(fields, i, base.DbSetting) + .CloseParen() + .OnConflict(qualifiers, base.DbSetting) + .DoUpdate() + .Set() + .FieldsAndParametersFrom(fields2, i, base.DbSetting); + string text2 = "RETURNING " + text + " AS " + "Result".AsQuoted(base.DbSetting) + ", " + $"{base.DbSetting.ParameterPrefix}__RepoDb_OrderColumn_{i}" + " AS " + "OrderColumn".AsQuoted(base.DbSetting); + queryBuilder.WriteText(text2); + queryBuilder.End(); + } + + return queryBuilder.GetString(); + } + + #endregion + + #region Create Skip Query + + // + // Summary: + // Creates a SQL Statement for 'BatchQuery' operation. + // + // Parameters: + // tableName: + // The name of the target table. + // + // fields: + // The mapping list of RepoDb.Field objects to be used. + // + // skip: + // The number of rows to skip. + // + // take: + // The number of rows per batch. + // + // orderBy: + // The list of fields for ordering. + // + // where: + // The query expression. + // + // hints: + // The table hints to be used. + // + // Returns: + // A sql statement for batch query operation. + public override string CreateSkipQuery(string tableName, IEnumerable fields, int skip, int take, IEnumerable orderBy = null, QueryGroup where = null, string hints = null) + { + GuardTableName(tableName); + GuardHints(hints); + if (fields == null || !fields.Any()) + { + throw new EmptyException("The list of queryable fields must not be null for '" + tableName + "'."); + } + + if (orderBy == null || !orderBy.Any()) + { + throw new EmptyException("The argument 'orderBy' is required."); + } + + if (skip < 0) + { + throw new ArgumentOutOfRangeException("skip", "The rows skipped must be equals or greater than 0."); + } + + if (take < 1) + { + throw new ArgumentOutOfRangeException("take", "The rows per batch must be equals or greater than 1."); + } + + QueryBuilder queryBuilder = new QueryBuilder(); + queryBuilder.Clear().Select().FieldsFrom(fields, base.DbSetting) + .From() + .TableNameFrom(tableName, base.DbSetting) + .WhereFrom(where, base.DbSetting) + .OrderByFrom(orderBy, base.DbSetting) + .LimitOffset(take, skip) + .End(); + return queryBuilder.GetString(); + } + + #endregion + + #region Private + + private string GetDatabaseType(DbField dbField) + { + DbType? dbType = new ClientTypeToDbTypeResolver().Resolve(dbField.Type); + if (!dbType.HasValue) + { + return null; + } + + return new DbTypeToPostgreSqlStringNameResolver().Resolve(dbType.Value); + } + #endregion + + } +} diff --git a/src/platform/mix.repodb/Repositories/RepoDbBase.cs b/src/platform/mix.repodb/Repositories/RepoDbBase.cs index 3b5a29ee6..89d6e8177 100644 --- a/src/platform/mix.repodb/Repositories/RepoDbBase.cs +++ b/src/platform/mix.repodb/Repositories/RepoDbBase.cs @@ -69,7 +69,7 @@ public TEntity Get(int id) } } - // Delete + // DELETE public int Delete(int id) { @@ -107,7 +107,7 @@ public object Insert(TEntity entity, } } - // Update + // PUT public int Update(TEntity entity, IDbTransaction? transaction = null) @@ -147,7 +147,7 @@ public async Task GetAsync(int id) } } - // Delete + // DELETE public async Task DeleteAsync(int id) { @@ -183,7 +183,7 @@ public async Task InsertAsync(TEntity entity) } } - // Update + // PUT public async Task UpdateAsync(TEntity entity) { diff --git a/src/platform/mix.repodb/Services/MixDbDataService.cs b/src/platform/mix.repodb/Services/MixDbDataService.cs index c2fdd9f87..e281f2a07 100644 --- a/src/platform/mix.repodb/Services/MixDbDataService.cs +++ b/src/platform/mix.repodb/Services/MixDbDataService.cs @@ -22,11 +22,11 @@ using Mix.Heart.Services; using Mix.Shared.Services; using Mix.Database.Entities.MixDb; -using Newtonsoft.Json; using Mix.Lib.Interfaces; using Mix.Heart.Exceptions; using Mix.RepoDb.Helpers; using Mix.RepoDb.Dtos; +using System.Linq.Expressions; namespace Mix.RepoDb.Services { @@ -67,7 +67,7 @@ public void SetUOW(UnitOfWorkInfo uow) #region Implements - public async Task GetSingleByParent(string tableName, MixContentType parentType, int parentId, bool loadNestedData = false) + public async Task GetSingleByParent(string tableName, MixContentType parentType, object parentId, bool loadNestedData = false) { await InitRepository(tableName); var data = await _repository.GetSingleByParentAsync(parentType, parentId, _fieldNameService); @@ -77,7 +77,7 @@ public void SetUOW(UnitOfWorkInfo uow) if (loadNestedData) { var id = result.Value(_fieldNameService.Id); - await LoadNestedData(_mixDb, _fieldNameService, id); + result.Add(await LoadNestedData(_mixDb, _fieldNameService, id)); } return result; } @@ -112,10 +112,10 @@ public async Task> GetMyData(string tableName, Sear }; var queries = await BuildSearchQueryAsync(tableName, req); queries.Add(new(_fieldNameService.CreatedBy, Operation.Equal, username)); - return await GetResult(tableName, queries, paging, req.LoadNestedData); + return await GetResult(tableName, queries, paging, req.Queries.Any(m => m.CompareOperator == MixCompareOperator.ILike), req.Conjunction, req.LoadNestedData); } - public async Task GetMyDataById(string tableName, string username, int id, bool loadNestedData) + public async Task GetMyDataById(string tableName, string username, object id, bool loadNestedData) { await InitRepository(tableName); var queries = new List() @@ -151,7 +151,7 @@ public async Task> GetMyData(string tableName, Sear return default; } - public async Task GetById(string tableName, int id, bool loadNestedData) + public async Task GetById(string tableName, object id, bool loadNestedData) { await InitRepository(tableName); var obj = await _repository.GetSingleAsync(new QueryField(_fieldNameService.Id, id)); @@ -185,7 +185,7 @@ public async Task> GetMyData(string tableName, Sear return default; } - public async Task CreateData(string tableName, JObject data) + public async Task CreateData(string tableName, JObject data) { try { @@ -225,7 +225,7 @@ public async Task CreateData(string tableName, JObject data) throw new MixException(MixErrorStatus.Badrequest, ex); } } - public async Task DeleteData(string tableName, int id) + public async Task DeleteData(string tableName, object id) { try { @@ -284,27 +284,8 @@ public async Task> ParseListDataAsync(string tableName, List> LoadNestedData(RepoDbMixDatabaseViewModel database, FieldNameService fieldNameService, - int? parentId = null, - Guid? guidParentId = null) + public async Task> LoadNestedData(RepoDbMixDatabaseViewModel database, FieldNameService fieldNameService, + object parentId) { List result = new(); foreach (var item in database.Relationships) @@ -315,25 +296,40 @@ private async Task> LoadNestedData(RepoDbMixDatabaseViewModel da var relDb = await GetMixDatabase(GetRelationshipDbName(_mixDb)); var relFieldName = new FieldNameService(relDb.NamingConvention); _repository.InitTableName(relDb.SystemName); - result.Add(await LoadManyToManyData(relFieldName, item, fieldNameService, parentId, guidParentId: guidParentId)); + result.Add(await LoadManyToManyData(relFieldName, item, fieldNameService, parentId)); } else if (item.Type == MixDatabaseRelationshipType.OneToMany) { - result.Add(await LoadOneToManyData(item, fieldNameService, parentId, guidParentId)); + result.Add(await LoadOneToManyData(item, fieldNameService, parentId)); } } return result; } + #endregion + + #region Helper + private string GetRelationshipDbName(RepoDbMixDatabaseViewModel mixdb) + { + string relName = mixdb.NamingConvention == MixDatabaseNamingConvention.SnakeCase + ? MixDatabaseNames.DATA_RELATIONSHIP_SNAKE_CASE + : MixDatabaseNames.DATA_RELATIONSHIP_TITLE_CASE; + return mixdb.MixDatabaseContextId.HasValue + ? $"{mixdb.MixDatabaseContext.SystemName}_{relName}" + : MixDatabaseNames.SYSTEM_DATA_RELATIONSHIP; + } + public static string GetCacheFolder(string databaseName) + { + return $"{MixFolders.MixDbCacheFolder}/{databaseName}"; + } + - private async Task LoadOneToManyData(MixDatabaseRelationshipViewModel item, FieldNameService fieldNameService, int? parentId, Guid? guidParentId) + + private async Task LoadOneToManyData(MixDatabaseRelationshipViewModel item, FieldNameService fieldNameService, object parentId) { - JObject data = new JObject(); string pIdName = fieldNameService.GetParentId(item.SourceDatabaseName); _repository.InitTableName(item.DestinateDatabaseName); - List query = parentId.HasValue - ? new() { new(pIdName, Operation.Equal, parentId) } - : new() { new(pIdName, Operation.Equal, guidParentId) }; - var nestedData = await _repository.GetListByAsync(query); + List query = new() { new(pIdName, Operation.Equal, parentId) }; + var nestedData = await _repository.GetListByAsync(query, orderFields: new List() { new OrderField(_fieldNameService.CreatedDateTime, Order.Ascending) }); JArray result = new(); if (nestedData != null) @@ -347,15 +343,19 @@ private async Task LoadOneToManyData(MixDatabaseRelationshipViewModel } - private async Task LoadManyToManyData(FieldNameService relFieldName, MixDatabaseRelationshipViewModel item, FieldNameService fieldNameService, int? parentId, Guid? guidParentId) + private async Task LoadManyToManyData(FieldNameService relFieldName, MixDatabaseRelationshipViewModel item, FieldNameService fieldNameService, + object parentId) { List queries = GetAssociationQueries(relFieldName, item.SourceDatabaseName, item.DestinateDatabaseName, - parentId: parentId, - guidParentId: guidParentId); - var associations = await _repository.GetListByAsync(queries); + parentId: parentId); + var associations = await _repository.GetListByAsync(queries, orderFields: new List() { new OrderField(_fieldNameService.CreatedDateTime, Order.Ascending) }); if (associations is { Count: > 0 }) { - var nestedIds = JArray.FromObject(associations).Select(m => m.Value(fieldNameService.ChildId)).ToList(); + var childDb = await GetMixDatabase(item.DestinateDatabaseName); + var nestedIds = + childDb.Type == MixDatabaseType.GuidService + ? JArray.FromObject(associations).Select(m => m.Value(fieldNameService.GuidChildId)).ToList() + : JArray.FromObject(associations).Select(m => m.Value(fieldNameService.ChildId)).ToList(); _repository.InitTableName(item.DestinateDatabaseName); List query = new() { new(fieldNameService.Id, Operation.In, nestedIds) }; var nestedData = await _repository.GetListByAsync(query); @@ -369,9 +369,9 @@ private async Task LoadManyToManyData(FieldNameService relFieldName, } - private async Task> GetResult(string tableName, IEnumerable queries, PagingRequestModel paging, bool loadNestedData) + private async Task> GetResult(string tableName, IEnumerable queries, PagingRequestModel paging, bool iLike, MixConjunction conjunction, bool loadNestedData) { - var result = await _repository.GetPagingAsync(queries, paging); + var result = await _repository.GetPagingAsync(queries, paging, iLike, conjunction); var items = new List(); var database = await GetMixDatabase(tableName); @@ -394,7 +394,12 @@ private async Task> GetResult(string tableName, IEn return new PagingResponseModel { Items = items, PagingData = result.PagingData }; } - private List GetAssociationQueries(FieldNameService fieldNameService, string? parentDatabaseName = null, string? childDatabaseName = null, int? parentId = null, int? childId = null, Guid? guidParentId = null, Guid? guidChildId = null) + private List GetAssociationQueries( + FieldNameService fieldNameService, + string? parentDatabaseName = null, + string? childDatabaseName = null, + object? parentId = null, + object? childId = null) { var queries = new List(); if (!string.IsNullOrEmpty(parentDatabaseName)) @@ -405,22 +410,29 @@ private List GetAssociationQueries(FieldNameService fieldNameService { queries.Add(new QueryField(fieldNameService.ChildDatabaseName, childDatabaseName)); } - if (parentId.HasValue) + if (parentId != null) { - queries.Add(new QueryField(fieldNameService.ParentId, parentId)); - } - if (childId.HasValue) - { - queries.Add(new QueryField(fieldNameService.Id, parentId)); - } - if (guidParentId.HasValue) - { - queries.Add(new QueryField(fieldNameService.GuidParentId, guidParentId)); + if (parentId.GetType() == typeof(int)) + { + queries.Add(new QueryField(fieldNameService.ParentId, parentId)); + } + else if (parentId.GetType() == typeof(Guid)) + { + queries.Add(new QueryField(fieldNameService.GuidParentId, parentId)); + } } - if (guidChildId.HasValue) + if (childId != null) { - queries.Add(new QueryField(fieldNameService.GuidChildId, guidChildId)); + if (childId.GetType() == typeof(int)) + { + queries.Add(new QueryField(fieldNameService.Id, parentId)); + } + else if (childId.GetType() == typeof(Guid)) + { + queries.Add(new QueryField(fieldNameService.GuidChildId, childId)); + } } + return queries; } @@ -439,9 +451,10 @@ private List GetAssociationQueries(FieldNameService fieldNameService private async Task> BuildSearchQueryAsync(string tableName, SearchMixDbRequestDto request) { var queries = BuildSearchPredicate(request); - if (request.ParentId.HasValue) + if (request.ObjParentId != null) { var database = await GetMixDatabase(tableName); + var parentDb = await GetMixDatabase(request.ParentName); if (database is null) { return queries; @@ -453,10 +466,24 @@ private async Task> BuildSearchQueryAsync(string tableName, Sea } else { - var allowsIds = _cmsUow.DbContext.MixDatabaseAssociation - .Where(m => m.ParentDatabaseName == request.ParentName && m.ParentId == request.ParentId.Value && m.ChildDatabaseName == tableName) - .Select(m => m.ChildId).ToList(); - queries.Add(new(_fieldNameService.Id, Operation.In, allowsIds)); + Expression> predicate = m => m.ParentDatabaseName == request.ParentName + && m.ChildDatabaseName == tableName; + predicate = predicate.AndAlsoIf(parentDb.Type == MixDatabaseType.GuidService, + m => m.GuidParentId == (Guid)request.ObjParentId); + predicate = predicate.AndAlsoIf(parentDb.Type != MixDatabaseType.GuidService, + m => m.ParentId == (int)request.ObjParentId); + + var childIdsQuery = _cmsUow.DbContext.MixDatabaseAssociation + .Where(predicate); + if (database.Type == MixDatabaseType.GuidService) + { + queries.Add(new(_fieldNameService.Id, Operation.In, childIdsQuery.Select(m => m.GuidChildId).ToList())); + } + else + { + queries.Add(new(_fieldNameService.Id, Operation.In, childIdsQuery.Select(m => m.ChildId).ToList())); + } + } } @@ -569,7 +596,7 @@ private async Task InitRepository(string tableName) if (_mixDb.MixDatabaseContextId.HasValue) { - _repository.Init(tableName, _mixDb.MixDatabaseContext.DatabaseProvider, _mixDb.MixDatabaseContext.ConnectionString); + _repository.Init(tableName, _mixDb.MixDatabaseContext.DatabaseProvider, _mixDb.MixDatabaseContext.DecryptedConnectionString); } else { @@ -603,17 +630,17 @@ private async Task ParseDto(string tableName, JObject dto) } else { - result.Add(new JProperty(pr.Name, col!=null? MixDbHelper.ParseObjectValue(col.DataType, pr.Value): pr.Value)); + result.Add(new JProperty(pr.Name, col != null ? MixDbHelper.ParseObjectValueToDbType(col.DataType, pr.Value) : pr.Value)); } } if (!result.ContainsKey(_fieldNameService.Id)) { result.Add(new JProperty(_fieldNameService.Id, string.Empty)); - if (!result.ContainsKey(_fieldNameService.CreatedDateTime)) - { - result.Add(new JProperty(_fieldNameService.CreatedDateTime, DateTime.UtcNow)); - } + } + if (!result.ContainsKey(_fieldNameService.CreatedDateTime)) + { + result.Add(new JProperty(_fieldNameService.CreatedDateTime, DateTime.UtcNow)); } else { @@ -661,7 +688,7 @@ public void Dispose() _cmsUow.Dispose(); } - public async Task CreateDataRelationship(CreateDataRelationshipDto dto, CancellationToken cancellationToken) + public async Task CreateDataRelationship(CreateDataRelationshipDto dto, CancellationToken cancellationToken) { try { @@ -691,7 +718,7 @@ public void Dispose() } } - public async Task DeleteDataRelationship(string relTableName, int id, CancellationToken cancellationToken) + public async Task DeleteDataRelationship(string relTableName, object id, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); try diff --git a/src/platform/mix.repodb/Services/MixDbService.cs b/src/platform/mix.repodb/Services/MixDbService.cs index 79af90a33..9161dc00a 100644 --- a/src/platform/mix.repodb/Services/MixDbService.cs +++ b/src/platform/mix.repodb/Services/MixDbService.cs @@ -16,6 +16,7 @@ using Mix.Heart.Services; using Mix.Heart.UnitOfWork; using Mix.Lib.Interfaces; +using Mix.Mixdb.Services; using Mix.RepoDb.Dtos; using Mix.RepoDb.Entities; using Mix.RepoDb.Interfaces; @@ -25,13 +26,16 @@ using Mix.Service.Services; using Mix.Shared.Dtos; using Mix.Shared.Models; +using Mix.Shared.Services; using MySqlX.XDevAPI.Common; using Newtonsoft.Json.Linq; +using Npgsql; using RepoDb; using RepoDb.Enumerations; using RepoDb.Interfaces; using System.Dynamic; using System.Linq.Dynamic.Core; +using System.Linq.Expressions; using ZstdSharp.Unsafe; namespace Mix.RepoDb.Services @@ -45,6 +49,7 @@ public class MixDbService : TenantServiceBase, IMixDbService, IDisposable private MixRepoDbRepository _repository; private MixRepoDbRepository _backupRepository; private IMixMemoryCacheService _memoryCache; + private RuntimeDbContextService _runtimeDbContextService; private readonly UnitOfWorkInfo _cmsUow; @@ -67,7 +72,7 @@ public MixDbService( _cmsUow = uow; _databaseService = databaseService; _repository = repository; - _backupRepository = new MixRepoDbRepository(cache, databaseService, uow); + _backupRepository = new MixRepoDbRepository(cache, databaseService); _databaseProvider = _databaseService.DatabaseProvider; _databaseConstant = _databaseProvider switch { @@ -78,6 +83,7 @@ public MixDbService( _ => throw new NotImplementedException() }; _memoryCache = memoryCache; + _runtimeDbContextService = new RuntimeDbContextService(httpContextAccessor, databaseService); } #region Methods @@ -121,37 +127,58 @@ public async Task DropColumn(RepoDbMixDatabaseColumnViewModel col) public async Task AlterColumn(AlterColumnDto colDto) { - var database = await GetMixDatabase(colDto.MixDatabaseName); - if (database == null) + try { - throw new MixException(MixErrorStatus.Badrequest, $"Invalid table {colDto.MixDatabaseName}"); + + var database = await GetMixDatabase(colDto.MixDatabaseName); + if (database == null) + { + throw new MixException(MixErrorStatus.Badrequest, $"Invalid table {colDto.MixDatabaseName}"); + } + var col = new RepoDbMixDatabaseColumnViewModel(colDto); + if (database.MixDatabaseContextId.HasValue) + { + await SwitchDbContext(database.MixDatabaseContext); + } + + var alterCommandText = colDto.IsDrop + ? $"{GenerateDropColumnSql(col)} {GenerateAddColumnSql(col)}" + : GenerateAlterColumnSql(col); + var result = await _repository.ExecuteCommand(alterCommandText); + _repository.CompleteTransaction(); + return result >= 0; } - var col = new RepoDbMixDatabaseColumnViewModel(colDto); - if (database.MixDatabaseContextId.HasValue) + catch (Exception ex) { - await SwitchDbContext(database.MixDatabaseContext); + throw new MixException(MixErrorStatus.ServerError, ex); } - var dropCommandText = GenerateAlterColumnSql(col); - var result = await _repository.ExecuteCommand(dropCommandText); - _repository.CompleteTransaction(); - return result >= 0; } public async Task MigrateDatabase(RepoDbMixDatabaseViewModel database) { - if (database.MixDatabaseContextId.HasValue) + try { - await SwitchDbContext(database.MixDatabaseContext); - } + if (database.MixDatabaseContextId.HasValue) + { + await SwitchDbContext(database.MixDatabaseContext); + } - if (database is { Columns.Count: > 0 }) + if (database is { Columns.Count: > 0 }) + { + var dbProverder = database.MixDatabaseContext?.DatabaseProvider ?? _databaseService.DatabaseProvider; + await Migrate(database, dbProverder, _repository); + _repository.CompleteTransaction(); + return true; + } + return false; + } + catch (Exception ex) { - await Migrate(database, _databaseProvider, _repository); - _repository.CompleteTransaction(); - return true; + throw new MixException(MixErrorStatus.Badrequest, ex); } - return false; } + + public async Task BackupDatabase(RepoDbMixDatabaseViewModel database, CancellationToken cancellationToken = default) { if (database != null) @@ -194,7 +221,7 @@ public async Task RestoreFromLocal(RepoDbMixDatabaseViewModel database, Fi insertQuery += string.Join(',', queries); if (database.MixDatabaseContextId.HasValue) { - _repository.Init(database.SystemName, database.MixDatabaseContext.DatabaseProvider, database.MixDatabaseContext.ConnectionString); + _repository.Init(database.SystemName, database.MixDatabaseContext.DatabaseProvider, database.MixDatabaseContext.DecryptedConnectionString); } else { @@ -264,6 +291,7 @@ public async Task MigrateInitNewDbContextDatabases(MixDatabaseContext dbCo try { + var cnn = AesEncryptionHelper.DecryptString(dbContext.ConnectionString, GlobalConfigService.Instance.AesKey); var strMixDbs = MixFileHelper.GetFile( "init-new-dbcontext-databases", MixFileExtensions.Json, MixFolders.JsonDataFolder); var obj = JObject.Parse(strMixDbs.Content); @@ -277,7 +305,7 @@ public async Task MigrateInitNewDbContextDatabases(MixDatabaseContext dbCo string newDbName = dbContext.NamingConvention == MixDatabaseNamingConvention.SnakeCase ? $"{dbContext.SystemName}_{database.DisplayName.ToColumnName(false)}" : $"{dbContext.SystemName.ToTitleCase()}{database.DisplayName.ToColumnName(true)}"; - _repository.Init(newDbName, dbContext.DatabaseProvider, dbContext.ConnectionString); + _repository.Init(newDbName, dbContext.DatabaseProvider, cnn); var currentDb = await RepoDbMixDatabaseViewModel.GetRepository(_cmsUow, CacheService) .GetSingleAsync(m => m.SystemName == newDbName); if (currentDb == null) @@ -285,6 +313,7 @@ public async Task MigrateInitNewDbContextDatabases(MixDatabaseContext dbCo currentDb = new(database, _cmsUow); currentDb.Id = 0; + currentDb.NamingConvention = dbContext.NamingConvention; currentDb.SystemName = newDbName; currentDb.MixTenantId = CurrentTenant?.Id ?? 1; currentDb.MixDatabaseContextId = dbContext.Id; @@ -298,7 +327,7 @@ public async Task MigrateInitNewDbContextDatabases(MixDatabaseContext dbCo { string newColName = dbContext.NamingConvention == MixDatabaseNamingConvention.SnakeCase ? col.DisplayName.ToColumnName(false) - : col.DisplayName.ToColumnName(false); + : col.DisplayName.ToColumnName(true); col.Id = 0; col.SystemName = newColName; col.MixDatabaseName = newDbName; @@ -311,7 +340,7 @@ public async Task MigrateInitNewDbContextDatabases(MixDatabaseContext dbCo } if (currentDb is { Columns.Count: > 0 }) { - await Migrate(currentDb, _databaseService.DatabaseProvider, _repository); + await Migrate(currentDb, dbContext.DatabaseProvider, _repository); } } @@ -357,9 +386,10 @@ private string GetRelationshipDbName(RepoDbMixDatabaseViewModel mixDb) private async Task> BuildSearchQueryAsync(string tableName, SearchMixDbRequestDto request, FieldNameService fieldNameService) { var queries = BuildSearchPredicate(request, fieldNameService); - if (request.ParentId.HasValue) + if (request.ObjParentId != null) { var database = await GetMixDatabase(tableName); + var parentDb = await GetMixDatabase(request.ParentName); if (database is null) { return queries; @@ -371,10 +401,23 @@ private async Task> BuildSearchQueryAsync(string tableName, Sea } else { - var allowsIds = _cmsUow.DbContext.MixDatabaseAssociation - .Where(m => m.ParentDatabaseName == request.ParentName && m.ParentId == request.ParentId.Value && m.ChildDatabaseName == tableName) - .Select(m => m.ChildId).ToList(); - queries.Add(new(fieldNameService.Id, Operation.In, allowsIds)); + Expression> predicate = m => m.ParentDatabaseName == request.ParentName + && m.ChildDatabaseName == tableName; + predicate = predicate.AndAlsoIf(parentDb.Type == MixDatabaseType.GuidService, + m => m.GuidParentId == (Guid)request.ObjParentId); + predicate = predicate.AndAlsoIf(parentDb.Type != MixDatabaseType.GuidService, + m => m.ParentId == (int)request.ObjParentId); + + var childIdsQuery = _cmsUow.DbContext.MixDatabaseAssociation + .Where(predicate); + if (database.Type == MixDatabaseType.GuidService) + { + queries.Add(new(fieldNameService.Id, Operation.In, childIdsQuery.Select(m => m.GuidChildId).ToList())); + } + else + { + queries.Add(new(fieldNameService.Id, Operation.In, childIdsQuery.Select(m => m.ChildId).ToList())); + } } } @@ -469,7 +512,7 @@ private Operation ParseSearchOperation(MixCompareOperator? searchMethod) #endregion - private async Task SwitchDbContext(MixDatabaseContextReadViewModel dbContext) + private Task SwitchDbContext(MixDatabaseContextReadViewModel dbContext) { if (dbContext == null) { @@ -484,8 +527,8 @@ private async Task SwitchDbContext(MixDatabaseContextReadViewModel dbContext) MixDatabaseProvider.SQLITE => new SqliteDatabaseConstants(), _ => throw new NotImplementedException() }; - _repository = new MixRepoDbRepository(_cache, dbContext.DatabaseProvider, dbContext.ConnectionString, _cmsUow); - + _repository = new MixRepoDbRepository(_cache, dbContext.DatabaseProvider, dbContext.DecryptedConnectionString, _cmsUow); + return Task.CompletedTask; } // Only run after init CMS success @@ -552,7 +595,7 @@ private string GetInsertQuery(ExpandoObject obj, List selectMembers) cancellationToken.ThrowIfCancellationRequested(); if (database.MixDatabaseContextId.HasValue) { - _repository.Init(database.SystemName, database.MixDatabaseContext.DatabaseProvider, database.MixDatabaseContext.ConnectionString); + _repository.Init(database.SystemName, database.MixDatabaseContext.DatabaseProvider, database.MixDatabaseContext.DecryptedConnectionString); } else { @@ -568,13 +611,20 @@ private async Task Migrate(RepoDbMixDatabaseViewModel database, var fieldNameService = new FieldNameService(database.NamingConvention); var colsSql = new List(); var tableName = database.SystemName; - + _databaseConstant = databaseProvider switch + { + MixDatabaseProvider.SQLSERVER => new SqlServerDatabaseConstants(), + MixDatabaseProvider.MySQL => new MySqlDatabaseConstants(), + MixDatabaseProvider.PostgreSQL => new PostgresDatabaseConstants(), + MixDatabaseProvider.SQLITE => new SqliteDatabaseConstants(), + _ => throw new NotImplementedException() + }; foreach (var col in database.Columns) { colsSql.Add(GenerateColumnSql(col)); } - var commandText = GetMigrateTableSql(tableName, databaseProvider, colsSql, fieldNameService); + var commandText = GetMigrateTableSql(tableName, databaseProvider, database.Type, colsSql, fieldNameService); if (!string.IsNullOrEmpty(commandText)) { await repo.ExecuteCommand($"DROP TABLE IF EXISTS {_databaseConstant.BacktickOpen}{tableName}{_databaseConstant.BacktickClose};"); @@ -585,10 +635,10 @@ private async Task Migrate(RepoDbMixDatabaseViewModel database, return false; } - private string GetMigrateTableSql(string tableName, MixDatabaseProvider databaseProvider, List colsSql, FieldNameService fieldNameService) + private string GetMigrateTableSql(string tableName, MixDatabaseProvider databaseProvider, MixDatabaseType dbType, List colsSql, FieldNameService fieldNameService) { return $"CREATE TABLE {_databaseConstant.BacktickOpen}{tableName}{_databaseConstant.BacktickClose} " + - $"({_databaseConstant.BacktickOpen}{fieldNameService.Id}{_databaseConstant.BacktickClose} {GetAutoIncreaseIdSyntax(databaseProvider)}, " + + $"({_databaseConstant.BacktickOpen}{fieldNameService.Id}{_databaseConstant.BacktickClose} {GetIdSyntax(databaseProvider, dbType)}, " + $"{_databaseConstant.BacktickOpen}{fieldNameService.CreatedDateTime}{_databaseConstant.BacktickClose} {GetColumnType(MixDataType.DateTime)}, " + $"{_databaseConstant.BacktickOpen}{fieldNameService.LastModified}{_databaseConstant.BacktickClose} {GetColumnType(MixDataType.DateTime)} NULL, " + $"{_databaseConstant.BacktickOpen}{fieldNameService.TenantId}{_databaseConstant.BacktickClose} {GetColumnType(MixDataType.Integer)} NULL, " + @@ -600,8 +650,13 @@ private string GetMigrateTableSql(string tableName, MixDatabaseProvider database $" {string.Join(",", colsSql.ToArray())})"; } - private string GetAutoIncreaseIdSyntax(MixDatabaseProvider databaseProvider) + private string GetIdSyntax(MixDatabaseProvider databaseProvider, MixDatabaseType dbType) { + if (dbType == MixDatabaseType.GuidService) + { + return $"{_databaseConstant.BacktickOpen}{_databaseConstant.Guid}{_databaseConstant.BacktickClose} PRIMARY KEY"; + } + return databaseProvider switch { MixDatabaseProvider.SQLSERVER => $"{GetColumnType(MixDataType.Integer)} IDENTITY(1,1) PRIMARY KEY", diff --git a/src/platform/mix.repodb/Subscribers/MixRepoDbSubscriber.cs b/src/platform/mix.repodb/Subscribers/MixRepoDbSubscriber.cs index dc2034166..e638cf5e3 100644 --- a/src/platform/mix.repodb/Subscribers/MixRepoDbSubscriber.cs +++ b/src/platform/mix.repodb/Subscribers/MixRepoDbSubscriber.cs @@ -37,7 +37,7 @@ public MixRepoDbSubscriber( PortalHub = portalHub; } - public override async Task Handler(MessageQueueModel model) + public override async Task Handler(MessageQueueModel model, CancellationToken cancellationToken) { try { diff --git a/src/platform/mix.repodb/ViewModels/MixDatabaseContextReadViewModel.cs b/src/platform/mix.repodb/ViewModels/MixDatabaseContextReadViewModel.cs index 5b7b9cad8..26feecce2 100644 --- a/src/platform/mix.repodb/ViewModels/MixDatabaseContextReadViewModel.cs +++ b/src/platform/mix.repodb/ViewModels/MixDatabaseContextReadViewModel.cs @@ -2,9 +2,13 @@ using Mix.Constant.Enums; using Mix.Database.Entities.Cms; using Mix.Heart.Enums; +using Mix.Heart.Extensions; +using Mix.Heart.Helpers; using Mix.Heart.UnitOfWork; using Mix.RepoDb.Base; +using Mix.Shared.Services; using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; namespace Mix.RepoDb.ViewModels { @@ -17,6 +21,8 @@ public sealed class MixDatabaseContextReadViewModel public string ConnectionString { get; set; } public string Schema { get; set; } public string SystemName { get; set; } + [JsonIgnore] + public string DecryptedConnectionString { get; set; } #endregion #region Constructors @@ -36,5 +42,22 @@ public MixDatabaseContextReadViewModel(MixDatabaseContext entity, UnitOfWorkInfo } #endregion + + #region Overrides + + public override Task ExpandView(CancellationToken cancellationToken = default) + { + if (ConnectionString.IsBase64()) + { + DecryptedConnectionString ??= AesEncryptionHelper.DecryptString(ConnectionString, GlobalConfigService.Instance.AppSettings.ApiEncryptKey); + } + else + { + DecryptedConnectionString = ConnectionString; + } + return Task.CompletedTask; + } + + #endregion } } diff --git a/src/platform/mix.repodb/ViewModels/MixDatabaseRelationshipViewModel.cs b/src/platform/mix.repodb/ViewModels/MixDatabaseRelationshipViewModel.cs index 7b70b629a..41349d43b 100644 --- a/src/platform/mix.repodb/ViewModels/MixDatabaseRelationshipViewModel.cs +++ b/src/platform/mix.repodb/ViewModels/MixDatabaseRelationshipViewModel.cs @@ -66,53 +66,6 @@ public override async Task Validate(CancellationToken cancellationToken) await base.Validate(cancellationToken); } - protected override async Task SaveEntityRelationshipAsync(MixDatabaseRelationship parentEntity, CancellationToken cancellationToken = default) - { - string parentColIdName = $"{SourceDatabaseName.ToTitleCase()}Id"; - if (!Context.MixDatabaseColumn.Any(m => m.MixDatabaseName == DestinateDatabaseName && m.SystemName == parentColIdName)) - { - var destDb = Context.MixDatabase.FirstOrDefault(m => m.SystemName == DestinateDatabaseName); - - if (destDb is null) - { - return; - } - - var refCol = new RepoDbMixDatabaseColumnViewModel(UowInfo) - { - MixDatabaseName = DestinateDatabaseName, - MixDatabaseId = destDb.Id, - DataType = MixDataType.Reference, - CreatedBy = CreatedBy, - DisplayName = parentColIdName.ToTitleCase(), - SystemName = parentColIdName - }; - - await refCol.SaveAsync(cancellationToken); - ModifiedEntities.AddRange(refCol.ModifiedEntities); - } - } - - protected override async Task DeleteHandlerAsync(CancellationToken cancellationToken = default) - { - var leftDb = await Context.MixDatabase.FindAsync(new object?[] { ParentId }, cancellationToken: cancellationToken); - var rightDb = await Context.MixDatabase.FindAsync(new object?[] { ChildId }, cancellationToken: cancellationToken); - if (leftDb is null || rightDb is null) - { - return; - } - - string leftColName = $"{leftDb.SystemName}Id"; - string rightColName = $"{rightDb.SystemName}Id"; - await RepoDbMixDatabaseColumnViewModel.GetRepository(UowInfo, CacheService) - .DeleteManyAsync(m => - (m.MixDatabaseId == ParentId && m.SystemName == rightColName) - || (m.MixDatabaseId == ChildId && m.SystemName == leftColName), - cancellationToken); - - await base.DeleteHandlerAsync(cancellationToken); - } - #endregion } } diff --git a/src/platform/mix.repodb/mix.repodb.csproj b/src/platform/mix.repodb/mix.repodb.csproj index 28c306918..b1c12f55b 100644 --- a/src/platform/mix.repodb/mix.repodb.csproj +++ b/src/platform/mix.repodb/mix.repodb.csproj @@ -18,6 +18,7 @@ + diff --git a/src/platform/mix.service/Commands/MixDbEventCommand.cs b/src/platform/mix.service/Commands/MixDbEventCommand.cs index 3350f8dd1..d297035c0 100644 --- a/src/platform/mix.service/Commands/MixDbEventCommand.cs +++ b/src/platform/mix.service/Commands/MixDbEventCommand.cs @@ -7,7 +7,7 @@ namespace Mix.Service.Commands { public class MixDbEventCommand { - public MixDbEventCommand(string createdBy, string action, string name, JObject data) + public MixDbEventCommand(string createdBy, string action, string name, MixDbAuditLogModel data) { CreatedBy = createdBy; MixDbName = name; @@ -18,6 +18,6 @@ public MixDbEventCommand(string createdBy, string action, string name, JObject d public string CreatedBy { get; set; } public string MixDbName { get; set; } public string Action { get; set; } - public JObject Data { get; set; } + public MixDbAuditLogModel Data { get; set; } } } diff --git a/src/platform/mix.service/Services/FieldNameService.cs b/src/platform/mix.service/Services/FieldNameService.cs index f683a17ef..652bf8b14 100644 --- a/src/platform/mix.service/Services/FieldNameService.cs +++ b/src/platform/mix.service/Services/FieldNameService.cs @@ -92,7 +92,10 @@ public List GetAllFieldName() var props = GetType().GetProperties(); foreach (var item in props) { - result.Append(item.GetValue(this)?.ToString()); + if (item.PropertyType == typeof(string) && item.GetValue(this) != null) + { + result.Add(item!.GetValue(this)!.ToString()); + } } return result; } diff --git a/src/platform/mix.service/Services/MixDbCommandHubClientService.cs b/src/platform/mix.service/Services/MixDbCommandHubClientService.cs index 580f7f3e0..765a36c55 100644 --- a/src/platform/mix.service/Services/MixDbCommandHubClientService.cs +++ b/src/platform/mix.service/Services/MixDbCommandHubClientService.cs @@ -11,7 +11,7 @@ namespace Mix.Service.Services public class MixDbCommandHubClientService : BaseHubClientService, IMixDbCommandHubClientService { public MixDbCommandHubClientService(MixEndpointService mixEndpointService, ILogger logger) - : base(HubEndpoints.MixDbCommandHub, mixEndpointService.MixMq, logger) + : base(HubEndpoints.MixDbHub, mixEndpointService.MixMq, logger) { } diff --git a/src/platform/mix.service/Services/MixLogService.cs b/src/platform/mix.service/Services/MixLogService.cs index 5d412ccc8..15170f327 100644 --- a/src/platform/mix.service/Services/MixLogService.cs +++ b/src/platform/mix.service/Services/MixLogService.cs @@ -33,7 +33,7 @@ public static Task LogExceptionAsync(Exception? ex = null, MixErrorStatus? statu // { // content = s.ReadToEnd(); // } - // File.Delete(filePath); + // File.DELETE(filePath); // } // JArray arrExceptions = JArray.Parse(content); diff --git a/src/platform/mix.service/Services/MixMemoryCacheService.cs b/src/platform/mix.service/Services/MixMemoryCacheService.cs index 68680f598..6499e31ae 100644 --- a/src/platform/mix.service/Services/MixMemoryCacheService.cs +++ b/src/platform/mix.service/Services/MixMemoryCacheService.cs @@ -8,7 +8,7 @@ public class MixMemoryCacheService : IMixMemoryCacheService public MemoryCache Cache { get; } = new MemoryCache( new MemoryCacheOptions { - ExpirationScanFrequency = TimeSpan.FromSeconds(3) + ExpirationScanFrequency = TimeSpan.FromSeconds(20) } ); diff --git a/src/platform/mix.shared/Dtos/SearchMixDbRequestDto.cs b/src/platform/mix.shared/Dtos/SearchMixDbRequestDto.cs index 8d7601fdb..87a74ddad 100644 --- a/src/platform/mix.shared/Dtos/SearchMixDbRequestDto.cs +++ b/src/platform/mix.shared/Dtos/SearchMixDbRequestDto.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Http; +using Mix.Heart.Enums; namespace Mix.Shared.Dtos { @@ -19,22 +20,35 @@ public SearchMixDbRequestDto(SearchRequestDto req, HttpRequest request) OrderBy = req.OrderBy; Direction = req.Direction; Status = req.Status; + } - if (int.TryParse(request.Query[MixRequestQueryKeywords.ParentId], out int parentId)) + public List Queries { get; set; } = new(); + public string? ParentId { get; set; } + public object? ObjParentId => GetParentId(); + public MixDatabaseRelationshipType? Relationship { get; set; } = MixDatabaseRelationshipType.OneToMany; + public string ParentName { get; set; } = default; + + private object? GetParentId() + { + try { - ParentId = parentId; + if (Guid.TryParse(ParentId, out var guidId)) + { + return guidId; + } + else + { + if (int.TryParse(ParentId, out var intId)) + { + return intId; + } + } + return null; } - - if (Guid.TryParse(request.Query[MixRequestQueryKeywords.ParentId], out Guid guidParentId)) + catch (Exception ex) { - GuidParentId = guidParentId; + throw new MixException(MixErrorStatus.Badrequest, ex); } } - - public List Queries { get; set; } = new(); - public int? ParentId { get; set; } - public MixDatabaseRelationshipType? RelationShip { get; set; } = MixDatabaseRelationshipType.OneToMany; - public Guid? GuidParentId { get; set; } - public string ParentName { get; set; } = default; } } diff --git a/src/platform/mix.shared/Dtos/SearchRequestDto.cs b/src/platform/mix.shared/Dtos/SearchRequestDto.cs index 3c8c67e2c..6dfac59bf 100644 --- a/src/platform/mix.shared/Dtos/SearchRequestDto.cs +++ b/src/platform/mix.shared/Dtos/SearchRequestDto.cs @@ -13,6 +13,7 @@ public class SearchRequestDto public int PageIndex { get; set; } public int? PageSize { get; set; } public string OrderBy { get; set; } = default; + public MixConjunction Conjunction { get; set; } = MixConjunction.And; public SortDirection Direction { get; set; } public MixContentStatus? Status { get; set; } public MixCompareOperator? SearchMethod { get; set; } = MixCompareOperator.Equal; diff --git a/src/platform/mix.shared/Extensions/JObjectExtensions.cs b/src/platform/mix.shared/Extensions/JObjectExtensions.cs new file mode 100644 index 000000000..a34b97f13 --- /dev/null +++ b/src/platform/mix.shared/Extensions/JObjectExtensions.cs @@ -0,0 +1,173 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Shared.Extensions +{ + public static class JObjectExtensions + { + public static JToken FindDiff(this JToken fromValue, JToken toValue) + { + var diff = new JObject(); + + string valueToPrint = string.Empty; + if (JToken.DeepEquals(fromValue, toValue)) return diff; + else if (fromValue == null || toValue == null|| fromValue.Type != toValue.Type) + { + diff["from"] = fromValue; + diff["to"] = toValue; + return diff; + } + + switch (fromValue.Type) + { + case JTokenType.Object: + { + var Initial = fromValue as JObject; + var Updated = toValue as JObject; + var addedKeys = Initial.Properties().Select(c => c.Name).Except(Updated.Properties().Select(c => c.Name)); + var removedKeys = Updated.Properties().Select(c => c.Name).Except(Initial.Properties().Select(c => c.Name)); + var unchangedKeys = Initial.Properties().Where(c => JToken.DeepEquals(c.Value, toValue[c.Name])).Select(c => c.Name); + foreach (var k in addedKeys) + { + diff[k] = new JObject + { + ["to"] = fromValue[k] + }; + } + foreach (var k in removedKeys) + { + diff[k] = new JObject + { + ["from"] = toValue[k] + }; + } + var potentiallyModifiedKeys = Initial.Properties().Select(c => c.Name).Except(addedKeys).Except(unchangedKeys); + foreach (var k in potentiallyModifiedKeys) + { + var foundDiff = Initial[k].FindDiff(Updated[k]); + if (foundDiff == null) + return foundDiff; + + if (foundDiff.HasValues && (foundDiff["from"] != null || foundDiff["to"] != null)) + { + diff[k] = foundDiff; + } + } + } + break; + //"to" indicate the Original Value + //"-" indicate the Updated/Modified Value + case JTokenType.Array: + { + var current = fromValue as JArray; + var newValue = toValue as JArray; + + if (!JToken.DeepEquals(current, newValue)) + { + diff["from"] = current; + diff["to"] = newValue; + } + // var minus = new JArray(current.ExceptAll(newValue, new JTokenEqualityComparer())); + //var plus = new JArray(newValue.ExceptAll(current, new JTokenEqualityComparer())); + //if (minus.HasValues) diff["from"] = minus; + //if (plus.HasValues) diff["to"] = plus; + } + break; + default: + diff["from"] = fromValue; + diff["to"] = toValue; + break; + } + + return diff; + } + + public static bool IsArrayChanged(JToken foundDiff) + { + return foundDiff["from"] != null && foundDiff["from"].Type == JTokenType.Array + || foundDiff["to"] != null && foundDiff["to"].Type == JTokenType.Array; + } + public static bool IsArrayObjectChanged(JToken foundDiff) + { + return foundDiff["from"] != null && foundDiff["from"][0] != null && foundDiff["from"][0].Type == JTokenType.Object + || foundDiff["to"] != null && foundDiff["to"][0] != null && foundDiff["to"][0].Type == JTokenType.Object; + } + + public static IEnumerable ExceptAll( + this IEnumerable first, + IEnumerable second) + { + return first.ExceptAll(second, null); + } + + public static IEnumerable ExceptAll( + this IEnumerable first, + IEnumerable second, + IEqualityComparer comparer) + { + if (first == null) { throw new ArgumentNullException("first"); } + if (second == null) { throw new ArgumentNullException("second"); } + + + var secondCounts = new Dictionary(comparer ?? EqualityComparer.Default); + int count; + int nullCount = 0; + + // Count the values fromValue second + foreach (var item in second) + { + if (item == null) + { + nullCount++; + } + else + { + if (secondCounts.TryGetValue(item, out count)) + { + secondCounts[item] = count + 1; + } + else + { + secondCounts.Add(item, 1); + } + } + } + + // Yield the values fromValue first + foreach (var item in first) + { + if (item == null) + { + nullCount--; + if (nullCount < 0) + { + yield return item; + } + } + else + { + if (secondCounts.TryGetValue(item, out count)) + { + if (count == 0) + { + secondCounts.Remove(item); + yield return item; + } + else + { + secondCounts[item] = count - 1; + } + } + else + { + yield return item; + } + } + } + } + } +} diff --git a/src/platform/mix.shared/Helpers/MixHelper.cs b/src/platform/mix.shared/Helpers/MixHelper.cs index a8c2f6a95..4eb1aea11 100644 --- a/src/platform/mix.shared/Helpers/MixHelper.cs +++ b/src/platform/mix.shared/Helpers/MixHelper.cs @@ -12,7 +12,7 @@ public static bool CopyFolder(string srcPath, string desPath) { if (srcPath.ToLower() != desPath.ToLower() && Directory.Exists(srcPath)) { - //Now Create all of the directories + //Now POST all of the directories foreach (string dirPath in Directory.GetDirectories(srcPath, "*", SearchOption.AllDirectories)) { Directory.CreateDirectory(dirPath.Replace(srcPath, desPath)); diff --git a/src/platform/mix.shared/Models/Configurations/GlobalSettingsModel.cs b/src/platform/mix.shared/Models/Configurations/GlobalSettingsModel.cs index 9e80b9e5f..d22283774 100644 --- a/src/platform/mix.shared/Models/Configurations/GlobalSettingsModel.cs +++ b/src/platform/mix.shared/Models/Configurations/GlobalSettingsModel.cs @@ -14,6 +14,7 @@ public class GlobalSettingsModel : IGlobalConfigurations public string ApiEncryptKey { get; set; } public string AesKey { get; set; } public string DefaultDomain { get; set; } + public string DefaultCulture { get; set; } public bool EnableOcelot { get; set; } public InitStep InitStatus { get; set; } } diff --git a/src/platform/mix.shared/Models/ConnectionStrings.cs b/src/platform/mix.shared/Models/ConnectionStrings.cs index 0479b1d84..1c4a67fe3 100644 --- a/src/platform/mix.shared/Models/ConnectionStrings.cs +++ b/src/platform/mix.shared/Models/ConnectionStrings.cs @@ -3,6 +3,8 @@ public class ConnectionStrings { public string MixAccountConnection { get; set; } + public string MixAuditLogConnection { get; set; } + public string MixQueueLogConnection { get; set; } public string MixCmsConnection { get; set; } public string MixQuartzConnection { get; set; } public string MixDbConnection { get; set; } diff --git a/src/platform/mix.shared/Models/MixDbAuditLogModel.cs b/src/platform/mix.shared/Models/MixDbAuditLogModel.cs new file mode 100644 index 000000000..c7eb559f2 --- /dev/null +++ b/src/platform/mix.shared/Models/MixDbAuditLogModel.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Shared.Models +{ + public sealed class MixDbAuditLogModel + { + public object Id{ get; set; } + public string MixDbName{ get; set; } + public JObject Before { get; set; } + public JObject After { get; set; } + public JObject Body { get; set; } + } +} diff --git a/src/platform/mix.shared/Services/AppSettingServiceBase.cs b/src/platform/mix.shared/Services/AppSettingServiceBase.cs index 63a08816e..ababbd96f 100644 --- a/src/platform/mix.shared/Services/AppSettingServiceBase.cs +++ b/src/platform/mix.shared/Services/AppSettingServiceBase.cs @@ -1,4 +1,7 @@ using Microsoft.Extensions.Configuration; +using Mix.Heart.Extensions; +using Mix.Heart.Helpers; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Mix.Shared.Services @@ -6,28 +9,49 @@ namespace Mix.Shared.Services public abstract class AppSettingServiceBase { private string _filePath; + public JObject RawSettings; protected string _sectionName; + protected bool _isEncrypt; + protected string _aesKey { get; set; } public T AppSettings { get; set; } protected string FilePath { get => _filePath; set => _filePath = value; } protected readonly FileSystemWatcher watcher = new(); protected readonly IConfiguration _configuration; - public AppSettingServiceBase(IConfiguration configuration, string section, string filePath) + public AppSettingServiceBase(IConfiguration configuration, string section, string filePath, bool isEncrypt) { _configuration = configuration; _sectionName = section; + _isEncrypt = isEncrypt; + _aesKey = GlobalConfigService.Instance.AesKey; FilePath = filePath; LoadAppSettings(); } - public bool SaveSettings() + public void SetConfig(string name, TValue value) { - var settings = MixFileHelper.GetFile(FilePath, MixFileExtensions.Json, string.Empty, true, "{}"); + RawSettings[name] = value != null ? JToken.FromObject(value) : null; + AppSettings = RawSettings.ToObject(); + } + + public virtual bool SaveSettings() + { + var settings = MixFileHelper.GetFileByFullName($"{FilePath}{MixFileExtensions.Json}", true, "{}"); if (settings != null) { - settings.Content = new JObject(new JProperty(_sectionName, JObject.FromObject(AppSettings))).ToString(); - return MixFileHelper.SaveFile(settings); + settings.Content = string.IsNullOrEmpty(_sectionName) + ? RawSettings.ToString(Formatting.None) + : ReflectionHelper.ParseObject( + new JObject( + new JProperty(_sectionName, RawSettings))) + .ToString(Formatting.None); + if (_isEncrypt) + { + settings.Content = AesEncryptionHelper.EncryptString(settings.Content, _aesKey); + } + var result = MixFileHelper.SaveFile(settings); + return result; } else { @@ -39,9 +63,26 @@ protected virtual void LoadAppSettings() { try { - var settings = _configuration.GetSection(_sectionName); - AppSettings = (T)Activator.CreateInstance(typeof(T)); - settings.Bind(AppSettings); + var settings = MixFileHelper.GetFileByFullName($"{FilePath}{MixFileExtensions.Json}", true, "{}"); + string content = string.IsNullOrWhiteSpace(settings.Content) ? "{}" : settings.Content; + bool isContentEncrypted = !content.IsJsonString(); + + + if (isContentEncrypted) + { + content = AesEncryptionHelper.DecryptString(content, _aesKey); + } + + var rawSettings = JObject.Parse(content); + RawSettings = !string.IsNullOrEmpty(_sectionName) + ? rawSettings[_sectionName] as JObject + : rawSettings; + AppSettings = RawSettings.ToObject(); + + if (_isEncrypt && !isContentEncrypted) + { + SaveSettings(); + } } catch (Exception ex) { diff --git a/src/platform/mix.shared/Services/AuthConfigService.cs b/src/platform/mix.shared/Services/AuthConfigService.cs index fd8736817..1c970bcb5 100644 --- a/src/platform/mix.shared/Services/AuthConfigService.cs +++ b/src/platform/mix.shared/Services/AuthConfigService.cs @@ -6,7 +6,7 @@ namespace Mix.Shared.Services public class AuthConfigService : AppSettingServiceBase { public AuthConfigService(IConfiguration configuration) - : base(configuration, MixAppSettingsSection.Authentication, MixAppConfigFilePaths.Authentication) + : base(configuration, MixAppSettingsSection.Authentication, MixAppConfigFilePaths.Authentication, true) { } } diff --git a/src/platform/mix.shared/Services/GlobalConfigService.cs b/src/platform/mix.shared/Services/GlobalConfigService.cs index daf008ab7..660c5a547 100644 --- a/src/platform/mix.shared/Services/GlobalConfigService.cs +++ b/src/platform/mix.shared/Services/GlobalConfigService.cs @@ -1,4 +1,5 @@ -using Mix.Shared.Models.Configurations; +using Mix.Heart.Helpers; +using Mix.Shared.Models.Configurations; namespace Mix.Shared.Services { @@ -43,7 +44,7 @@ public GlobalConfigService() public new string AesKey { get => Instance.AppSettings.ApiEncryptKey; - set => Instance.AppSettings.ApiEncryptKey = value; + set => Instance.GetConfig(nameof(GlobalSettingsModel.ApiEncryptKey), value); } public int ResponseCache => AppSettings.ResponseCache; public bool IsInit => AppSettings.IsInit; diff --git a/src/platform/mix.shared/Services/HttpService.cs b/src/platform/mix.shared/Services/HttpService.cs index da261ef3b..20b18b66e 100644 --- a/src/platform/mix.shared/Services/HttpService.cs +++ b/src/platform/mix.shared/Services/HttpService.cs @@ -149,6 +149,18 @@ public Task PostAsync(string requestUrl, T1 body, client => client.PostAsync(requestUrl, content, cancellationToken), bearerToken, requestHeaders); } + public async Task PostAsync(string requestUrl, T body, + string bearerToken = null, + List> requestHeaders = null, + string contentType = "application/json", + CancellationToken cancellationToken = default + ) + { + var content = CreateHttpContent(body, contentType); + await SendRequestAsync( + client => client.PostAsync(requestUrl, content, cancellationToken), bearerToken, requestHeaders); + } + public Task PutAsync(string requestUrl, T1 body, string bearerToken = null, List> requestHeaders = null, @@ -182,8 +194,8 @@ private HttpContent CreateHttpContent(T content, string contentType) } case "application/x-www-form-urlencoded": var formData = content.GetType() - .GetProperties(BindingFlags.Instance | BindingFlags.Public) - .ToDictionary(prop => prop.Name, prop => (string)prop.GetValue(content, null)); + .GetProperties(BindingFlags.Instance | BindingFlags.Public) + .ToDictionary(prop => prop.Name, prop => (string)prop.GetValue(content, null)); return new FormUrlEncodedContent(formData); default: return new StringContent( @@ -192,6 +204,7 @@ private HttpContent CreateHttpContent(T content, string contentType) } + private async Task SendRequestAsync( Func> sendRequestFn, string token = null, @@ -204,6 +217,10 @@ private async Task SendRequestAsync( var obj = JObject.Parse(data); return obj.ToObject(); } + else if (data.IsJArrayString()) + { + return JArray.Parse(data).ToObject(); + } else { return new JObject(new JProperty("data", data)).ToObject(); diff --git a/src/platform/mix.shared/mix.shared.csproj b/src/platform/mix.shared/mix.shared.csproj index a52af86af..3f74d0d0f 100644 --- a/src/platform/mix.shared/mix.shared.csproj +++ b/src/platform/mix.shared/mix.shared.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/platform/mix.signalr.hub/Attributes/MixDbHubAuthorizeAttribute.cs b/src/platform/mix.signalr.hub/Attributes/MixDbHubAuthorizeAttribute.cs new file mode 100644 index 000000000..350d6767f --- /dev/null +++ b/src/platform/mix.signalr.hub/Attributes/MixDbHubAuthorizeAttribute.cs @@ -0,0 +1,155 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Mix.Auth.Constants; +using Mix.Database.Entities.Cms; +using Mix.Service.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; + +namespace Mix.Signalr.Hub.Attributes +{ + public sealed class MixDbHubAuthorizeAttribute : TypeFilterAttribute + { + public MixDbHubAuthorizeAttribute(string tableName) + : base(typeof(DatabaseAuthorizeActionFilter)) + { + Arguments = [tableName]; + } + public class DatabaseAuthorizeActionFilter : IAuthorizationFilter + { + private string _tableName; + public string[] UserRoles { get; set; } + private readonly MixCmsContext _cmsContext; + protected readonly MixPermissionService _permissionService; + private ClaimsPrincipal userPrinciple; + public DatabaseAuthorizeActionFilter( + string tableName, + MixCmsContext cmsContext, + MixPermissionService permissionService) + { + _tableName = tableName; + _cmsContext = cmsContext; + _permissionService = permissionService; + } + + public void OnAuthorization(AuthorizationFilterContext context) + { + userPrinciple = context.HttpContext.User; + if (string.IsNullOrEmpty(_tableName)) + { + _tableName = context.HttpContext.Request.RouteValues["name"]?.ToString(); + } + var database = _cmsContext.MixDatabase.FirstOrDefault(m => m.SystemName == _tableName); + if (database == null) + { + context.Result = new BadRequestResult(); + return; + } + + // Not allow bypass by default for security => if not set, only superadmin can access this database + if (!CheckByPassAuthenticate(context.HttpContext.Request.Method, context.HttpContext.Request.Path, database)) + { + if (ValidToken()) + { + if (!IsInRoles(context.HttpContext.Request.Method, database, context.HttpContext.Request.Path)) + { + if (!ValidEnpointPermission(context)) + { + context.Result = new ForbidResult(); + return; + } + } + } + else + { + context.Result = new UnauthorizedResult(); + return; + } + } + } + + private bool CheckByPassAuthenticate(string method, string path, MixDatabase database) + { + return method switch + { + "GET" => database.ReadPermissions == null + || database.ReadPermissions.Count == 0, + "POST" => (path.EndsWith("filter") && (database.ReadPermissions == null || database.ReadPermissions.Count == 0)) + || (!path.EndsWith("filter") && (database.CreatePermissions == null || database.CreatePermissions.Count == 0)), + "PUT" => database.UpdatePermissions == null + || database.UpdatePermissions.Count == 0, + "PATCH" => database.UpdatePermissions == null + || database.UpdatePermissions.Count == 0, + "DELETE" => database.DeletePermissions == null + || database.DeletePermissions.Count == 0, + _ => false + }; + } + + #region Privates + + private bool ValidEnpointPermission(AuthorizationFilterContext context) + { + return _permissionService.CheckEndpointPermissionAsync( + UserRoles, context.HttpContext.Request.Path, context.HttpContext.Request.Method).Result; + } + + private bool ValidToken() + { + return userPrinciple.Identity.IsAuthenticated + && DateTime.TryParse(GetClaim(userPrinciple, MixClaims.ExpireAt), out var expireAt) + && DateTime.UtcNow < expireAt; + } + + private bool IsInRoles(string method, MixDatabase database, string path) + { + + UserRoles = GetClaim(userPrinciple, MixClaims.Role).Split(',', StringSplitOptions.RemoveEmptyEntries) + .Select(r => r.Trim()).ToArray(); + + if (UserRoles.Any(r => r == MixRoles.SuperAdmin || r == $"{MixRoles.Owner}-1")) + { + return true; + } + + switch (method) + { + case "GET": return CheckUserInRoles(database.ReadPermissions, UserRoles); + case "POST": + if (path.EndsWith("filter")) + { + return CheckUserInRoles(database.ReadPermissions, UserRoles); + } + else + { + return CheckUserInRoles(database.CreatePermissions, UserRoles); + } + case "PATCH": + case "PUT": return CheckUserInRoles(database.UpdatePermissions, UserRoles); + case "DELETE": return CheckUserInRoles(database.DeletePermissions, UserRoles); + default: + return false; + } + } + + private bool CheckUserInRoles(List allowedRoles, string[] userRoles) + { + return allowedRoles == null || allowedRoles.Count == 0 || allowedRoles.Any(r => userRoles.Any(ur => ur == $"{r}-1")); + } + + public string GetClaim(ClaimsPrincipal User, string claimType) + { + if (User == null) + { + return null; + } + return string.Join(',', User.Claims.Where(c => c.Type == claimType).Select(m => m.Value)); + } + #endregion + } + } +} diff --git a/src/platform/mix.signalr.hub/Extensions/ServiceCollectionExtensions.cs b/src/platform/mix.signalr.hub/Extensions/ServiceCollectionExtensions.cs index 00337fef5..4f14cde65 100644 --- a/src/platform/mix.signalr.hub/Extensions/ServiceCollectionExtensions.cs +++ b/src/platform/mix.signalr.hub/Extensions/ServiceCollectionExtensions.cs @@ -10,7 +10,7 @@ public static class ServiceCollectionExtensions public static IEndpointRouteBuilder UseMixSignalRApp(this IEndpointRouteBuilder endpoints) { endpoints.MapHub(HubEndpoints.PortalHub); - endpoints.MapHub(HubEndpoints.MixDbCommandHub); + endpoints.MapHub(HubEndpoints.MixDbHub); endpoints.MapHub(HubEndpoints.LogStreamHub); endpoints.MapHub(HubEndpoints.EditFileHub); endpoints.MapHub(HubEndpoints.MixThemeHub); diff --git a/src/platform/mix.signalr.hub/Hubs/BaseSignalrHub.cs b/src/platform/mix.signalr.hub/Hubs/BaseSignalrHub.cs index 880b53002..966e01d82 100644 --- a/src/platform/mix.signalr.hub/Hubs/BaseSignalrHub.cs +++ b/src/platform/mix.signalr.hub/Hubs/BaseSignalrHub.cs @@ -11,24 +11,23 @@ using Mix.SignalR.Constants; using Mix.SignalR.Enums; using Mix.SignalR.Models; +using System.Collections.Concurrent; using System.Security.Claims; namespace Mix.SignalR.Hubs { public abstract class BaseSignalRHub : Hub { - protected IAuditLogService AuditLogService; protected IMixTenantService MixTenantService; protected HubUserModel? CurrentUser; protected int? TenantId; - protected BaseSignalRHub(IAuditLogService auditLogService, IMixTenantService mixTenantService) + protected BaseSignalRHub(IMixTenantService mixTenantService) { - AuditLogService = auditLogService; MixTenantService = mixTenantService; } - public static Dictionary> Rooms = new Dictionary>(); + public static ConcurrentDictionary> Rooms = new ConcurrentDictionary>(); public virtual async Task Join(string host) { if (MixTenantService.AllTenants == null) @@ -109,21 +108,35 @@ public virtual Task SendGroupMessage(SignalRMessageModel message, string groupNa } catch (Exception ex) { - throw new MixException(Heart.Enums.MixErrorStatus.ServerError, ex); + throw new MixException(MixErrorStatus.ServerError, ex); } } #region Private - protected async Task AddUserToRoom(string roomName) + protected virtual async Task AddUserToRoom(string roomName) { await Groups.AddToGroupAsync(Context.ConnectionId, roomName); - if (!Rooms.ContainsKey(roomName)) + Rooms.TryAdd(roomName, new ConcurrentBag()); + await NotifyNewUser(roomName); + } + + protected HubUserModel GetCurrentUser() + { + var userContext = Context.User; + return new() { - Rooms.Add(roomName, new List()); - } + TenantId = TenantId, + ConnectionId = Context.ConnectionId, + Username = userContext?.Identity?.Name ?? "Anonymous", + Avatar = userContext?.Claims.FirstOrDefault(m => m.Type == MixClaims.Avatar)?.Value ?? MixConstants.CONST_DEFAULT_EXTENSIONS_FILE_PATH, + Role = userContext?.Claims.FirstOrDefault(m => m.Type == MixClaims.Role)?.Value, + }; + } - var users = Rooms[roomName] ?? new(); + protected virtual async Task NotifyNewUser(string roomName) + { + var users = Rooms[roomName] ?? []; if (!users.Any(u => u != null && u.ConnectionId == Context.ConnectionId)) { var user = GetCurrentUser(); @@ -134,20 +147,20 @@ protected async Task AddUserToRoom(string roomName) } await SendMessageToCaller(new(user) { Action = MessageAction.MyConnection }); await SendMessageToCaller(new(users) { Action = MessageAction.MemberList }); - await SendGroupMessage(new(user) { Action = MessageAction.NewMember }, roomName); + await SendGroupMessage(new(user) { Action = MessageAction.MemberOnline }, roomName, true); } } - - - protected HubUserModel GetCurrentUser() + protected virtual async Task RemoveUserFromGroups() { - return new() + foreach (var room in Rooms) { - TenantId = TenantId, - ConnectionId = Context.ConnectionId, - Username = Context.User?.Identity?.Name ?? "Annonymous", - Avatar = Context.User?.Claims.FirstOrDefault(m => m.Type == MixClaims.Avatar)?.Value ?? MixConstants.CONST_DEFAULT_EXTENSIONS_FILE_PATH, - }; + var user = room.Value?.FirstOrDefault(m => m.ConnectionId == Context.ConnectionId); + if (user != null) + { + room.Value?.TryTake(out user); + await SendGroupMessage(new(user) { Action = MessageAction.MemberOffline }, room.Key); + } + } } #endregion @@ -155,26 +168,12 @@ protected HubUserModel GetCurrentUser() public override async Task OnConnectedAsync() { - var user = GetCurrentUser(); - if (user != null) - { - CurrentUser = user; - await SendMessageToCaller(new(user) { Action = MessageAction.MyConnection }); - } await base.OnConnectedAsync().ConfigureAwait(false); } public override async Task OnDisconnectedAsync(Exception? exception) { - foreach (var room in Rooms) - { - var user = room.Value.FirstOrDefault(m => m.ConnectionId == Context.ConnectionId); - if (user != null) - { - room.Value.Remove(user); - await SendGroupMessage(new(user) { Action = MessageAction.MemberOffline }, room.Key); - } - } + await RemoveUserFromGroups(); await base.OnDisconnectedAsync(exception).ConfigureAwait(false); } #endregion diff --git a/src/platform/mix.signalr.hub/Hubs/EditFileHub.cs b/src/platform/mix.signalr.hub/Hubs/EditFileHub.cs index 41241725d..b0cad5cce 100644 --- a/src/platform/mix.signalr.hub/Hubs/EditFileHub.cs +++ b/src/platform/mix.signalr.hub/Hubs/EditFileHub.cs @@ -4,8 +4,8 @@ namespace Mix.SignalR.Hubs { public class EditFileHub : BaseSignalRHub { - public EditFileHub(IAuditLogService auditLogService, IMixTenantService mixTenantService) - : base(auditLogService, mixTenantService) + public EditFileHub(IMixTenantService mixTenantService) + : base(mixTenantService) { } } diff --git a/src/platform/mix.signalr.hub/Hubs/HighFrequencyHub.cs b/src/platform/mix.signalr.hub/Hubs/HighFrequencyHub.cs index 9fc1227e5..a7b2d9d11 100644 --- a/src/platform/mix.signalr.hub/Hubs/HighFrequencyHub.cs +++ b/src/platform/mix.signalr.hub/Hubs/HighFrequencyHub.cs @@ -8,8 +8,8 @@ namespace Mix.SignalR.Hubs { public class HighFrequencyHub : BaseSignalRHub { - public HighFrequencyHub(IAuditLogService auditLogService, IMixTenantService mixTenantService) - : base(auditLogService, mixTenantService) + public HighFrequencyHub(IMixTenantService mixTenantService) + : base(mixTenantService) { } public async Task UploadStream(IAsyncEnumerable stream, string room) diff --git a/src/platform/mix.signalr.hub/Hubs/LogStreamHub.cs b/src/platform/mix.signalr.hub/Hubs/LogStreamHub.cs index 797ecc784..7a4f8ac1c 100644 --- a/src/platform/mix.signalr.hub/Hubs/LogStreamHub.cs +++ b/src/platform/mix.signalr.hub/Hubs/LogStreamHub.cs @@ -5,8 +5,8 @@ namespace Mix.SignalR.Hubs { public class LogStreamHub : BaseSignalRHub { - public LogStreamHub(IAuditLogService auditLogService, IMixTenantService mixTenantService) - : base(auditLogService, mixTenantService) + public LogStreamHub(IMixTenantService mixTenantService) + : base(mixTenantService) { } } diff --git a/src/platform/mix.signalr.hub/Hubs/MixDbCommandHub.cs b/src/platform/mix.signalr.hub/Hubs/MixDbCommandHub.cs deleted file mode 100644 index 8cdf1302e..000000000 --- a/src/platform/mix.signalr.hub/Hubs/MixDbCommandHub.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Mix.Constant.Constants; -using Mix.Heart.Helpers; -using Mix.Lib.Interfaces; -using Mix.Mq.Lib.Models; -using Mix.Queue.Interfaces; -using Mix.Service.Interfaces; -using Mix.Service.Models; -using Mix.Signalr.Hub.Models; -using Mix.SignalR.Constants; -using Mix.SignalR.Models; - -namespace Mix.SignalR.Hubs -{ - public class MixDbCommandHub : BaseSignalRHub - { - private readonly IMemoryQueueService _queueService; - public MixDbCommandHub(IAuditLogService auditLogService, IMixTenantService mixTenantService, IMemoryQueueService queueService) : base(auditLogService, mixTenantService) - { - _queueService = queueService; - } - - public virtual void CreateData(string message) - { - var obj = ReflectionHelper.ParseStringToObject(message); - obj.MixTenantId = CurrentUser?.TenantId ?? 1; - obj.RequestedBy = Context.User?.Identity?.Name; - obj.ConnectionId = Context.ConnectionId; - _queueService.PushMemoryQueue(obj.MixTenantId, MixQueueTopics.MixDbCommand, MixDbCommandQueueActions.Create, obj); - } - - public virtual void UpdateData(string message) - { - var obj = ReflectionHelper.ParseStringToObject(message); - obj.RequestedBy = Context.User?.Identity?.Name; - obj.ConnectionId = Context.ConnectionId; - _queueService.PushMemoryQueue(obj.MixTenantId, MixQueueTopics.MixDbCommand, MixDbCommandQueueActions.Update, obj); - } - } -} \ No newline at end of file diff --git a/src/platform/mix.signalr.hub/Hubs/MixDbHub.cs b/src/platform/mix.signalr.hub/Hubs/MixDbHub.cs new file mode 100644 index 000000000..cfc757681 --- /dev/null +++ b/src/platform/mix.signalr.hub/Hubs/MixDbHub.cs @@ -0,0 +1,221 @@ +using Google.Api; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; +using Mix.Auth.Constants; +using Mix.Constant.Constants; +using Mix.Constant.Enums; +using Mix.Database.Entities.Cms; +using Mix.Heart.Helpers; +using Mix.Heart.UnitOfWork; +using Mix.Lib.Interfaces; +using Mix.Mq.Lib.Models; +using Mix.Queue.Interfaces; +using Mix.Service.Interfaces; +using Mix.Service.Models; +using Mix.Signalr.Hub.Models; +using Mix.SignalR.Constants; +using Mix.SignalR.Enums; +using Mix.SignalR.Models; +using Newtonsoft.Json.Linq; +using System.Security.Claims; + +namespace Mix.SignalR.Hubs +{ + [Authorize] + public class MixDbHub : BaseSignalRHub + { + private readonly IMixMemoryCacheService _memoryCache; + private readonly MixCmsContext _ctx; + private readonly IMemoryQueueService _queueService; + public MixDbHub(IMixTenantService mixTenantService, IMemoryQueueService queueService, IMixMemoryCacheService memoryCache, MixCmsContext ctx) + : base(mixTenantService) + { + _queueService = queueService; + _memoryCache = memoryCache; + _ctx = ctx; + } + + #region Methods + + public async void JoinRooms(string[] roomNames) + { + foreach (var tableName in roomNames) + { + if (await CheckUserPermission(tableName, "GET")) + { + await AddUserToRoom($"mixdb-{tableName}"); + } + } + } + + public virtual async Task CreateDataAsync(string tableName, JObject data) + { + + if (await CheckUserPermission(tableName, "POST")) + { + var obj = new MixDbCommandModel() + { + MixDbName = tableName, + Body = data, + ConnectionId = Context.ConnectionId, + MixTenantId = 1, + RequestedBy = GetCurrentUser().Username + }; + _queueService.PushMemoryQueue(obj.MixTenantId, MixQueueTopics.MixDbCommand, MixDbCommandQueueAction.POST.ToString(), obj); + } + } + + public virtual async Task DeleteDataAsync(string tableName, JObject data) + { + + if (await CheckUserPermission(tableName, "DELETE")) + { + var obj = new MixDbCommandModel() + { + MixDbName = tableName, + Body = data, + ConnectionId = Context.ConnectionId, + MixTenantId = 1, + RequestedBy = GetCurrentUser().Username + }; + _queueService.PushMemoryQueue(obj.MixTenantId, MixQueueTopics.MixDbCommand, MixDbCommandQueueAction.DELETE.ToString(), obj); + } + } + + public virtual async Task UpdateData(string tableName, JObject data) + { + if (await CheckUserPermission(tableName, "PUT")) + { + var obj = new MixDbCommandModel() + { + MixDbName = tableName, + Body = data, + ConnectionId = Context.ConnectionId, + MixTenantId = 1, + RequestedBy = GetCurrentUser().Username + }; + _queueService.PushMemoryQueue(obj.MixTenantId, MixQueueTopics.MixDbCommand, MixDbCommandQueueAction.PUT.ToString(), obj); + } + } + #endregion + #region Private + + private async Task CheckUserPermission(string tableName, string action) + { + try + { + var tbl = await GetMixDatabase(tableName); + if (tbl == null) + { + await SendErrorMessageToCaller($"Invalid table name {tableName}"); + return false; + } + + if (CheckByPassAuthenticate(action, tbl)) + { + return true; + } + + if (Context.User == null) + { + await SendErrorMessageToCaller($"Unauthorized"); + return false; + } + + if (!IsInRoles(action, tbl)) + { + await SendErrorMessageToCaller($"You don't have permission to access {tableName}"); + return false; + } + + return true; + } + catch (Exception ex) + { + await SendErrorMessageToCaller(ex.Message); + return false; + } + + } + + private bool IsInRoles(string method, MixDatabase database) + { + + var userRoles = GetClaim(Context.User!, MixClaims.Role).Split(',', StringSplitOptions.RemoveEmptyEntries) + .Select(r => r.Trim()).ToArray(); + + if (userRoles.Any(r => r == MixRoles.SuperAdmin || r == $"{MixRoles.Owner}-1")) + { + return true; + } + + switch (method) + { + case "GET": return CheckUserInRoles(database.ReadPermissions, userRoles); + case "POST": + return CheckUserInRoles(database.CreatePermissions, userRoles); + case "PATCH": + case "PUT": return CheckUserInRoles(database.UpdatePermissions, userRoles); + case "DELETE": return CheckUserInRoles(database.DeletePermissions, userRoles); + default: + return false; + } + } + + private bool CheckUserInRoles(List allowedRoles, string[] userRoles) + { + return allowedRoles == null || allowedRoles.Count == 0 || allowedRoles.Any(r => userRoles.Any(ur => ur == $"{r}-1")); + } + + private string GetClaim(ClaimsPrincipal User, string claimType) + { + if (User == null) + { + return null; + } + return string.Join(',', User.Claims.Where(c => c.Type == claimType).Select(m => m.Value)); + } + + private bool CheckByPassAuthenticate(string method, MixDatabase database) + { + return method switch + { + "GET" => database.ReadPermissions == null + || database.ReadPermissions.Count == 0, + "POST" => database.CreatePermissions == null + || database.CreatePermissions.Count == 0, + "PUT" => database.UpdatePermissions == null + || database.UpdatePermissions.Count == 0, + "PATCH" => database.UpdatePermissions == null + || database.UpdatePermissions.Count == 0, + "DELETE" => database.DeletePermissions == null + || database.DeletePermissions.Count == 0, + _ => false + }; + } + + private async Task SendErrorMessageToCaller(string errMsg) + { + await SendMessageToCaller(new SignalRMessageModel() + { + Type = MessageType.Error, + Message = errMsg, + }); + } + + private async Task GetMixDatabase(string tableName) + { + return await _memoryCache.TryGetValueAsync( + tableName, + cache => + { + cache.SlidingExpiration = TimeSpan.FromSeconds(20); + var db = _ctx.MixDatabase.SingleOrDefault(m => m.SystemName == tableName); + return Task.FromResult(db); + } + ); + } + #endregion + } +} \ No newline at end of file diff --git a/src/platform/mix.signalr.hub/Hubs/MixThemeHub.cs b/src/platform/mix.signalr.hub/Hubs/MixThemeHub.cs index d9da6d739..4734e870e 100644 --- a/src/platform/mix.signalr.hub/Hubs/MixThemeHub.cs +++ b/src/platform/mix.signalr.hub/Hubs/MixThemeHub.cs @@ -5,8 +5,8 @@ namespace Mix.SignalR.Hubs { public class MixThemeHub : BaseSignalRHub { - public MixThemeHub(IAuditLogService auditLogService, IMixTenantService mixTenantService) - : base(auditLogService, mixTenantService) + public MixThemeHub(IMixTenantService mixTenantService) + : base(mixTenantService) { } } diff --git a/src/platform/mix.signalr.hub/Hubs/PortalHub.cs b/src/platform/mix.signalr.hub/Hubs/PortalHub.cs index f5fee1d4c..8286c1504 100644 --- a/src/platform/mix.signalr.hub/Hubs/PortalHub.cs +++ b/src/platform/mix.signalr.hub/Hubs/PortalHub.cs @@ -5,8 +5,8 @@ namespace Mix.SignalR.Hubs { public class PortalHub : BaseSignalRHub { - public PortalHub(IAuditLogService auditLogService, IMixTenantService mixTenantService) - : base(auditLogService, mixTenantService) + public PortalHub(IMixTenantService mixTenantService) + : base(mixTenantService) { } } diff --git a/src/platform/mix.signalr.hub/Hubs/VideoCallHub.cs b/src/platform/mix.signalr.hub/Hubs/VideoCallHub.cs index 75377379e..00c33e456 100644 --- a/src/platform/mix.signalr.hub/Hubs/VideoCallHub.cs +++ b/src/platform/mix.signalr.hub/Hubs/VideoCallHub.cs @@ -21,8 +21,8 @@ public class VideoCallHub : BaseSignalRHub private static readonly List UserCalls = new(); private static readonly List CallOffers = new(); - public VideoCallHub(IAuditLogService auditLogService, IMixTenantService mixTenantService) - : base(auditLogService, mixTenantService) + public VideoCallHub(IMixTenantService mixTenantService) + : base(mixTenantService) { } @@ -77,7 +77,7 @@ public async Task CallUser(string targetConnectionId) // They are here, so tell them someone wants to talk await Clients.Client(targetConnectionId).SendAsync("incomingCall", JObject.FromObject(callingUser).ToString(Newtonsoft.Json.Formatting.None)); - // Create an offer + // POST an offer CallOffers.Add(new CallOffer { Caller = callingUser, @@ -131,7 +131,7 @@ public async Task AnswerCall(bool acceptCall, string targetConnectionId) // Remove all the other offers for the call initiator, in case they have multiple calls out CallOffers.RemoveAll(c => c.Caller.ConnectionId == targetUser.ConnectionId); - // Create a new call to match these folks up + // POST a new call to match these folks up UserCalls.Add(new UserCall { Users = new List { callingUser, targetUser } @@ -140,7 +140,7 @@ public async Task AnswerCall(bool acceptCall, string targetConnectionId) // Tell the original caller that the call was accepted await Clients.Client(targetConnectionId).SendAsync("callAccepted", JObject.FromObject(callingUser).ToString(Newtonsoft.Json.Formatting.None)); - // Update the user list, since thes two are now in a call + // PUT the user list, since thes two are now in a call await SendUserListUpdateAsync(); } diff --git a/src/platform/mix.signalr/ConfigureJwtBearerOptions.cs b/src/platform/mix.signalr/ConfigureJwtBearerOptions.cs index b71b1b73e..03239e852 100644 --- a/src/platform/mix.signalr/ConfigureJwtBearerOptions.cs +++ b/src/platform/mix.signalr/ConfigureJwtBearerOptions.cs @@ -25,7 +25,7 @@ public void PostConfigure(string name, JwtBearerOptions options) if (!string.IsNullOrEmpty(accessToken) && (path.StartsWithSegments("/hub"))) { - // Read the token out of the query string + // GET the token out of the query string context.Token = accessToken; } return Task.CompletedTask; diff --git a/src/platform/mix.signalr/Constants/HubEndpoints.cs b/src/platform/mix.signalr/Constants/HubEndpoints.cs index a71b5ba38..33565d3cf 100644 --- a/src/platform/mix.signalr/Constants/HubEndpoints.cs +++ b/src/platform/mix.signalr/Constants/HubEndpoints.cs @@ -4,7 +4,7 @@ public class HubEndpoints { public const string MixThemeHub = "/hub/mixThemeHub"; public const string PortalHub = "/hub/portalhub"; - public const string MixDbCommandHub = "/hub/mixDbCommandHub"; + public const string MixDbHub = "/hub/mixDbHub"; public const string LogStreamHub = "/hub/log-stream-hub"; public const string EditFileHub = "/hub/editFileHub"; public const string HighFrequencyHub = "/hub/highFrequencyHub"; diff --git a/src/platform/mix.signalr/Enums/MessageAction.cs b/src/platform/mix.signalr/Enums/MessageAction.cs index 4a633f9b1..3f43146cb 100644 --- a/src/platform/mix.signalr/Enums/MessageAction.cs +++ b/src/platform/mix.signalr/Enums/MessageAction.cs @@ -4,7 +4,7 @@ public enum MessageAction { MyConnection, MemberList, - NewMember, + MemberOnline, NewMessage, NewQueueMessage, MemberOffline diff --git a/src/platform/mix.signalr/Models/HubUserModel.cs b/src/platform/mix.signalr/Models/HubUserModel.cs index 20c909d3a..1f1bb239e 100644 --- a/src/platform/mix.signalr/Models/HubUserModel.cs +++ b/src/platform/mix.signalr/Models/HubUserModel.cs @@ -6,11 +6,13 @@ public class HubUserModel public string ConnectionId { get; set; } public string Username { get; set; } public string Avatar { get; set; } + public string Role { get; set; } public HubUserModel() { } + public HubUserModel(string fromName) { Username = fromName; diff --git a/src/platform/mix.signalr/ServiceCollectionExtensions.cs b/src/platform/mix.signalr/ServiceCollectionExtensions.cs index 5f04b206d..03dadd81b 100644 --- a/src/platform/mix.signalr/ServiceCollectionExtensions.cs +++ b/src/platform/mix.signalr/ServiceCollectionExtensions.cs @@ -13,13 +13,19 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddMixSignalR(this IServiceCollection services, IConfiguration configuration) { string azureConnectionString = configuration.GetSection("Azure")["SignalRConnectionString"]; - services.AddSignalR() - .AddJsonProtocol(options => - { - options.PayloadSerializerOptions.Converters - .Add(new JsonStringEnumConverter()); - }) - .AddAzureSignalRIf(azureConnectionString); + + services + .AddSignalR(options => + { + options.EnableDetailedErrors = true; + options.MaximumReceiveMessageSize = 15360; + }) + .AddJsonProtocol(options => + { + options.PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter()); + }) + .AddAzureSignalRIf(azureConnectionString); + services.TryAddEnumerable( ServiceDescriptor.Singleton, ConfigureJwtBearerOptions>()); diff --git a/src/platform/mix.signalr/mix.signalr.csproj b/src/platform/mix.signalr/mix.signalr.csproj index 4c89adf1c..a7a7fa020 100644 --- a/src/platform/mix.signalr/mix.signalr.csproj +++ b/src/platform/mix.signalr/mix.signalr.csproj @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/src/platform/mix.storage.lib/Engines/Base/UploaderBase.cs b/src/platform/mix.storage.lib/Engines/Base/UploaderBase.cs index 6611338a2..31d2a86b4 100644 --- a/src/platform/mix.storage.lib/Engines/Base/UploaderBase.cs +++ b/src/platform/mix.storage.lib/Engines/Base/UploaderBase.cs @@ -8,7 +8,7 @@ namespace Mix.Storage.Lib.Engines.Base { public abstract class UploaderBase : IMixUploader { - protected ISession Session; + protected ISession? Session; protected readonly IConfiguration Configuration; protected UnitOfWorkInfo CmsUow; private MixTenantSystemModel _currentTenant; @@ -16,7 +16,10 @@ protected MixTenantSystemModel CurrentTenant { get { - _currentTenant ??= Session.Get(MixRequestQueryKeywords.Tenant); + _currentTenant ??= Session?.Get(MixRequestQueryKeywords.Tenant) ?? new MixTenantSystemModel() + { + Id = 1 + }; return _currentTenant; } } @@ -25,7 +28,7 @@ protected UploaderBase(IHttpContextAccessor httpContextAccessor, IConfiguration { CmsUow = cmsUow; Configuration = configuration; - Session = httpContextAccessor?.HttpContext?.Session ?? throw new MixException(MixErrorStatus.Badrequest, "Session not found."); ; + Session = httpContextAccessor?.HttpContext?.Session; } public async Task CreateMedia(string fullname, int tenantId, string? createdBy, CancellationToken cancellationToken = default) diff --git a/src/platform/mix.storage.lib/Helpers/ImageHelper.cs b/src/platform/mix.storage.lib/Helpers/ImageHelper.cs index 09d616193..e844916a8 100644 --- a/src/platform/mix.storage.lib/Helpers/ImageHelper.cs +++ b/src/platform/mix.storage.lib/Helpers/ImageHelper.cs @@ -1,7 +1,9 @@ using Mix.Identity.ViewModels; using Mix.Storage.Lib.Models; using Org.BouncyCastle.Utilities; +using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.Processing; using System; using System.Collections.Generic; using System.Drawing.Imaging; diff --git a/src/platform/mix.storage.lib/Subscribers/StorageBackgroundTaskSubscriber.cs b/src/platform/mix.storage.lib/Subscribers/StorageBackgroundTaskSubscriber.cs index 6c106c858..29f7c8cc4 100644 --- a/src/platform/mix.storage.lib/Subscribers/StorageBackgroundTaskSubscriber.cs +++ b/src/platform/mix.storage.lib/Subscribers/StorageBackgroundTaskSubscriber.cs @@ -43,7 +43,7 @@ public StorageBackgroundTaskSubscriber( PortalHub = portalHub; } - public override async Task Handler(MessageQueueModel model) + public override async Task Handler(MessageQueueModel model, CancellationToken cancellationToken) { if (!allowActions.Contains(model.Action)) { @@ -56,11 +56,8 @@ public override async Task Handler(MessageQueueModel model) switch (model.Action) { case MixQueueActions.ScaleImage: - using (ServiceScope = ServicesProvider.CreateScope()) - { - MixStorageService srv = GetRequiredService(); - await srv.ScaleImage(model.Data); - } + MixStorageService srv = GetRequiredService(); + await srv.ScaleImage(model.Data); break; } } diff --git a/src/platform/mix.storage.lib/mix.storage.lib.csproj b/src/platform/mix.storage.lib/mix.storage.lib.csproj index 94e1dfeb4..c270e8fd7 100644 --- a/src/platform/mix.storage.lib/mix.storage.lib.csproj +++ b/src/platform/mix.storage.lib/mix.storage.lib.csproj @@ -8,9 +8,9 @@ - - - + + + diff --git a/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentGateway.cs b/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentGateway.cs index afebc6f07..ed02a3ac8 100644 --- a/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentGateway.cs +++ b/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentGateway.cs @@ -2,6 +2,7 @@ { public enum PaymentGateway { + Payoo, Onepay, Paypal, Momo diff --git a/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentStatus.cs b/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentStatus.cs index 72e89450c..e7f64f69d 100644 --- a/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentStatus.cs +++ b/src/services/core/ecommerces/mix.services.ecommerce.lib/Enums/PaymentStatus.cs @@ -2,10 +2,10 @@ { public enum PaymentStatus { - SENT, - PENDING, - SUCCESS, - FAILED, - INVALIDRESPONSE + Sent, + Pending, + Success, + Failed, + InvalidResponse } } diff --git a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/EcommerceService.cs b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/EcommerceService.cs index 2e2fcfbec..cc8c68d7f 100644 --- a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/EcommerceService.cs +++ b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/EcommerceService.cs @@ -117,7 +117,7 @@ public virtual async Task UpdateOrderStatus(int orderId, OrderStatus orderStatus await LogAction(orderId, OrderTrackingAction.PAID); break; case OrderStatus.SHIPPING: - if (order.PaymentStatus != PaymentStatus.SUCCESS) + if (order.PaymentStatus != PaymentStatus.Success) { throw new MixException(MixErrorStatus.Badrequest, "Cannot ship unpaid order"); } @@ -336,7 +336,7 @@ public virtual async Task ProcessPaymentResponse( throw new MixException(MixErrorStatus.ServerError, $"Not Implement {order.PaymentGateway} payment"); } - if (order.PaymentStatus != PaymentStatus.SUCCESS && order.PaymentStatus != PaymentStatus.FAILED) + if (order.PaymentStatus != PaymentStatus.Success && order.PaymentStatus != PaymentStatus.Failed) { order.PaymentResponse = paymentResponse; order.PaymentStatus = await paymentService.ProcessPaymentResponse(order, paymentResponse, cancellationToken); @@ -344,7 +344,7 @@ public virtual async Task ProcessPaymentResponse( } - if (order.PaymentStatus == PaymentStatus.SUCCESS) + if (order.PaymentStatus == PaymentStatus.Success) { order.OrderStatus = OrderStatus.PAID; if (!string.IsNullOrEmpty(order.Email)) diff --git a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OnepayService.cs b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OnepayService.cs index 65f889cb7..8551cdcc1 100644 --- a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OnepayService.cs +++ b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OnepayService.cs @@ -95,7 +95,7 @@ public string CreateSHA256Signature(Dictionary parameters) // remove trailing & from string if (sb.Length > 0) sb.Remove(sb.Length - 1, 1); - // Create secureHash on string + // POST secureHash on string string hexHash = ""; using (HMACSHA256 hasher = new(convertedHash)) { @@ -155,22 +155,22 @@ public async Task ProcessPaymentResponse(OrderViewModel orderDeta var response = responseObj.ToObject() ?? throw new MixException(MixErrorStatus.Badrequest, "Cannot convert response."); - var paymentStatus = PaymentStatus.SUCCESS; + var paymentStatus = PaymentStatus.Success; if (!response.vpc_TxnResponseCode.Equals("0") && !string.IsNullOrEmpty(response.vpc_Message)) { if (!string.IsNullOrEmpty(response.vpc_SecureHash)) { if (!Settings.SecureHashKey.Equals(response.vpc_SecureHash)) { - paymentStatus = PaymentStatus.INVALIDRESPONSE; + paymentStatus = PaymentStatus.InvalidResponse; } } - paymentStatus = PaymentStatus.PENDING; + paymentStatus = PaymentStatus.Pending; } if (string.IsNullOrEmpty(response.vpc_SecureHash)) { - paymentStatus = PaymentStatus.INVALIDRESPONSE; + paymentStatus = PaymentStatus.InvalidResponse; } Dictionary parameters = ReflectionHelper.ConverObjectToDictinary(response); var secureHashKey = CreateSHA256Signature(parameters); diff --git a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OrderService.cs b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OrderService.cs index bbbf63404..fea5fe327 100644 --- a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OrderService.cs +++ b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/OrderService.cs @@ -80,7 +80,7 @@ public async Task CancelOrder( var user = await _userManager.GetUserAsync(principal) ?? throw new MixException(MixErrorStatus.Badrequest, "User not found"); var order = await OrderViewModel.GetRepository(_uow, CacheService).GetSingleAsync(m => m.Id == id && m.UserId == user!.Id, cancellationToken) ?? throw new MixException(MixErrorStatus.Badrequest, "Invalid Order"); - if (order.PaymentStatus == PaymentStatus.SUCCESS) + if (order.PaymentStatus == PaymentStatus.Success) { throw new MixException(MixErrorStatus.Badrequest, "Cannot cancel paid order"); } diff --git a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/PaypalService.cs b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/PaypalService.cs index c8c4f0c94..ede111ff2 100644 --- a/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/PaypalService.cs +++ b/src/services/core/ecommerces/mix.services.ecommerce.lib/Services/PaypalService.cs @@ -76,7 +76,7 @@ public async Task ProcessPaymentResponse(OrderViewModel orderDeta { try { - if (orderDetail.PaymentStatus == PaymentStatus.SUCCESS || orderDetail.PaymentStatus == PaymentStatus.FAILED) + if (orderDetail.PaymentStatus == PaymentStatus.Success || orderDetail.PaymentStatus == PaymentStatus.Failed) { return orderDetail.PaymentStatus; } @@ -84,7 +84,7 @@ public async Task ProcessPaymentResponse(OrderViewModel orderDeta string? token = response.Value("token"); string? payerId = response.Value("PayerID"); var result = await CaptureOrderResult(token); - if (string.IsNullOrEmpty(result?.id) && orderDetail.PaymentStatus == PaymentStatus.SENT) + if (string.IsNullOrEmpty(result?.id) && orderDetail.PaymentStatus == PaymentStatus.Sent) { result = await GetOrderResult(token); } @@ -95,7 +95,7 @@ public async Task ProcessPaymentResponse(OrderViewModel orderDeta } var reference = result.purchase_units[0].reference_id; - var status = !string.IsNullOrEmpty(reference) ? PaymentStatus.SUCCESS : PaymentStatus.FAILED; + var status = !string.IsNullOrEmpty(reference) ? PaymentStatus.Success : PaymentStatus.Failed; await SaveResponse(result, status, cancellationToken); return status; diff --git a/src/services/core/ecommerces/mix.services.ecommerce.lib/ViewModels/OrderItemViewModel.cs b/src/services/core/ecommerces/mix.services.ecommerce.lib/ViewModels/OrderItemViewModel.cs index 8dc3fbba0..58bfad52e 100644 --- a/src/services/core/ecommerces/mix.services.ecommerce.lib/ViewModels/OrderItemViewModel.cs +++ b/src/services/core/ecommerces/mix.services.ecommerce.lib/ViewModels/OrderItemViewModel.cs @@ -79,7 +79,7 @@ protected override async Task SaveEntityRelationshipAsync(OrderItem parentEntity ParentId = parentEntity.OrderDetailId, ChildId = parentEntity.Id, ChildDatabaseName = EcommerceConstants.DataTableNameOrderItem, - CreatedDateTime = DateTime.Now, + CreatedDateTime = DateTime.UtcNow, CreatedBy = CreatedBy, MixTenantId = MixTenantId }; diff --git a/src/services/core/graphql/mix.services.graphql.lib/ServiceCollectionExtensions.cs b/src/services/core/graphql/mix.services.graphql.lib/ServiceCollectionExtensions.cs index 9d7d05497..4e3d9a9ec 100644 --- a/src/services/core/graphql/mix.services.graphql.lib/ServiceCollectionExtensions.cs +++ b/src/services/core/graphql/mix.services.graphql.lib/ServiceCollectionExtensions.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Mix.Constant.Constants; using Mix.Database.Services; using Mix.Mixdb.Services; using Mix.Services.Graphql.Lib.Entities; @@ -28,8 +29,10 @@ public static IServiceCollection AddMixGraphQL(this IServiceCollection services) services.TryAddSingleton(); services.TryAddSingleton((resolver) => { + string mixdbCnn = dbService.GetConnectionString(MixConstants.CONST_MIXDB_CONNECTION); var runtimeDbContextService = resolver.GetRequiredService(); - var dbContext = runtimeDbContextService.GetMixDatabaseDbContext()!; + runtimeDbContextService.LoadDbContextAssembly(mixdbCnn); + var dbContext = runtimeDbContextService.GetMixDatabaseDbContext(mixdbCnn)!; var tableNameLookup = resolver.GetRequiredService(); DatabaseMetadata metaDatabase = new(dbContext, tableNameLookup); var schema = new Schema { Query = new GraphQLQuery(dbContext, metaDatabase, tableNameLookup) }; diff --git a/src/services/core/graphql/mix.services.graphql.lib/mix.services.graphql.lib.csproj b/src/services/core/graphql/mix.services.graphql.lib/mix.services.graphql.lib.csproj index 47dc8043b..a778d93b5 100644 --- a/src/services/core/graphql/mix.services.graphql.lib/mix.services.graphql.lib.csproj +++ b/src/services/core/graphql/mix.services.graphql.lib/mix.services.graphql.lib.csproj @@ -18,8 +18,8 @@ - - + + diff --git a/src/services/core/graphql/mix.services.graphql/mix.services.graphql.csproj b/src/services/core/graphql/mix.services.graphql/mix.services.graphql.csproj index e9f152b03..09a53d223 100644 --- a/src/services/core/graphql/mix.services.graphql/mix.services.graphql.csproj +++ b/src/services/core/graphql/mix.services.graphql/mix.services.graphql.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/src/services/core/mix-auth-service/mix.auth.api/Controllers/MixAccountController.cs b/src/services/core/mix-auth-service/mix.auth.api/Controllers/MixAccountController.cs new file mode 100644 index 000000000..965708a94 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Controllers/MixAccountController.cs @@ -0,0 +1,569 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.EntityFrameworkCore; +using Mix.Database.Entities.Account; +using Mix.Database.Services; +using Mix.Heart.Models; +using Mix.Identity.Domain.Models; +using Mix.Identity.Models; +using Mix.Lib.Services; +using Mix.RepoDb.Repositories; +using Mix.Shared.Services; +using Newtonsoft.Json; +using RepoDb; +using System.Linq.Expressions; +using Mix.Queue.Interfaces; +using Newtonsoft.Json.Linq; +using System.Web; +using Mix.Identity.Models.ManageViewModels; +using Mix.Lib.Interfaces; +using Mix.Auth.Dtos; +using Mix.Auth.Models.OAuthRequests; +using Mix.Identity.Interfaces; +using Mix.Mq.Lib.Models; +using Mix.RepoDb.Interfaces; +using Mix.Service.Commands; +using MySqlX.XDevAPI.Common; + +namespace mix.auth.service.Controllers +{ + [Route("api/v2/rest/auth/user")] + public class MixAccountController : MixTenantApiControllerBase + { + private readonly TenantUserManager _userManager; + private readonly SignInManager _signInManager; + private readonly RoleManager _roleManager; + private readonly MixIdentityService _idService; + private readonly IOAuthTokenService _oauthTokenService; + private readonly IMixEdmService _edmService; + private readonly IMixDbDataService _mixDbDataService; + private readonly EntityRepository _repository; + private readonly MixRepoDbRepository _repoDbRepository; + private readonly UnitOfWorkInfo _accountUow; + private readonly UnitOfWorkInfo _cmsUow; + private readonly MixCmsAccountContext _accContext; + private readonly EntityRepository _refreshTokenRepo; + private readonly AuthConfigService _authConfigService; + + public MixAccountController( + TenantUserManager userManager, + SignInManager signInManager, + RoleManager roleManager, + MixIdentityService idService, + EntityRepository refreshTokenRepo, + MixCmsAccountContext accContext, + MixCmsContext cmsContext, + MixRepoDbRepository repoDbRepository, + IHttpContextAccessor httpContextAccessor, + IConfiguration configuration, + MixCacheService mixService, + TranslatorService translator, + MixIdentityService mixIdentityService, + IMemoryQueueService queueService, + AuthConfigService authConfigService, + IMixEdmService edmService, + IMixTenantService mixTenantService, + IOAuthTokenService authResultService, + IMixDbDataService mixDbDataService) + : base(httpContextAccessor, configuration, mixService, + translator, mixIdentityService, queueService, mixTenantService) + { + _userManager = userManager; + _signInManager = signInManager; + _roleManager = roleManager; + _idService = idService; + _refreshTokenRepo = refreshTokenRepo; + _accountUow = new(accContext); + _cmsUow = new(cmsContext); + _repository = new(_accountUow); + _accContext = accContext; + + + _repoDbRepository = repoDbRepository; + _authConfigService = authConfigService; + _edmService = edmService; + _oauthTokenService = authResultService; + _mixDbDataService = mixDbDataService; + } + + #region Overrides + + public override void OnActionExecuted(ActionExecutedContext context) + { + if (_accountUow.ActiveTransaction != null) + { + _accountUow.Complete(); + } + + if (_cmsUow.ActiveTransaction != null) + { + _cmsUow.Complete(); + } + + base.OnActionExecuted(context); + } + + #endregion + + [MixAuthorize] + [Route("my-tenants")] + [HttpGet] + public async Task MyTenants() + { + var userId = Guid.Parse(_idService.GetClaim(User, MixClaims.Id)); + var tenantIds = await _accContext.MixUserTenants.Where(m => m.MixUserId == userId).Select(m => m.TenantId) + .ToListAsync(); + var tenants = await MixTenantSystemViewModel.GetRepository(_cmsUow, CacheService) + .GetListAsync(m => tenantIds.Contains(m.Id)); + return Ok(tenants); + } + + [Route("register")] + [HttpPost] + [AllowAnonymous] + public async Task Register([FromBody] RegisterRequestModel model) + { + await _idService.RegisterAsync(model, CurrentTenant.Id, _cmsUow); + var user = await _userManager.FindByNameAsync(model.UserName).ConfigureAwait(false); + var result = await _idService.GetAuthData(user, true, CurrentTenant.Id); + if (result != null && user != null) + { + if (_authConfigService.AppSettings.RequireConfirmedEmail) + { + var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); + var confirmationLink = + $"{_authConfigService.AppSettings.ConfirmedEmailUrl}?token={HttpUtility.UrlEncode(token)}&email={user.Email}"; + + var data = new JObject(new JProperty("Url", confirmationLink)); + await _edmService.SendMailWithEdmTemplate("Email Confirmation", "ActiveEmail", data, user.Email); + } + else + { + await _edmService.SendMailWithEdmTemplate("Welcome", "Welcome", ReflectionHelper.ParseObject(user), + user.Email); + } + return Ok(result); + } + else + { + return BadRequest(); + } + } + + [HttpPost("connect/token")] + public JsonResult Token([FromBody] OAuthTokenRequest tokenRequest) + { + var result = _oauthTokenService.GenerateToken(tokenRequest); + + if (result.HasError) + return Json(new + { + error = result.Error, + error_description = result.ErrorDescription + }); + + return Json(result); + } + + + [AllowAnonymous] + [HttpGet("resend-confirm-email/{id}")] + public async Task ResendConfirmEmail(string id) + { + var user = await _userManager.FindByIdAsync(id).ConfigureAwait(false); + if (user is { EmailConfirmed: false }) + { + var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); + var confirmationLink = + $"{_authConfigService.AppSettings.ConfirmedEmailUrl}?token={HttpUtility.UrlEncode(token)}&email={user.Email}"; + var data = new JObject(new JProperty("Url", confirmationLink)); + await _edmService.SendMailWithEdmTemplate("Email Confirmation", "ActiveEmail", data, user.Email); + return Ok(); + } + else + { + return BadRequest(); + } + } + + [HttpGet("confirm-email")] + public async Task ConfirmEmail(string token, string email) + { + var user = await _userManager.FindByEmailAsync(email); + if (user == null) + return View("Error"); + var result = await _userManager.ConfirmEmailAsync(user, token); + string redirectUrl = result.Succeeded + ? _authConfigService.AppSettings.ConfirmedEmailUrlSuccess + : $"{_authConfigService.AppSettings.ConfirmedEmailUrlFail}?error={result.Errors.First().Description}"; + await _edmService.SendMailWithEdmTemplate("Welcome", "Welcome", ReflectionHelper.ParseObject(user), + user.Email); + return Redirect(redirectUrl); + } + + [Route("Logout")] + [HttpGet] + public async Task Logout() + { + await _signInManager.SignOutAsync().ConfigureAwait(false); + await _refreshTokenRepo.DeleteAsync(r => r.Username == User.Identity.Name); + return Ok(); + } + + [Route("token")] + [HttpPost] + [AllowAnonymous] + public async Task GetToken([FromBody] LoginDto requestDto) + { + string key = GlobalConfigService.Instance.AppSettings.ApiEncryptKey; + string decryptMsg = AesEncryptionHelper.DecryptString(requestDto.Message, key); + var model = JsonConvert.DeserializeObject(decryptMsg); + var loginResult = await _idService.GetTokenAsync(model); + if (loginResult != null) + { + return Ok(loginResult); + } + + return Unauthorized(); + } + + [Route("login")] + [HttpPost] + [AllowAnonymous] + public async Task Login([FromBody] LoginDto requestDto) + { + string key = GlobalConfigService.Instance.AppSettings.ApiEncryptKey; + string decryptMsg = AesEncryptionHelper.DecryptString(requestDto.Message, key); + var model = JsonConvert.DeserializeObject(decryptMsg); + var loginResult = await _idService.LoginAsync(model); + return Ok(loginResult); + } + + [Route("external-login")] + [HttpPost] + [AllowAnonymous] + public async Task ExternalLogin([FromBody] LoginDto requestDto) + { + string key = GlobalConfigService.Instance.AppSettings.ApiEncryptKey; + string decryptMsg = AesEncryptionHelper.DecryptString(requestDto.Message, key); + var model = JsonConvert.DeserializeObject(decryptMsg); + var loginResult = await _idService.ExternalLogin(model); + return Ok(loginResult); + } + + [Route("login-unsecure")] + [HttpPost] + [AllowAnonymous] + public async Task LoginUnSecure([FromBody] LoginRequestModel model) + { + var loginResult = await _idService.LoginAsync(model); + return Ok(loginResult); + } + + [AllowAnonymous] + [HttpPost("external-login-unsecure")] + public async Task ExternalLoginUnSecure([FromBody] RegisterExternalBindingModel model) + { + var loginResult = await _idService.ExternalLogin(model); + return Ok(loginResult); + } + + [Route("get-external-login-providers")] + [HttpGet] + public async Task GetExternalLoginProviders() + { + var providers = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); + return Ok(providers); + } + + [Route("renew-token")] + [HttpPost] + public async Task RenewToken([FromBody] RenewTokenDto refreshTokenDto) + { + var token = await _idService.RenewTokenAsync(refreshTokenDto); + return Ok(token); + } + + [MixAuthorize] + [HttpGet] + [Route("my-profile")] + public async Task> MyProfile([FromServices] DatabaseService databaseService) + { + try + { + var id = _idService.GetClaim(User, MixClaims.Id); + var user = await _userManager.FindByIdAsync(id); + + if (user == null) + { + return BadRequest(); + } + + var result = new MixUserViewModel(user, _cmsUow); + await result.LoadUserDataAsync(CurrentTenant.Id, _mixDbDataService, _accContext, CacheService); + return Ok(result); + } + catch (MixException) + { + throw; + } + catch (Exception ex) + { + throw new MixException(MixErrorStatus.ServerError, ex); + } + } + + [HttpGet] + [MixAuthorize(roles: MixRoles.Owner)] + [Route("details/{id}")] + public async Task Details([FromServices] DatabaseService databaseService, string id) + { + var user = await _userManager.FindByIdAsync(id); + if (user != null) + { + var result = new MixUserViewModel(user, _cmsUow); + await result.LoadUserDataAsync(CurrentTenant.Id, _mixDbDataService, _accContext, CacheService); + return Ok(result); + } + + return BadRequest(); + } + + [HttpDelete] + [MixAuthorize(roles: MixRoles.Owner)] + [Route("remove-user/{id}")] + public async Task Remove(string id) + { + var user = await _userManager.FindByIdAsync(id); + if (user != null) + { + var logins = await _userManager.GetLoginsAsync(user); + foreach (var login in logins) + { + var result = await _userManager.RemoveLoginAsync(user, login.LoginProvider, login.ProviderKey); + if (!result.Succeeded) + { + throw new MixException(MixErrorStatus.Badrequest, result.Errors.First()); + } + } + + var idResult = await _userManager.DeleteAsync(user); + if (idResult.Succeeded) + { + _repoDbRepository.InitTableName(MixDatabaseNames.SYSTEM_USER_DATA); + await _repoDbRepository.DeleteAsync(new List() + { + new QueryField("parentId", user.Id), + new QueryField("parentType", MixContentType.User) + }); + QueueService.PushMemoryQueue( + CurrentTenant.Id, + MixQueueTopics.MixBackgroundTasks, + MixQueueActions.MixDbEvent, + new MixDbEventCommand(user.UserName, MixDbCommandQueueAction.DELETE.ToString(), MixDatabaseNames.SYSTEM_USER_DATA, new Mix.Shared.Models.MixDbAuditLogModel() + { + Id = id, + MixDbName = MixDatabaseNames.SYSTEM_USER_DATA, + Before = ReflectionHelper.ParseObject(user) + })); + return Ok(); + } + } + + throw new MixException(MixErrorStatus.NotFound); + } + + [HttpPost] + [MixAuthorize(roles: MixRoles.Owner)] + [Route("user-in-role")] + public async Task Details([FromBody] UserRoleModel model) + { + var role = await _roleManager.FindByIdAsync(model.RoleId); + List errors = new List(); + + if (role == null) + { + errors.Add($"Role: {model.RoleId} does not exists"); + } + else if (model.IsUserInRole) + { + var appUser = await _userManager.FindByIdAsync(model.UserId); + + if (appUser == null) + { + errors.Add($"User: {model.UserId} does not exists"); + } + else if (role.Name != null && !await _userManager.IsInRoleAsync(appUser, role.Name)) + { + await _userManager.AddToRoleAsync(appUser, role.Name, CurrentTenant.Id); + return Ok(); + } + } + else + { + var appUser = await _userManager.FindByIdAsync(model.UserId); + + if (appUser == null) + { + errors.Add($"User: {model.UserId} does not exists"); + } + + await _userManager.RemoveFromRoleAsync(appUser, role.Name, CurrentTenant.Id); + return Ok(); + } + + return BadRequest(errors); + } + + [MixAuthorize(roles: MixRoles.Owner)] + [HttpGet("list")] + public virtual async Task>> Get( + [FromQuery] SearchRequestDto request) + { + Expression> predicate = model => + (string.IsNullOrWhiteSpace(request.Keyword) + || ( + EF.Functions.Like(model.UserName, $"%{request.Keyword}%") + || EF.Functions.Like(model.Email, $"%{request.Keyword}%") + ) + ) + && (!request.FromDate.HasValue + || model.CreatedDateTime >= request.FromDate.Value.ToUniversalTime() + ) + && (!request.ToDate.HasValue + || model.CreatedDateTime <= request.ToDate.Value.ToUniversalTime() + ); + + var searchQuery = new SearchAccountQueryModel(request); + var data = await _repository + .GetPagingEntitiesAsync(predicate, searchQuery.PagingData) + .ConfigureAwait(false); + + var items = new List(); + foreach (var user in data.Items) + { + var result = new MixUserViewModel(user, _cmsUow); + await result.LoadUserDataAsync(CurrentTenant.Id, _mixDbDataService, _accContext, CacheService); + items.Add(result); + } + + return new PagingResponseModel(items, searchQuery.PagingData); + } + + // POST api/template + [MixAuthorize(roles: MixRoles.Owner)] + [HttpPost] + [Route("save")] + public async Task> Save( + [FromBody] MixUserViewModel model) + { + if (model == null) + { + return BadRequest(); + } + + var user = await _userManager.FindByIdAsync(model.Id.ToString()); + if (user == null) + { + return BadRequest(); + } + + user.Email = model.Email; + user.PhoneNumber = model.PhoneNumber; + if (!model.IsChangePassword) + { + return Ok(model); + } + + var changePwd = await _userManager.ChangePasswordAsync( + user, + model.ChangePassword.CurrentPassword, + model.ChangePassword.NewPassword); + if (!changePwd.Succeeded) + { + throw new MixException(string.Join(",", changePwd.Errors)); + } + else + { + // Remove other token if change password success + if (Guid.TryParse(_idService.GetClaim(User, MixClaims.RefreshToken), out var refreshTokenId)) + { + await _refreshTokenRepo.DeleteManyAsync(m => + m.Username == user.UserName && m.Id != refreshTokenId); + } + } + + return Ok(model); + } + + + [HttpPost] + [Route("forgot-password")] + public async Task ForgotPassword([FromBody] ForgotPasswordRequestModel model) + { + if (string.IsNullOrEmpty(model.Email)) + { + throw new MixException(MixErrorStatus.Badrequest, "Invalid Email"); + } + + var user = await _userManager.FindByEmailAsync(model.Email); + if (user == null) + { + throw new MixException(MixErrorStatus.Badrequest, "Email Not Exist"); + } + + //if (!await _userManager.IsEmailConfirmedAsync(user)) + // result.Data = "Invalid Email"; + + var confirmationCode = + await _userManager.GeneratePasswordResetTokenAsync(user); + + var callbackUrl = + $"{Request.Scheme}://{Request.Host}/security/reset-password/?token={HttpUtility.UrlEncode(confirmationCode)}"; + var obj = ReflectionHelper.ParseObject(user); + obj.Add(new JProperty("URL", callbackUrl)); + + await _edmService.SendMailWithEdmTemplate("Reset Password", "ForgotPassword", obj, user.Email); + + return Ok(); + } + + [HttpPost] + [Route("reset-password")] + public async Task ResetPassword([FromBody] ResetPasswordRequestModel model) + { + var user = await _userManager.FindByEmailAsync(model.Email); + if (user == null) + { + throw new MixException(MixErrorStatus.Badrequest, "Invalid User"); + } + + var idResult = await _userManager.ResetPasswordAsync( + user, model.Code, model.Password); + if (!idResult.Succeeded) + { + var errors = idResult.Errors.Select(m => m.Description); + throw new MixException(MixErrorStatus.Badrequest, errors); + } + + return Ok(); + } + + [MixAuthorize] + [HttpPost] + [Route("change-password")] + public async Task ResetPassword([FromBody] ChangePasswordViewModel model) + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return BadRequest(); + } + + var result = await _userManager.ChangePasswordAsync(user, model.CurrentPassword, model.NewPassword); + return result.Succeeded ? Ok() : BadRequest(result.Errors.Select(m => m.Description).ToList()); + } + } +} \ No newline at end of file diff --git a/src/services/core/mix-auth-service/mix.auth.api/Controllers/MixRoleController.cs b/src/services/core/mix-auth-service/mix.auth.api/Controllers/MixRoleController.cs new file mode 100644 index 000000000..8a5763a54 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Controllers/MixRoleController.cs @@ -0,0 +1,82 @@ +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Mix.Database.Entities.Account; +using Mix.Heart.Entities.Cache; +using Mix.Heart.Models; +using Mix.Identity.Models; +using Mix.Lib.Interfaces; +using Mix.Lib.Services; +using Mix.Mq.Lib.Models; +using Mix.Queue.Interfaces; +using Mix.Services.Databases.Lib.Interfaces; + +namespace mix.auth.service.Controllers +{ + [MixAuthorize(roles: MixRoles.Owner)] + [Route("api/v2/rest/auth/role")] + [ApiController] + public class MixRoleController : MixRestEntityApiControllerBase + { + private readonly TenantRoleManager _roleManager; + private readonly IMixPermissionService _permissionService; + public MixRoleController( + IHttpContextAccessor httpContextAccessor, + IConfiguration configuration, + MixCacheService cacheService, + TranslatorService translator, + MixIdentityService mixIdentityService, + MixCacheDbContext cacheDbContext, + MixCmsAccountContext context, + IMemoryQueueService queueService, + IMixTenantService mixTenantService, + TenantRoleManager roleManager, + IMixPermissionService permissionService) + : base(httpContextAccessor, configuration, + cacheService, translator, mixIdentityService, cacheDbContext, context, queueService, mixTenantService) + { + _roleManager = roleManager; + _permissionService = permissionService; + } + public override async Task>> Get([FromQuery] SearchRequestDto req) + { + var roles = await base.GetHandler(req); + var result = new PagingResponseModel() + { + PagingData = roles.PagingData + }; + var models = new List(); + foreach (var item in roles.Items) + { + models.Add(new RoleBOModel() + { + ConcurrencyStamp = item.ConcurrencyStamp, + Id = item.Id, + Name = item.Name, + NormalizedName = item.NormalizedName, + Permissions = await _permissionService.GetPermissionByRoleId(item.Id) + }); + } + result.Items = models; + return Ok(result); + } + + protected override async Task CreateHandlerAsync(MixRole data) + { + data.Id = Guid.NewGuid(); + var result = await _roleManager.CreateAsync(data); + if (result.Succeeded) + { + return data.Id; + } + else + { + throw new MixException(MixErrorStatus.Badrequest, "Invalid Role", result.Errors.Select(m => m.Description).ToArray()); + } + } + protected override async Task DeleteHandler(MixRole data) + { + await _roleManager.DeleteAsync(data); + } + } +} diff --git a/src/services/core/mix-auth-service/mix.auth.api/Controllers/OAuthClientController.cs b/src/services/core/mix-auth-service/mix.auth.api/Controllers/OAuthClientController.cs new file mode 100644 index 000000000..0905da03a --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Controllers/OAuthClientController.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Mix.Database.Entities.Account; +using Mix.Identity.Interfaces; +using Mix.Identity.ViewModels; +using Mix.Lib.Interfaces; +using Mix.Lib.Services; +using Mix.Mq.Lib.Models; +using Mix.Queue.Interfaces; +using Mix.SignalR.Interfaces; + +namespace mix.auth.service.Controllers +{ + [MixAuthorize(roles: MixRoles.Owner)] + [Route("api/v2/rest/auth/oauth-client")] + [ApiController] + public class OAuthClientController : MixRestfulApiControllerBase + { + private readonly IOAuthClientService _oauthClientService; + public OAuthClientController(IHttpContextAccessor httpContextAccessor, IConfiguration configuration, MixCacheService cacheService, TranslatorService translator, MixIdentityService mixIdentityService, UnitOfWorkInfo uow, IMemoryQueueService queueService, IPortalHubClientService portalHub, IMixTenantService mixTenantService, IOAuthClientService oauthClientService) : base(httpContextAccessor, configuration, cacheService, translator, mixIdentityService, uow, queueService, portalHub, mixTenantService) + { + _oauthClientService = oauthClientService; + } + + protected override async Task CreateHandlerAsync(OAuthClientViewModel data, CancellationToken cancellationToken = default) + { + var result = await base.CreateHandlerAsync(data, cancellationToken); + _oauthClientService.LoadClients(Uow.DbContext, true); + return result; + } + protected override async Task UpdateHandler(Guid id, OAuthClientViewModel data, CancellationToken cancellationToken = default) + { + await base.UpdateHandler(id, data, cancellationToken); + _oauthClientService.LoadClients(Uow.DbContext, true); + } + protected override async Task DeleteHandler(OAuthClientViewModel data, CancellationToken cancellationToken = default) + { + await base.DeleteHandler(data, cancellationToken); + _oauthClientService.LoadClients(Uow.DbContext, true); + } + } +} diff --git a/src/services/core/mix-auth-service/mix.auth.api/Dockerfile b/src/services/core/mix-auth-service/mix.auth.api/Dockerfile new file mode 100644 index 000000000..7b1af72b8 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Dockerfile @@ -0,0 +1,47 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER app +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["platform/core/mix-heart/nuget.config", "platform/core/mix-heart/"] +COPY ["services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj", "services/core/mix-auth-service/mix.auth.api/"] +COPY ["applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "applications/mixcore.host.aspire.ServiceDefaults/"] +COPY ["modules/mix.grpc/mix.grpc.csproj", "modules/mix.grpc/"] +COPY ["platform/mix.library/mix.library.csproj", "platform/mix.library/"] +COPY ["platform/core/mix.mixdb.event/mix.mixdb.event.csproj", "platform/core/mix.mixdb.event/"] +COPY ["platform/mix.mixdb/mix.mixdb.csproj", "platform/mix.mixdb/"] +COPY ["platform/mix.database/mix.database.csproj", "platform/mix.database/"] +COPY ["platform/mix.shared/mix.shared.csproj", "platform/mix.shared/"] +COPY ["platform/core/mix-heart/src/mix.heart/mix.heart.csproj", "platform/core/mix-heart/src/mix.heart/"] +COPY ["platform/mix.constant/mix.constant.csproj", "platform/mix.constant/"] +COPY ["platform/mix.service/mix.service.csproj", "platform/mix.service/"] +COPY ["platform/mix.identity/mix.identity.csproj", "platform/mix.identity/"] +COPY ["platform/mix.auth/mix.auth.csproj", "platform/mix.auth/"] +COPY ["platform/mix.quartz/mix.quartz.csproj", "platform/mix.quartz/"] +COPY ["platform/mix.queue/mix.queue.csproj", "platform/mix.queue/"] +COPY ["services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj", "services/core/mix-message-queue/mix.mq/"] +COPY ["services/core/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj", "services/core/mix-message-queue/mix.mq.lib/"] +COPY ["platform/mix.signalr/mix.signalr.csproj", "platform/mix.signalr/"] +COPY ["platform/mix.repodb/mix.repodb.csproj", "platform/mix.repodb/"] +COPY ["platform/mix.communicator/mix.communicator.csproj", "platform/mix.communicator/"] +COPY ["platform/mix.signalr.hub/mix.signalr.hub.csproj", "platform/mix.signalr.hub/"] +COPY ["platform/mix.log/mix.log.lib.csproj", "platform/mix.log/"] +RUN dotnet restore "./services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj" +COPY . . +WORKDIR "/src/services/core/mix-auth-service/mix.auth.api" +RUN dotnet build "./mix.auth.api.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./mix.auth.api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "mix.auth.api.dll"] \ No newline at end of file diff --git a/src/services/core/mix-auth-service/mix.auth.api/Dockerfile_linux b/src/services/core/mix-auth-service/mix.auth.api/Dockerfile_linux new file mode 100644 index 000000000..0d04f355b --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Dockerfile_linux @@ -0,0 +1,43 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +COPY ["src/platform/core/mix-heart/nuget.config", "src/platform/core/mix-heart/"] +COPY ["src/services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj", "src/services/core/mix-auth-service/mix.auth.api/"] +COPY ["src/applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "applications/mixcore.host.aspire.ServiceDefaults/"] +COPY ["src/modules/mix.grpc/mix.grpc.csproj", "src/modules/mix.grpc/"] +COPY ["src/platform/mix.library/mix.library.csproj", "src/platform/mix.library/"] +COPY ["src/platform/core/mix.mixdb.event/mix.mixdb.event.csproj", "src/platform/core/mix.mixdb.event/"] +COPY ["src/platform/mix.mixdb/mix.mixdb.csproj", "src/platform/mix.mixdb/"] +COPY ["src/platform/mix.database/mix.database.csproj", "src/platform/mix.database/"] +COPY ["src/platform/mix.shared/mix.shared.csproj", "src/platform/mix.shared/"] +COPY ["src/platform/core/mix-heart/src/mix.heart/mix.heart.csproj", "src/platform/core/mix-heart/src/mix.heart/"] +COPY ["src/platform/mix.constant/mix.constant.csproj", "src/platform/mix.constant/"] +COPY ["src/platform/mix.service/mix.service.csproj", "src/platform/mix.service/"] +COPY ["src/platform/mix.identity/mix.identity.csproj", "src/platform/mix.identity/"] +COPY ["src/platform/mix.auth/mix.auth.csproj", "src/platform/mix.auth/"] +COPY ["src/platform/mix.quartz/mix.quartz.csproj", "src/platform/mix.quartz/"] +COPY ["src/platform/mix.queue/mix.queue.csproj", "src/platform/mix.queue/"] +COPY ["src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj", "src/services/core/mix-message-queue/mix.mq/"] +COPY ["src/services/core/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj", "src/services/core/mix-message-queue/mix.mq.lib/"] +COPY ["src/platform/mix.signalr/mix.signalr.csproj", "src/platform/mix.signalr/"] +COPY ["src/platform/mix.repodb/mix.repodb.csproj", "src/platform/mix.repodb/"] +COPY ["src/platform/mix.communicator/mix.communicator.csproj", "src/platform/mix.communicator/"] +COPY ["src/platform/mix.signalr.hub/mix.signalr.hub.csproj", "src/platform/mix.signalr.hub/"] +COPY ["src/platform/mix.log/mix.log.lib.csproj", "src/platform/mix.log/"] +RUN dotnet restore "src/services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj" +COPY . . +RUN dotnet build "src/services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "src/services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "mix.auth.api.dll"] \ No newline at end of file diff --git a/src/services/core/mix-auth-service/mix.auth.api/Domain/Protos/mixmq.proto b/src/services/core/mix-auth-service/mix.auth.api/Domain/Protos/mixmq.proto new file mode 100644 index 000000000..3ead5efc1 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Domain/Protos/mixmq.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +option csharp_namespace = "Mix.Mq"; +import "google/protobuf/empty.proto"; + +package mixmq; + +// The greeting service definition. +service MixMq { + // Sends a greeting + rpc Subscribe (SubscribeRequest) returns (stream SubscribeReply); + rpc Publish (PublishMessageRequest) returns (google.protobuf.Empty); +} + +// The request message containing the user's name. +message SubscribeRequest { + string topicId = 1; + string subsctiptionId = 2; +} + +message PublishMessageRequest { + string topicId = 1; + string message = 2; +} + +// The response message containing the greetings. +message SubscribeReply { + repeated string messages = 1; +} diff --git a/src/services/core/mix-auth-service/mix.auth.api/Domain/StartupService.cs b/src/services/core/mix-auth-service/mix.auth.api/Domain/StartupService.cs new file mode 100644 index 000000000..b7103a4a7 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Domain/StartupService.cs @@ -0,0 +1,25 @@ +using Mix.Auth.Api.Domain.Subscribers; +using Mix.Database.Entities.Account; +using Mix.Shared.Interfaces; + +namespace mix.auth.service.Domain +{ + public class StartupService : IStartupService + { + public void AddServices(IServiceCollection services, IConfiguration configuration) + { + services.AddScoped>(); + services.AddScoped>(); + services.AddScoped>(); + services.AddHostedService(); + } + + public void UseApps(IApplicationBuilder app, IConfiguration configuration, bool isDevelop) + { + } + + public void UseEndpoints(IEndpointRouteBuilder endpoints, IConfiguration configuration, bool isDevelop) + { + } + } +} diff --git a/src/services/core/mix-auth-service/mix.auth.api/Domain/Subscribers/MixAuthBackgroundTaskSubscriber.cs b/src/services/core/mix-auth-service/mix.auth.api/Domain/Subscribers/MixAuthBackgroundTaskSubscriber.cs new file mode 100644 index 000000000..26c7bb726 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Domain/Subscribers/MixAuthBackgroundTaskSubscriber.cs @@ -0,0 +1,94 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.ObjectPool; +using Mix.Constant.Constants; +using Mix.Mq.Lib.Models; +using Mix.Queue.Engines; +using Mix.Queue.Interfaces; +using Mix.Service.Services; +using Mix.SignalR.Enums; +using Mix.SignalR.Interfaces; +using Mix.SignalR.Models; + +namespace Mix.Auth.Api.Domain.Subscribers +{ + public sealed class MixAuthBackgroundTaskSubscriber : SubscriberBase + { + private IPortalHubClientService PortalHub; + private static string topicId = MixQueueTopics.MixBackgroundTasks; + private static string[] allowActions = { + }; + public MixAuthBackgroundTaskSubscriber( + IConfiguration configuration, + IServiceProvider serviceProvider, + IPortalHubClientService portalHub, + IMemoryQueueService queueService, + ILogger logger, + IPooledObjectPolicy rabbitMqObjectPolicy = null) + : base(topicId, nameof(MixAuthBackgroundTaskSubscriber), 20, serviceProvider, configuration, queueService, logger, rabbitMqObjectPolicy) + { + PortalHub = portalHub; + } + public override Task StartAsync(CancellationToken cancellationToken = default) + { + base.StartAsync(cancellationToken); + + return Task.Run(async () => + { + while (PortalHub.Connection == null || PortalHub.Connection.State != Microsoft.AspNetCore.SignalR.Client.HubConnectionState.Connected) + { + try + { + await Task.Delay(5000); + await PortalHub.StartConnection(); + } + catch (Exception ex) + { + Logger.LogError(GetType().Name, ex); + } + } + }); + } + public override async Task Handler(MessageQueueModel model, CancellationToken cancellationToken) + { + if (!allowActions.Contains(model.Action)) + { + return; + } + + try + { + using (ServiceScope = ServicesProvider.CreateScope()) + { + switch (model.Action) + { + default: + await SendMessage($"Received Message {model.Action}", true); + break; + } + } + } + catch (Exception ex) + { + await MixLogService.LogExceptionAsync(ex); + await SendMessage(model.Action, false, ex); + } + } + + private async Task SendMessage(string message, bool result, Exception? ex = null) + { + SignalRMessageModel msg = new() + { + Action = MessageAction.NewMessage, + Type = result ? MessageType.Success : MessageType.Error, + Title = message, + From = new(GetType().FullName), + Message = ex == null ? message : ex!.Message + }; + await PortalHub.SendMessageAsync(msg); + } + + + } +} diff --git a/src/services/core/mix-auth-service/mix.auth.api/Domain/ViewModels/MixRoleViewModel.cs b/src/services/core/mix-auth-service/mix.auth.api/Domain/ViewModels/MixRoleViewModel.cs new file mode 100644 index 000000000..4fb5a373f --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Domain/ViewModels/MixRoleViewModel.cs @@ -0,0 +1,36 @@ +using Mix.Database.Entities.Account; + +namespace mix.auth.service.Domain.ViewModels +{ + public class MixRoleViewModel + : ViewModelBase + { + #region Constructors + + public MixRoleViewModel() + { + } + + public MixRoleViewModel(MixRole entity, UnitOfWorkInfo uowInfo) : base(entity, uowInfo) + { + } + + public MixRoleViewModel(UnitOfWorkInfo unitOfWorkInfo) : base(unitOfWorkInfo) + { + } + #endregion + + #region Properties + + public string Name { get; set; } + public string NormalizedName { get; set; } + public string ConcurrencyStamp { get; set; } + public int MixTenantId { get; set; } + + #endregion + + #region Overrides + + #endregion + } +} diff --git a/src/services/core/mix-auth-service/mix.auth.api/Program.cs b/src/services/core/mix-auth-service/mix.auth.api/Program.cs new file mode 100644 index 000000000..84983ae02 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Program.cs @@ -0,0 +1,59 @@ +using Mix.Constant.Constants; +using Mix.Database.Entities.Account; +using Mix.Heart.Services; +using System.Configuration; +using System.Reflection; +using Mix.Log.Lib; +using Microsoft.Azure.Amqp.Framing; +using Mix.Lib.Middlewares; +using Mix.Lib.Services; +using Mix.Mq.Lib.Models; +using Mix.Queue.Interfaces; +using Mix.Queue.Services; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Mix.Lib.Publishers; +using Mix.Lib.Subscribers; +using Mix.Log.Lib.Subscribers; +using Mix.Log.Lib.Publishers; +using Mix.Log.Lib.Interfaces; +using Mix.Log.Lib.Services; + +if (Directory.Exists($"../{MixFolders.MixCoreConfigurationFolder}")) +{ + MixFileHelper.CopyFolder($"../{MixFolders.MixCoreConfigurationFolder}", MixFolders.MixContentSharedFolder); +} + +var builder = MixCmsHelper.CreateWebApplicationBuilder(args); + +if (builder.Environment.IsDevelopment()) +{ + builder.AddServiceDefaults(); +} + +// Add services to the container. + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); + +builder.Services.AddMixServices(Assembly.GetExecutingAssembly(), builder.Configuration); +builder.Services.AddMixCors(); +// Must app Auth config after Add mixservice to init App config +builder.Services.AddMixAuthorize(builder.Configuration); +builder.Services.AddScoped(); +builder.Services.TryAddSingleton, MemoryQueueService>(); +builder.Services.AddHostedService(); +builder.Services.AddHostedService(); +builder.AddMixLogPublisher(); +var app = builder.Build(); + +app.UseMixTenant(); +app.UseMixCors(); +app.UseRouting(); +app.UseMixAuth(); +// auditlog middleware must go after auth +app.UseMiddleware(); +app.UseMixCors(); +app.UseMixApps(Assembly.GetExecutingAssembly(), builder.Configuration, builder.Environment.ContentRootPath, builder.Environment.IsDevelopment()); + +app.Run(); diff --git a/src/services/core/mix-auth-service/mix.auth.api/Properties/launchSettings.json b/src/services/core/mix-auth-service/mix.auth.api/Properties/launchSettings.json new file mode 100644 index 000000000..55993c1c3 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/Properties/launchSettings.json @@ -0,0 +1,42 @@ +{ + "profiles": { + "https": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:7116;http://localhost:5238" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Container (Dockerfile)": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "environmentVariables": { + "ASPNETCORE_HTTPS_PORTS": "8081", + "ASPNETCORE_HTTP_PORTS": "8080" + }, + "publishAllPorts": true, + "useSSL": true + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21901", + "sslPort": 44336 + } + } +} \ No newline at end of file diff --git a/src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/appsettings.Development.json b/src/services/core/mix-auth-service/mix.auth.api/appsettings.Development.json similarity index 100% rename from src/applications/mixcore.host.aspire/mixcore.host.aspire.AppHost/appsettings.Development.json rename to src/services/core/mix-auth-service/mix.auth.api/appsettings.Development.json diff --git a/src/services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj b/src/services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj new file mode 100644 index 000000000..2f8a14b54 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/mix.auth.api.csproj @@ -0,0 +1,53 @@ + + + + net8.0 + false + false + en + enable + enable + true + e7c022bb-c2da-4d62-b3ed-5a0574c52280 + Linux + ..\..\.. + Mix.Auth.Api + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/services/core/mix-auth-service/mix.auth.api/mix.auth.service.http b/src/services/core/mix-auth-service/mix.auth.api/mix.auth.service.http new file mode 100644 index 000000000..b9409b140 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/mix.auth.service.http @@ -0,0 +1,6 @@ +@mix.auth.service_HostAddress = http://localhost:5238 + +GET {{mix.auth.service_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/src/services/core/mix-auth-service/mix.auth.api/runtimeconfig.template.json b/src/services/core/mix-auth-service/mix.auth.api/runtimeconfig.template.json new file mode 100644 index 000000000..c1ba87344 --- /dev/null +++ b/src/services/core/mix-auth-service/mix.auth.api/runtimeconfig.template.json @@ -0,0 +1,8 @@ +{ + "configProperties":{ + "System.GC.Concurrent": true, + "System.GC.HeapCount": 8, + "System.GC.NoAffinitize": true, + "System.Threading.Thread.EnableAutoreleasePool": true + } +} \ No newline at end of file diff --git a/src/services/core/mix-databases/mix.services.databases.lib/Interfaces/IMixPermissionService.cs b/src/services/core/mix-databases/mix.services.databases.lib/Interfaces/IMixPermissionService.cs index 2c14bf6b6..67cf27421 100644 --- a/src/services/core/mix-databases/mix.services.databases.lib/Interfaces/IMixPermissionService.cs +++ b/src/services/core/mix-databases/mix.services.databases.lib/Interfaces/IMixPermissionService.cs @@ -1,4 +1,6 @@ -using Mix.Mixdb.ViewModels; +using Mix.Database.Entities.Account; +using Mix.Identity.Dtos; +using Mix.Mixdb.ViewModels; using Mix.Services.Databases.Lib.Dtos; namespace Mix.Services.Databases.Lib.Interfaces @@ -8,5 +10,7 @@ public interface IMixPermissionService public Task> GetPermissionAsync(Guid userId); public Task AddUserPermission(CreateUserPermissionDto dto); + Task> GetPermissionByRoleId(Guid roleId); + Task GrantPermissions(GrantPermissionsDto dto); } } diff --git a/src/services/core/mix-databases/mix.services.databases.lib/Services/MixUserPermissionService.cs b/src/services/core/mix-databases/mix.services.databases.lib/Services/MixUserPermissionService.cs index 62f3d5c09..3fb7611b1 100644 --- a/src/services/core/mix-databases/mix.services.databases.lib/Services/MixUserPermissionService.cs +++ b/src/services/core/mix-databases/mix.services.databases.lib/Services/MixUserPermissionService.cs @@ -11,6 +11,11 @@ using Mix.Heart.Services; using Mix.Lib.Interfaces; using Mix.Auth.Constants; +using Mix.Constant.Constants; +using Mix.Database.Entities.Account; +using Mix.Heart.Enums; +using Mix.Identity.Dtos; +using Microsoft.EntityFrameworkCore; namespace Mix.Services.Databases.Lib.Services { @@ -18,26 +23,78 @@ public sealed class MixUserPermissionService : TenantServiceBase, IMixPermission { private readonly MixIdentityService _identityService; private readonly MixDbDbContext _permissionDbContext; - private readonly UnitOfWorkInfo _uow; - + private readonly UnitOfWorkInfo _accUow; + private readonly UnitOfWorkInfo _mixUow; + private readonly IQueryable _permissionQuery; public MixUserPermissionService( IHttpContextAccessor httpContextAccessor, - UnitOfWorkInfo uow, + UnitOfWorkInfo accUow, MixIdentityService identityService, MixCacheService cacheService, - IMixTenantService mixTenantService) + IMixTenantService mixTenantService, + UnitOfWorkInfo mixUow) : base(httpContextAccessor, cacheService, mixTenantService) { - _uow = uow; - _permissionDbContext = _uow.DbContext; + _accUow = accUow; + _mixUow = mixUow; + _permissionDbContext = mixUow.DbContext; _identityService = identityService; + _permissionQuery = _accUow.DbContext.SysMixDatabaseAssociation + .Where(m => m.ParentDatabaseName == MixDatabaseNames.ROLE + && m.ChildDatabaseName == MixDatabaseNames.SYSTEM_PERMISSION); } + public async Task> GetPermissionByRoleId(Guid roleId) + { + var permissionIds = _permissionQuery.Where(m => m.GuidParentId == roleId).Select(m => m.ChildId); + return await _accUow.DbContext.Permission.Where(m => permissionIds.Contains(m.Id)) + .ToListAsync(); + } + + public async Task GrantPermissions(GrantPermissionsDto dto) + { + foreach (var item in dto.Permissions) + { + if (dto.IsActive && _permissionQuery.Any(m => m.GuidParentId == item.RoleId && m.ChildId == item.PermissionId)) + { + continue; + } + + try + { + if (dto.IsActive) + { + _accUow.DbContext.SysMixDatabaseAssociation.Add(new SysMixDatabaseAssociation() + { + ParentDatabaseName = MixDatabaseNames.ROLE, + ChildDatabaseName = MixDatabaseNames.SYSTEM_PERMISSION, + GuidParentId = item.RoleId, + ChildId = item.PermissionId, + CreatedBy = dto.RequestedBy, + CreatedDateTime = DateTime.UtcNow + }); + } + else + { + var rel = _permissionQuery.FirstOrDefault(m => m.GuidParentId == item.RoleId && m.ChildId == item.PermissionId); + if (rel != null) + { + _accUow.DbContext.SysMixDatabaseAssociation.Remove(rel); + } + } + await _accUow.DbContext.SaveChangesAsync(); + } + catch (Exception ex) + { + throw new MixException(MixErrorStatus.ServerError, ex); + } + } + } public async Task> GetPermissionAsync(Guid userId) { var permissions = _permissionDbContext.UserPermission.Where(m => m.MixTenantId == CurrentTenant.Id && m.UserId == userId); Expression> predicate = m => m.MixTenantId == CurrentTenant.Id && permissions.Any(p => p.PermissionId == m.Id); - var result = await MixPermissionViewModel.GetRepository(_uow, CacheService).GetAllAsync(predicate); + var result = await MixPermissionViewModel.GetRepository(_accUow, CacheService).GetAllAsync(predicate); return result; } @@ -48,7 +105,7 @@ public async Task AddUserPermission(CreateUserPermissionDto dto) throw new MixException(Heart.Enums.MixErrorStatus.Badrequest, "User not exist"); } - MixUserPermissionViewModel userPermission = new(_uow) + MixUserPermissionViewModel userPermission = new(_accUow) { MixTenantId = CurrentTenant.Id, CreatedBy = _identityService.GetClaim(HttpContextAccessor.HttpContext!.User, MixClaims.Username) diff --git a/src/services/core/mix-databases/mix.servives.databases/Controllers/MixPermissionController.cs b/src/services/core/mix-databases/mix.servives.databases/Controllers/MixPermissionController.cs index cba8a9421..d03687f5e 100644 --- a/src/services/core/mix-databases/mix.servives.databases/Controllers/MixPermissionController.cs +++ b/src/services/core/mix-databases/mix.servives.databases/Controllers/MixPermissionController.cs @@ -15,6 +15,7 @@ using Mix.Lib.Interfaces; using Mix.Auth.Constants; using Mix.Mq.Lib.Models; +using Mix.Identity.Dtos; namespace Mix.Services.Databases.Controllers { @@ -59,6 +60,7 @@ public async Task AddUserPermission(CreateUserPermissionDto dto) return Ok(); } + [MixAuthorize] [HttpGet("get-my-permissions")] public async Task>> GetMyPermissions() { @@ -71,7 +73,15 @@ public async Task>> GetMyPermissions() return BadRequest(); } - + [MixAuthorize(roles: $"{MixRoles.Owner},{MixRoles.Administrators}")] + [Route("grant-permission")] + [HttpPost] + public async Task GrantPermission([FromBody] GrantPermissionsDto dto) + { + dto.RequestedBy = MixIdentityService.GetClaim(User, MixClaims.Username); + await _permissionService.GrantPermissions(dto); + return Ok(); + } #endregion #region Overrides diff --git a/src/services/core/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj b/src/services/core/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj new file mode 100644 index 000000000..123195ceb --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.lib/mix.mq.lib.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + Mix.Mq.Lib + + + + + + + + + + + + + + diff --git a/src/services/core/mix-message-queue/mix.mq.server/Controllers/MqController.cs b/src/services/core/mix-message-queue/mix.mq.server/Controllers/MqController.cs new file mode 100644 index 000000000..6dccb563a --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Controllers/MqController.cs @@ -0,0 +1,61 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Mix.Mq.Lib.Models; +using Mix.Mq.Server.Domain.Services; +using Newtonsoft.Json.Linq; +using System.Text.Json; + +namespace Mix.Mq.Server.Controllers +{ + + [Route("api/mq")] + [ApiController] + public class MqController : ControllerBase + { + private readonly MixQueueMessages _queue; + private readonly GrpcStreamingService _grpcStreamingService; + + public MqController(MixQueueMessages queue, GrpcStreamingService grpcStreamingService) + { + _queue = queue; + _grpcStreamingService = grpcStreamingService; + } + + [HttpGet("topics")] + public ActionResult GetQueueMessages() + { + var topics = _queue.GetAllTopic(); + return new JsonResult(topics); + } + + [HttpGet("streams")] + public ActionResult GetStreams() + { + List arr = new(); + foreach (var item in _grpcStreamingService.MessageSubscriptions) + { + arr.Add(new + { + subscription_id = item.Key.SubsctiptionId, + stream_id = item.Value.GetHashCode() + }); + } + return new JsonResult(arr); + } + + [HttpGet("pending-messages")] + public ActionResult GetPendingMessages() + { + List arr = new(); + foreach (var item in _grpcStreamingService.PendingMessages) + { + arr.Add(new + { + subscription_id = item.Key, + messages = item.Value + }); + } + return new JsonResult(arr); + } + } +} diff --git a/src/services/core/mix-message-queue/mix.mq.server/Dockerfile b/src/services/core/mix-message-queue/mix.mq.server/Dockerfile new file mode 100644 index 000000000..a41acfa3a --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Dockerfile @@ -0,0 +1,45 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER app +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["platform/core/mix-heart/nuget.config", "platform/core/mix-heart/"] +COPY ["services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj", "services/core/mix-message-queue/mix.mq.server/"] +COPY ["applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "applications/mixcore.host.aspire.ServiceDefaults/"] +COPY ["modules/mix.messenger/mix.messenger.csproj", "modules/mix.messenger/"] +COPY ["platform/mix.signalr.hub/mix.signalr.hub.csproj", "platform/mix.signalr.hub/"] +COPY ["platform/core/mix-heart/src/mix.heart/mix.heart.csproj", "platform/core/mix-heart/src/mix.heart/"] +COPY ["platform/mix.log/mix.log.lib.csproj", "platform/mix.log/"] +COPY ["platform/mix.service/mix.service.csproj", "platform/mix.service/"] +COPY ["platform/mix.identity/mix.identity.csproj", "platform/mix.identity/"] +COPY ["platform/mix.auth/mix.auth.csproj", "platform/mix.auth/"] +COPY ["platform/mix.database/mix.database.csproj", "platform/mix.database/"] +COPY ["platform/mix.shared/mix.shared.csproj", "platform/mix.shared/"] +COPY ["platform/mix.constant/mix.constant.csproj", "platform/mix.constant/"] +COPY ["platform/mix.quartz/mix.quartz.csproj", "platform/mix.quartz/"] +COPY ["platform/mix.queue/mix.queue.csproj", "platform/mix.queue/"] +COPY ["platform/mix.signalr/mix.signalr.csproj", "platform/mix.signalr/"] +COPY ["platform/mix.communicator/mix.communicator.csproj", "platform/mix.communicator/"] +COPY ["platform/mix.library/mix.library.csproj", "platform/mix.library/"] +COPY ["platform/core/mix.mixdb.event/mix.mixdb.event.csproj", "platform/core/mix.mixdb.event/"] +COPY ["platform/mix.mixdb/mix.mixdb.csproj", "platform/mix.mixdb/"] +COPY ["platform/mix.repodb/mix.repodb.csproj", "platform/mix.repodb/"] +RUN dotnet restore "./services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj" +COPY . . +WORKDIR "/src/services/core/mix-message-queue/mix.mq.server" +RUN dotnet build "./mix.mq.server.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./mix.mq.server.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "mix.mq.server.dll"] \ No newline at end of file diff --git a/src/services/core/mix-message-queue/mix.mq.server/Dockerfile_linux b/src/services/core/mix-message-queue/mix.mq.server/Dockerfile_linux new file mode 100644 index 000000000..fc451bb5d --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Dockerfile_linux @@ -0,0 +1,41 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +COPY ["src/platform/core/mix-heart/nuget.config", "src/platform/core/mix-heart/"] +COPY ["src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj", "src/services/core/mix-message-queue/mix.mq.server/"] +COPY ["src/applications/mixcore.host.aspire.ServiceDefaults/mixcore.host.aspire.ServiceDefaults.csproj", "applications/mixcore.host.aspire.ServiceDefaults/"] +COPY ["src/modules/mix.messenger/mix.messenger.csproj", "src/modules/mix.messenger/"] +COPY ["src/platform/mix.signalr.hub/mix.signalr.hub.csproj", "src/platform/mix.signalr.hub/"] +COPY ["src/platform/core/mix-heart/src/mix.heart/mix.heart.csproj", "src/platform/core/mix-heart/src/mix.heart/"] +COPY ["src/platform/mix.log/mix.log.lib.csproj", "src/platform/mix.log/"] +COPY ["src/platform/mix.service/mix.service.csproj", "src/platform/mix.service/"] +COPY ["src/platform/mix.identity/mix.identity.csproj", "src/platform/mix.identity/"] +COPY ["src/platform/mix.auth/mix.auth.csproj", "src/platform/mix.auth/"] +COPY ["src/platform/mix.database/mix.database.csproj", "src/platform/mix.database/"] +COPY ["src/platform/mix.shared/mix.shared.csproj", "src/platform/mix.shared/"] +COPY ["src/platform/mix.constant/mix.constant.csproj", "src/platform/mix.constant/"] +COPY ["src/platform/mix.quartz/mix.quartz.csproj", "src/platform/mix.quartz/"] +COPY ["src/platform/mix.queue/mix.queue.csproj", "src/platform/mix.queue/"] +COPY ["src/platform/mix.signalr/mix.signalr.csproj", "src/platform/mix.signalr/"] +COPY ["src/platform/mix.communicator/mix.communicator.csproj", "src/platform/mix.communicator/"] +COPY ["src/platform/mix.library/mix.library.csproj", "src/platform/mix.library/"] +COPY ["src/platform/core/mix.mixdb.event/mix.mixdb.event.csproj", "src/platform/core/mix.mixdb.event/"] +COPY ["src/platform/mix.mixdb/mix.mixdb.csproj", "src/platform/mix.mixdb/"] +COPY ["src/platform/mix.repodb/mix.repodb.csproj", "src/platform/mix.repodb/"] +RUN dotnet restore "src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj" +COPY . . +RUN dotnet build "/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "mix.mq.server.dll"] \ No newline at end of file diff --git a/src/services/core/mix-message-queue/mix.mq.server/Domain/Protos/mixmq.proto b/src/services/core/mix-message-queue/mix.mq.server/Domain/Protos/mixmq.proto new file mode 100644 index 000000000..359260311 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Domain/Protos/mixmq.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; + +option csharp_namespace = "Mix.Mq"; +import "google/protobuf/empty.proto"; + +package mixmq; + +// The greeting service definition. +service MixMq { + // Sends a greeting + rpc Subscribe (SubscribeRequest) returns (stream SubscribeReply); + rpc Disconnect (SubscribeRequest) returns (google.protobuf.Empty); + rpc Publish (PublishMessageRequest) returns (google.protobuf.Empty); +} + +// The request message containing the user's name. +message SubscribeRequest { + string topicId = 1; + string subsctiptionId = 2; +} + +message PublishMessageRequest { + string topicId = 1; + string message = 2; +} + +// The response message containing the greetings. +message SubscribeReply { + repeated string messages = 1; +} diff --git a/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/GrpcStreamingService.cs b/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/GrpcStreamingService.cs new file mode 100644 index 000000000..afa771ae4 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/GrpcStreamingService.cs @@ -0,0 +1,154 @@ +using Grpc.Core; +using Mix.Mq.Lib.Models; +using Newtonsoft.Json.Linq; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading; + +namespace Mix.Mq.Server.Domain.Services +{ + public class GrpcStreamingService + { + public ConcurrentDictionary> MessageSubscriptions { get; set; } + public ConcurrentQueue Tasks; + private readonly MixQueueMessages _queue; + private CancellationToken _cancellationToken; + private ILogger _logger; + public ConcurrentDictionary> PendingMessages; + + public GrpcStreamingService(MixQueueMessages queue, ILogger logger) + { + MessageSubscriptions = new(); + _queue = queue; + Tasks = new(); + PendingMessages = new(); + _logger = logger; + } + + public Task LoadAllSubscriptions(CancellationToken cancellationToken) + { + _cancellationToken = cancellationToken; + return Task.WhenAll(Tasks); + } + + + public Task AddSubscription(SubscribeRequest request, IServerStreamWriter responseStream) + { + MessageSubscriptions.TryRemove(request, out _); + if (MessageSubscriptions.TryAdd(request, responseStream)) + { + return CreateSubscription(request, responseStream); + } + return Task.CompletedTask; + } + public Task RemoveSubscription(SubscribeRequest request) + { + var _topic = _queue.GetTopic(request.TopicId); + _topic.RemoveSubscription(request.SubsctiptionId); + MessageSubscriptions.TryRemove(request, out _); + return Task.CompletedTask; + } + + private async Task CreateSubscription(SubscribeRequest request, IServerStreamWriter responseStream) + { + var _topic = _queue.GetTopic(request.TopicId); + Initialize(_topic, request.SubsctiptionId); + + while (true) + { + var inQueueItems = _topic.ConsumeQueue(request.SubsctiptionId, 10); + try + { + await SendPendingMessages(request, responseStream); + + var result = new SubscribeReply + { + Messages = { } + }; + if (inQueueItems.Count > 0) + { + foreach (var item in inQueueItems) + { + result.Messages.Add(JObject.FromObject(item).ToString(Newtonsoft.Json.Formatting.None)); + } + } + + await responseStream.WriteAsync(result).ConfigureAwait(false); + } + catch (RpcException ex) + { + _logger.LogError($"RpcException at{DateTime.UtcNow.AddHours(7)} - {GetType().Name} Cannot write stream message to {request.SubsctiptionId}: {ex.Message}", ex); + AddToPendingMessages(request.SubsctiptionId, inQueueItems.ToList()); + //await RemoveSubscription(request); + break; + } + catch (Exception ex) + { + _logger.LogError($"Exception at{DateTime.UtcNow.AddHours(7)} - {GetType().Name} Cannot write stream message to {request.SubsctiptionId}: {ex.Message}", ex); + AddToPendingMessages(request.SubsctiptionId, inQueueItems.ToList()); + //await RemoveSubscription(request); + break; + } + + await Task.Delay(1000); + } + _logger.LogInformation($"{request.SubsctiptionId} stopped at {DateTime.UtcNow.AddHours(7)}"); + } + + private async Task SendPendingMessages(SubscribeRequest request, IServerStreamWriter responseStream) + { + PendingMessages.TryGetValue(request.SubsctiptionId, out var messages); + if (messages != null && messages.Count > 0) + { + try + { + + var result = new SubscribeReply + { + Messages = { } + }; + foreach (var item in messages) + { + result.Messages.Add(JObject.FromObject(item).ToString(Newtonsoft.Json.Formatting.None)); + } + await responseStream.WriteAsync(result).ConfigureAwait(false); ; + PendingMessages.TryRemove(request.SubsctiptionId, out _); + } + catch (RpcException ex) + { + _logger.LogError($"RpcException - {GetType().Name} Cannot write pending stream message to {request.SubsctiptionId}: {ex.Message}", ex); + AddToPendingMessages(request.SubsctiptionId, messages); + await RemoveSubscription(request); + } + catch (Exception ex) + { + _logger.LogError($"Exception - {GetType().Name} Cannot write pending stream message to {request.SubsctiptionId}: {ex.Message}", ex); + AddToPendingMessages(request.SubsctiptionId, messages); + await RemoveSubscription(request); + } + } + } + + private void AddToPendingMessages(string subscriptionId, List inQueueItems) + { + PendingMessages.TryGetValue(subscriptionId, out var messages); + if (messages == null) + { + PendingMessages.TryAdd(subscriptionId, inQueueItems); + } + else + { + PendingMessages[subscriptionId].AddRange(inQueueItems); + } + } + + private void Initialize(MixTopicModel topic, string subscriptionId) + { + while (topic == null) + { + Thread.Sleep(1000); + } + topic.CreateSubscription(subscriptionId); + } + } +} diff --git a/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/MixMqService.cs b/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/MixMqService.cs new file mode 100644 index 000000000..53aa04d69 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/MixMqService.cs @@ -0,0 +1,76 @@ +using Azure.Core; +using Google.Protobuf; +using Google.Protobuf.WellKnownTypes; +using Grpc.Core; +using Mix.Heart.Extensions; +using Mix.Mq.Lib.Models; +using Mix.Signalr.Hub.Models; +using Newtonsoft.Json.Linq; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading; + +namespace Mix.Mq.Server.Domain.Services; + +public class MixMqService : MixMq.MixMqBase +{ + private readonly ILogger _logger; + private readonly MixQueueMessages _queue; + private readonly GrpcStreamingService _subscriptionService; + public MixMqService(ILogger logger, MixQueueMessages queue, GrpcStreamingService subscriptionService) + { + _logger = logger; + _queue = queue; + _subscriptionService = subscriptionService; + } + + public override Task Subscribe(SubscribeRequest request, IServerStreamWriter responseStream, ServerCallContext context) + { + try + { + _logger.LogInformation($"{request.SubsctiptionId} started at {DateTime.UtcNow.AddHours(7)}"); + return _subscriptionService.AddSubscription(request, responseStream); + } + catch (Exception e) + { + _logger.LogError($"{request.SubsctiptionId} broken at {DateTime.UtcNow.AddHours(7)}: {e.Message}", e); + return _subscriptionService.RemoveSubscription(request); + } + } + + public override async Task Disconnect(SubscribeRequest request, ServerCallContext context) + { + await _subscriptionService.RemoveSubscription(request); + _logger.LogInformation($"{request.SubsctiptionId} disconnected at {DateTime.UtcNow.AddHours(7)}"); + return new(); + } + + public override Task Publish(PublishMessageRequest request, ServerCallContext context) + { + if (!request.Message.IsJsonString()) + { + return Task.FromResult(new()); + } + + MessageQueueModel? msg = TryParseMessage(request.Message); + if (msg != null) + { + _queue.GetTopic(request.TopicId).PushQueue(msg); + } + + return Task.FromResult(new()); + } + + private MessageQueueModel? TryParseMessage(string message) + { + try + { + return JObject.Parse(message).ToObject(); + } + catch (Exception e) + { + _logger.LogError(e, "From MixMq"); + return default; + } + } +} diff --git a/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/MixMqSubscriptionService.cs b/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/MixMqSubscriptionService.cs new file mode 100644 index 000000000..0385c67a9 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Domain/Services/MixMqSubscriptionService.cs @@ -0,0 +1,33 @@ +using Azure.Messaging.ServiceBus.Administration; +using Grpc.Core; +using Mix.Mq.Lib.Models; +using Newtonsoft.Json.Linq; +using System.Collections.Concurrent; +using System.Threading; + +namespace Mix.Mq.Server.Domain.Services +{ + public sealed class MixMqSubscriptionService : IHostedService + { + private readonly ILogger _logger; + private CancellationToken _cancellationToken; + private GrpcStreamingService _grpcStreamingService { get; set; } + public MixMqSubscriptionService(ILogger logger, GrpcStreamingService grpcStreamingService) + { + _logger = logger; + _grpcStreamingService = grpcStreamingService; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + return _grpcStreamingService.LoadAllSubscriptions(cancellationToken); + } + public Task StopAsync(CancellationToken cancellationToken) + { + _logger.LogInformation($"{GetType().FullName} stopped"); + return Task.CompletedTask; + } + + + } +} diff --git a/src/services/core/mix-message-queue/mix.mq.server/Domain/StartupService.cs b/src/services/core/mix-message-queue/mix.mq.server/Domain/StartupService.cs new file mode 100644 index 000000000..af0d3e401 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Domain/StartupService.cs @@ -0,0 +1,37 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Mix.Mq.Lib.Models; +using Mix.Mq.Server.Domain.Services; +using Mix.Shared.Interfaces; + +namespace Mix.Mq.Server.Domain +{ + public class StartupService : IStartupService + { + public void AddServices(IServiceCollection services, IConfiguration configuration) + { + services.TryAddSingleton(); + services.AddHostedService(); + services.TryAddSingleton>(); + services.AddGrpc(); + services.AddCors(o => o.AddPolicy("AllowAllGrpc", builder => + { + builder.WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding"); + })); + } + + public void UseApps(IApplicationBuilder app, IConfiguration configuration, bool isDevelop) + { + app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true }); + } + + public void UseEndpoints(IEndpointRouteBuilder endpoints, IConfiguration configuration, bool isDevelop) + { + endpoints.MapGrpcService().EnableGrpcWeb() + .RequireCors("AllowAllGrpc"); + } + } +} diff --git a/src/services/core/mix-message-queue/mix.mq.server/Program.cs b/src/services/core/mix-message-queue/mix.mq.server/Program.cs new file mode 100644 index 000000000..081df4c99 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Program.cs @@ -0,0 +1,100 @@ +using Microsoft.Extensions.DependencyInjection.Extensions; +using Mix.Constant.Constants; +using Mix.Heart.Services; +using Mix.Lib.Helpers; +using Mix.Log.Lib; +using Mix.Mq.Lib.Models; +using Mix.Mq.Server.Domain.Services; +using OpenTelemetry; +using System.Configuration; +using System.Reflection; +using Mix.Queue.Extensions; +using Mix.Database.Entities.Account; +using Mix.Service.Interfaces; +using Mix.Service.Services; +using Mix.Database.Entities.Cms; +using Mix.Database.Services; +using Mix.Lib.Interfaces; +using Mix.Queue.Interfaces; +using Mix.Queue.Services; +using Mix.Shared.Services; +using Mix.SignalR.Interfaces; +using Mix.Lib.Services; + +if (Directory.Exists($"../{MixFolders.MixCoreConfigurationFolder}")) +{ + MixFileHelper.CopyFolder($"../{MixFolders.MixCoreConfigurationFolder}", MixFolders.MixContentSharedFolder); +} + + +var builder = MixCmsHelper.CreateWebApplicationBuilder(args); +if (builder.Environment.IsDevelopment()) +{ + builder.AddServiceDefaults(); +} + +// Add services to the container. + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.Configure(options => +{ + options.ServicesStartConcurrently = true; + options.ServicesStopConcurrently = false; +}); +builder.AddMixQueue(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton>(); +builder.Services.AddHostedService(); + +// Add services to the container. +builder.Services.AddGrpc(); +builder.Services.AddMixCors(); +builder.Services.AddCors(o => o.AddPolicy("AllowAllGrpc", builder => +{ + builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding"); +})); + +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton, MemoryQueueService>(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); + +builder.Services.AddMixSignalR(builder.Configuration); +builder.Services.AddMixCommunicators(); +builder.Services.AddSwaggerGen(); +builder.Services.TryAddSingleton(); +builder.Services.AddDbContext(); +builder.Services.AddDbContext(); +builder.Services.AddMixIdentityConfigurations(builder.Configuration); +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.MapDefaultEndpoints(); +} + +// Configure the HTTP request pipeline. + +app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true }); +app.UseRouting(); +app.UseMixCors(); +app.UseMixAuth(); +app.UseEndpoints(endpoints => +{ + endpoints.MapGrpcService().EnableGrpcWeb() + .RequireCors("AllowAllGrpc"); + endpoints.UseMixSignalRApp(); +}); +app.UseSwagger(); +app.UseSwaggerUI(); +app.UseMixSwaggerApps(app.Environment.IsDevelopment(), Assembly.GetExecutingAssembly()); +app.MapControllers(); +app.Run(); \ No newline at end of file diff --git a/src/services/core/mix-message-queue/mix.mq.server/Properties/launchSettings.json b/src/services/core/mix-message-queue/mix.mq.server/Properties/launchSettings.json new file mode 100644 index 000000000..dfa0391c9 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Properties/launchSettings.json @@ -0,0 +1,42 @@ +{ + "profiles": { + "https": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:7275;http://localhost:5062" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Container (Dockerfile)": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "environmentVariables": { + "ASPNETCORE_HTTPS_PORTS": "8081", + "ASPNETCORE_HTTP_PORTS": "8080" + }, + "publishAllPorts": true, + "useSSL": true + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:39272", + "sslPort": 44361 + } + } +} \ No newline at end of file diff --git a/src/services/core/mix-message-queue/mix.mq.server/Readme.md b/src/services/core/mix-message-queue/mix.mq.server/Readme.md new file mode 100644 index 000000000..6fdf4e285 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/Readme.md @@ -0,0 +1,119 @@ +*Must copy proto to mix.queue if change* + +## Ref https://engineering.fb.com/2021/02/22/production-engineering/foqs-scaling-a-distributed-priority-queue/ + +# Azure Service Bus: +- https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-to-use-topics-subscriptions +- If you want to use topics and subscriptions, choose either Standard or Premium. Topics/subscriptions aren't supported in the Basic pricing tier. + +# Google Cloud Pub/Sub : + +- Enable Pub/Sub API https://console.cloud.google.com/apis/library/pubsub.googleapis.com +- Create Service Account https://console.cloud.google.com/iam-admin/serviceaccounts/create +- Grant Pub/Sub Admin +- Edit Service Account => create json key => save to MixContent/AppConfigs/google_credential.json +- https://console.cloud.google.com/cloudpubsub/topic/list?projec={projectId} +- Each Subscription have 1 subscriber only => to have multiple subscriber => create multi subscription + +# Publish Mix Queue +## Solution 1: +- Create Publisher for model to create topic on google if not exist +``` + public class ThemePublisherService : GooglePublisherService +{ + public ThemePublisherService( + IQueueService queueService, + IConfiguration configuration, IWebHostEnvironment environment) + : base(queueService, configuration, environment) + { + } +} +``` + +``` +public class PageContentPublisherService : PublisherServiceBase +{ + static string topicId = typeof(MixPageContentViewModel).FullName; + public PageContentPublisherService( + IQueueService queueService, + IConfiguration configuration, IWebHostEnvironment environment, + MixMemoryMessageQueue queueMessage) + : base(topicId, queueService, configuration, environment, queueMessage) + { + } +} + +``` +*** TopicId: "uniqueTopic" (default fullname) + +- Add Publisher Host Service +``` +services.AddHostedService(); +``` +- Inject Mix Queue Message to push message +``` +Inject IQueueService _queueService +``` +- Push queue Message: +``` +var post = new MixThemeViewModel() +{ + DisplayName = " test queue" +}; +var msg = new MessageQueueModel(); +msg.Package(post); +_queueService.PushQueue(msg); + +// Or push custom message + +_queueService.PushQueue(new MessageQueueModel() +{ + Action = Shared.Enums.MixRestAction.Get, + TopicId = "uniqueTopic", + Model = JObject.FromObject(products), + Status = Shared.Enums.MixRestStatus.Success +}); +``` +## Solution 2: +- Use [GeneratePublisher] Attribute for ViewModel that need to generate Publisher + +# Subscribe Queue +- Create Subscriber for each module +``` +public class TenantSubscriber : SubscriberBase +{ + private UnitOfWorkInfo _uow; + static string topicId = typeof(MixTenantViewModel).FullName; + public TenantSubscriber( + IConfiguration configuration, + MixMemoryMessageQueue queueService) + : base(topicId, MixModuleNames.Mixcore, configuration, queueService) + { + _uow = new(new MixCmsContext()); + } + + public override async Task Handler(MessageQueueModel data) + { + var _repository = MixTenantViewModel.GetRepository(_uow); + var post = data.Data.ToObject(); + switch (data.Action) + { + case "Get": + break; + case "Post": + case "Put": + case "Patch": + case "Delete": + MixTenantRepository.Instance.AllTenants = await _repository.GetAllAsync(m => true); + break; + default: + break; + } + await _uow.CompleteAsync(); + } +} +``` +- Add Subscriber Host Service +``` +services.AddHostedService(); +``` diff --git a/src/services/core/mix-message-queue/mix.mq.server/appsettings.Development.json b/src/services/core/mix-message-queue/mix.mq.server/appsettings.Development.json new file mode 100644 index 000000000..0c208ae91 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj b/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj new file mode 100644 index 000000000..301264ebe --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.csproj @@ -0,0 +1,32 @@ + + + + net8.0 + false + false + enable + enable + true + Mix.Mq.Server + 8bd31145-2a3f-4051-9229-af754f13c778 + Linux + ..\..\.. + + + + + + + + + + + + + + + + + + + diff --git a/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.http b/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.http new file mode 100644 index 000000000..ab0f024f0 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/mix.mq.server.http @@ -0,0 +1,6 @@ +@mix.mq.server_HostAddress = http://localhost:5062 + +GET {{mix.mq.server_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/src/services/core/mix-message-queue/mix.mq.server/runtimeconfig.template.json b/src/services/core/mix-message-queue/mix.mq.server/runtimeconfig.template.json new file mode 100644 index 000000000..cbbea1422 --- /dev/null +++ b/src/services/core/mix-message-queue/mix.mq.server/runtimeconfig.template.json @@ -0,0 +1,12 @@ +{ + "configProperties": { + "System.GC.RetainVM": false, + "System.GC.NoAffinitize": false, + "System.GC.ConserveMemory": 5, + "System.GC.Server": false, + "System.GC.Concurrent": true, + "System.GC.HeapCount": 12, + "System.Threading.Thread.EnableAutoreleasePool": true + } + } + \ No newline at end of file diff --git a/src/services/mix-auth-service/mix.auth.api/Controllers/MixAccountController.cs b/src/services/mix-auth-service/mix.auth.api/Controllers/MixAccountController.cs index 50374694c..7bb40c636 100644 --- a/src/services/mix-auth-service/mix.auth.api/Controllers/MixAccountController.cs +++ b/src/services/mix-auth-service/mix.auth.api/Controllers/MixAccountController.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; @@ -24,6 +24,8 @@ using Mix.Identity.Interfaces; using Mix.Mq.Lib.Models; using Mix.RepoDb.Interfaces; +using Mix.Service.Commands; +using MySqlX.XDevAPI.Common; namespace mix.auth.service.Controllers { @@ -125,7 +127,7 @@ public async Task Register([FromBody] RegisterRequestModel model) { await _idService.RegisterAsync(model, CurrentTenant.Id, _cmsUow); var user = await _userManager.FindByNameAsync(model.UserName).ConfigureAwait(false); - var result = _idService.GetAuthData(user, true, CurrentTenant.Id); + var result = await _idService.GetAuthData(user, true, CurrentTenant.Id); if (result != null && user != null) { if (_authConfigService.AppSettings.RequireConfirmedEmail) @@ -142,7 +144,6 @@ public async Task Register([FromBody] RegisterRequestModel model) await _edmService.SendMailWithEdmTemplate("Welcome", "Welcome", ReflectionHelper.ParseObject(user), user.Email); } - return Ok(result); } else @@ -357,6 +358,11 @@ await _repoDbRepository.DeleteAsync(new List() new QueryField("parentId", user.Id), new QueryField("parentType", MixContentType.User) }); + QueueService.PushMemoryQueue( + CurrentTenant.Id, + MixQueueTopics.MixBackgroundTasks, + MixQueueActions.MixDbEvent, + new MixDbEventCommand(user.UserName, MixDbCommandQueueAction.Delete.ToString(), MixDatabaseNames.SYSTEM_USER_DATA, ReflectionHelper.ParseObject(user))); return Ok(); } } diff --git a/src/services/mix-auth-service/mix.auth.api/Program.cs b/src/services/mix-auth-service/mix.auth.api/Program.cs index d674c9de9..5c1c86cb6 100644 --- a/src/services/mix-auth-service/mix.auth.api/Program.cs +++ b/src/services/mix-auth-service/mix.auth.api/Program.cs @@ -6,6 +6,18 @@ using Mix.Log.Lib; using Microsoft.Azure.Amqp.Framing; using Mix.Lib.Middlewares; +using Mix.Lib.Services; +using Mix.Mq.Lib.Models; +using Mix.Queue.Interfaces; +using Mix.Queue.Services; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Mix.Lib.Publishers; +using Mix.Lib.Subscribers; +using Mix.Log.Lib.Subscribers; +using Mix.Log.Lib.Publishers; +using Mix.Log.Lib.Interfaces; +using Mix.Log.Lib.Services; +using Mix.Shared.Models.Configurations; if (Directory.Exists($"../{MixFolders.MixCoreConfigurationFolder}")) { @@ -18,7 +30,7 @@ { builder.AddServiceDefaults(); } - +var globalConfigs = builder.Configuration.GetSection(MixAppSettingsSection.GlobalSettings).Get()!; // Add services to the container. builder.Services.AddControllers(); @@ -27,15 +39,21 @@ builder.Services.AddMixServices(Assembly.GetExecutingAssembly(), builder.Configuration); builder.Services.AddMixCors(); -builder.Services.AddMixLog(builder.Configuration); // Must app Auth config after Add mixservice to init App config builder.Services.AddMixAuthorize(builder.Configuration); - - +builder.Services.AddScoped(); +builder.Services.TryAddSingleton, MemoryQueueService>(); +builder.Services.AddHostedService(); +builder.Services.AddHostedService(); +builder.AddMixLogPublisher(); var app = builder.Build(); app.UseMixTenant(); -app.UseMiddleware(); + +if (!globalConfigs!.IsInit) +{ + app.UseMiddleware(); +} app.UseMixCors(); app.UseRouting(); app.UseMixAuth(); diff --git a/src/services/mix-auth-service/mix.auth.api/mix.auth.api.csproj b/src/services/mix-auth-service/mix.auth.api/mix.auth.api.csproj index 84d076925..c5ca2b614 100644 --- a/src/services/mix-auth-service/mix.auth.api/mix.auth.api.csproj +++ b/src/services/mix-auth-service/mix.auth.api/mix.auth.api.csproj @@ -14,10 +14,7 @@ Mix.Auth.Api - - - - + @@ -52,7 +49,7 @@ - + diff --git a/src/services/mix-message-queue/mix.mq.server/Program.cs b/src/services/mix-message-queue/mix.mq.server/Program.cs index 55e605e13..bc71cbca4 100644 --- a/src/services/mix-message-queue/mix.mq.server/Program.cs +++ b/src/services/mix-message-queue/mix.mq.server/Program.cs @@ -9,6 +9,17 @@ using System.Configuration; using System.Reflection; using Mix.Queue.Extensions; +using Mix.Database.Entities.Account; +using Mix.Service.Interfaces; +using Mix.Service.Services; +using Mix.Database.Entities.Cms; +using Mix.Database.Services; +using Mix.Lib.Interfaces; +using Mix.Queue.Interfaces; +using Mix.Queue.Services; +using Mix.Shared.Services; +using Mix.SignalR.Interfaces; +using Mix.Lib.Services; if (Directory.Exists($"../{MixFolders.MixCoreConfigurationFolder}")) { @@ -48,7 +59,14 @@ .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding"); })); -builder.Services.AddMixLog(builder.Configuration); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton, MemoryQueueService>(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); +builder.Services.TryAddSingleton(); + builder.Services.AddMixSignalR(builder.Configuration); builder.Services.AddMixCommunicators(); builder.Services.AddSwaggerGen(); diff --git a/src/services/mix-message-queue/mix.mq.server/mix.mq.server.csproj b/src/services/mix-message-queue/mix.mq.server/mix.mq.server.csproj index c1b21c814..7a7f1fe18 100644 --- a/src/services/mix-message-queue/mix.mq.server/mix.mq.server.csproj +++ b/src/services/mix-message-queue/mix.mq.server/mix.mq.server.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -18,11 +18,11 @@ - - - - - + + + + + diff --git a/src/test/locustfile.py b/src/test/locustfile.py index 6da4fa3a8..e958af2af 100644 --- a/src/test/locustfile.py +++ b/src/test/locustfile.py @@ -6,15 +6,15 @@ class QuickstartUser(HttpUser): # self.headers = {'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiT3duZXItMSIsIlN1cGVyQWRtaW4iXSwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiI1NWFmNjA4OC04MjllLTQ0YWEtODUyYS01YjdiY2NjOGFlM2IiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGlua3UiLCJSZWZyZXNoVG9rZW4iOiIyYzdkODljMi1hNzVlLTRmOGItODMyNC0xZmQyN2JmYjY5Y2MiLCJBdmF0YXIiOiIvbWl4LWFwcC9hc3NldHMvaW1nL3VzZXIucG5nIiwiQUVTS2V5IjoiTkVsVWVtcE9TbXg0UVZsWFJGUm1TeXM1WjBscFp6MDlMRVJCU0VOVFVVbFpXRVZOWVZSSlJsRXJjMjU2YkU5SWJtbzFaMHd3Y201UFJtOWlNRGxYU0VKU00wVTkiLCJSU0FQdWJsaWNLZXkiOiI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtMTZcIj8-XHJcbjxSU0FQYXJhbWV0ZXJzIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIj5cclxuICA8RXhwb25lbnQ-QVFBQjwvRXhwb25lbnQ-XHJcbiAgPE1vZHVsdXM-b1hIN09ISUVQdXFRRXVHRk8wRm81dXgyT0NyQTBoclAyeWpBK0FCUUlvV3JTdmMvVkM0T2pZdEpvODhQY2VaR2ZWc0dUaXhkdDlMZ1YrZzZTTVpGMWxIME1BUVRWTzhndGU0YzBvbkdZL09FOFAySDVSZFVQL0E0eVA1Sldjd1VuQ21mSG8ydUJuempPSXF4MnRjaFB4cnR6UmlQZnJkZGp1MHVUcXJJNUwwSVVERTFZSk1rbzFaUDVLY2oyQzBPcnVqd0FCVzBsTitxZXhFTnpidDBZZFoyVzd2UXBrZ0xFcXlVdWJ1RUo0MllieDQzSVBEWWxnY1JNaHZ2YnYxTGl2U3liLzBRZkJSNVhXSFRQYzduMGJZRWpBQkI1RkgrT29YdnlHZXpHSU1qR1FMMnoxVnpiT0lqMzFpS2lCclhrcjBrR2ZJSzRsQzdSNElqdkh1K0FRPT08L01vZHVsdXM-XHJcbjwvUlNBUGFyYW1ldGVycz4iLCJFeHBpcmVBdCI6IjIwMjMtMDUtMTRUMDU6MDA6MzMuNzk0WiIsIm5iZiI6MTY4NDAzOTIzMywiZXhwIjoxNjg0MDQwNDMzLCJpc3MiOiJtaXgtY29yZSIsImF1ZCI6Im1peC1jb3JlIn0.3IARED63s03ZOlCa0olj4sN9V3XFoAej0xS9sJfLL54'} @task def hello_world(self): - self.client.get("/") + # self.client.get("/") # self.client.get("/post/3/the-future-of-cms-from-mixcore") - # self.client.post( - # url="/api/v2/rest/mix-portal/mix-db/Metadata/hub", - # json={"type":"testuser", "content":"secret", "seoContent": "asdfa"}, - # auth=None, - # # headers={"authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiT3duZXItMSIsIlN1cGVyQWRtaW4iXSwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiI1NWFmNjA4OC04MjllLTQ0YWEtODUyYS01YjdiY2NjOGFlM2IiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGlua3UiLCJSZWZyZXNoVG9rZW4iOiIyYzdkODljMi1hNzVlLTRmOGItODMyNC0xZmQyN2JmYjY5Y2MiLCJBdmF0YXIiOiIvbWl4LWFwcC9hc3NldHMvaW1nL3VzZXIucG5nIiwiQUVTS2V5IjoiTkVsVWVtcE9TbXg0UVZsWFJGUm1TeXM1WjBscFp6MDlMRVJCU0VOVFVVbFpXRVZOWVZSSlJsRXJjMjU2YkU5SWJtbzFaMHd3Y201UFJtOWlNRGxYU0VKU00wVTkiLCJSU0FQdWJsaWNLZXkiOiI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtMTZcIj8-XHJcbjxSU0FQYXJhbWV0ZXJzIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIj5cclxuICA8RXhwb25lbnQ-QVFBQjwvRXhwb25lbnQ-XHJcbiAgPE1vZHVsdXM-b1hIN09ISUVQdXFRRXVHRk8wRm81dXgyT0NyQTBoclAyeWpBK0FCUUlvV3JTdmMvVkM0T2pZdEpvODhQY2VaR2ZWc0dUaXhkdDlMZ1YrZzZTTVpGMWxIME1BUVRWTzhndGU0YzBvbkdZL09FOFAySDVSZFVQL0E0eVA1Sldjd1VuQ21mSG8ydUJuempPSXF4MnRjaFB4cnR6UmlQZnJkZGp1MHVUcXJJNUwwSVVERTFZSk1rbzFaUDVLY2oyQzBPcnVqd0FCVzBsTitxZXhFTnpidDBZZFoyVzd2UXBrZ0xFcXlVdWJ1RUo0MllieDQzSVBEWWxnY1JNaHZ2YnYxTGl2U3liLzBRZkJSNVhXSFRQYzduMGJZRWpBQkI1RkgrT29YdnlHZXpHSU1qR1FMMnoxVnpiT0lqMzFpS2lCclhrcjBrR2ZJSzRsQzdSNElqdkh1K0FRPT08L01vZHVsdXM-XHJcbjwvUlNBUGFyYW1ldGVycz4iLCJFeHBpcmVBdCI6IjIwMjMtMDUtMTRUMDU6MDA6MzMuNzk0WiIsIm5iZiI6MTY4NDAzOTIzMywiZXhwIjoxNjg0MDQwNDMzLCJpc3MiOiJtaXgtY29yZSIsImF1ZCI6Im1peC1jb3JlIn0.3IARED63s03ZOlCa0olj4sN9V3XFoAej0xS9sJfLL54"}, - # name="Metadata/hub", - # ) + self.client.post( + url="/api/v2/rest/mix-portal/mix-db/Metadata/hub", + json={"type":"testuser", "content":"secret", "seoContent": "asdfa"}, + auth=None, + # headers={"authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiT3duZXItMSIsIlN1cGVyQWRtaW4iXSwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiI1NWFmNjA4OC04MjllLTQ0YWEtODUyYS01YjdiY2NjOGFlM2IiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGlua3UiLCJSZWZyZXNoVG9rZW4iOiIyYzdkODljMi1hNzVlLTRmOGItODMyNC0xZmQyN2JmYjY5Y2MiLCJBdmF0YXIiOiIvbWl4LWFwcC9hc3NldHMvaW1nL3VzZXIucG5nIiwiQUVTS2V5IjoiTkVsVWVtcE9TbXg0UVZsWFJGUm1TeXM1WjBscFp6MDlMRVJCU0VOVFVVbFpXRVZOWVZSSlJsRXJjMjU2YkU5SWJtbzFaMHd3Y201UFJtOWlNRGxYU0VKU00wVTkiLCJSU0FQdWJsaWNLZXkiOiI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtMTZcIj8-XHJcbjxSU0FQYXJhbWV0ZXJzIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIj5cclxuICA8RXhwb25lbnQ-QVFBQjwvRXhwb25lbnQ-XHJcbiAgPE1vZHVsdXM-b1hIN09ISUVQdXFRRXVHRk8wRm81dXgyT0NyQTBoclAyeWpBK0FCUUlvV3JTdmMvVkM0T2pZdEpvODhQY2VaR2ZWc0dUaXhkdDlMZ1YrZzZTTVpGMWxIME1BUVRWTzhndGU0YzBvbkdZL09FOFAySDVSZFVQL0E0eVA1Sldjd1VuQ21mSG8ydUJuempPSXF4MnRjaFB4cnR6UmlQZnJkZGp1MHVUcXJJNUwwSVVERTFZSk1rbzFaUDVLY2oyQzBPcnVqd0FCVzBsTitxZXhFTnpidDBZZFoyVzd2UXBrZ0xFcXlVdWJ1RUo0MllieDQzSVBEWWxnY1JNaHZ2YnYxTGl2U3liLzBRZkJSNVhXSFRQYzduMGJZRWpBQkI1RkgrT29YdnlHZXpHSU1qR1FMMnoxVnpiT0lqMzFpS2lCclhrcjBrR2ZJSzRsQzdSNElqdkh1K0FRPT08L01vZHVsdXM-XHJcbjwvUlNBUGFyYW1ldGVycz4iLCJFeHBpcmVBdCI6IjIwMjMtMDUtMTRUMDU6MDA6MzMuNzk0WiIsIm5iZiI6MTY4NDAzOTIzMywiZXhwIjoxNjg0MDQwNDMzLCJpc3MiOiJtaXgtY29yZSIsImF1ZCI6Im1peC1jb3JlIn0.3IARED63s03ZOlCa0olj4sN9V3XFoAej0xS9sJfLL54"}, + name="Metadata/hub", + ) # self.client.post("/api/v2/rest/mix-portal/mix-db/Metadata/hub", {"type":"testuser", "content":"secret", "seoContent": "asdfa"}) # @task(3) diff --git a/src/test/mix.xunittest/mix.xunittest.csproj b/src/test/mix.xunittest/mix.xunittest.csproj index df5d51e37..a714e81e3 100644 --- a/src/test/mix.xunittest/mix.xunittest.csproj +++ b/src/test/mix.xunittest/mix.xunittest.csproj @@ -36,14 +36,14 @@ - - + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/test/p4ps.pos.api.tests/Services/Order/PosOrderServiceTests.cs b/src/test/p4ps.pos.api.tests/Services/Order/PosOrderServiceTests.cs new file mode 100644 index 000000000..02b1793d8 --- /dev/null +++ b/src/test/p4ps.pos.api.tests/Services/Order/PosOrderServiceTests.cs @@ -0,0 +1,6 @@ +namespace mixcore.pos.api.tests.Services.Order +{ + public class PosOrderServiceTests + { + } +} diff --git a/src/test/p4ps.pos.api.tests/p4ps.pos.api.tests.csproj b/src/test/p4ps.pos.api.tests/p4ps.pos.api.tests.csproj new file mode 100644 index 000000000..87b0984cb --- /dev/null +++ b/src/test/p4ps.pos.api.tests/p4ps.pos.api.tests.csproj @@ -0,0 +1,33 @@ + + + + net8.0 + enable + enable + + false + true + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + +