commit b1d69a2cdfdcb5497e424173c2f59c7ca8372dc8 Author: jandres Date: Fri Dec 6 14:58:13 2024 -0600 Add project files. diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..e7b690f1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..1ff0c423 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b21d3e09 --- /dev/null +++ b/.gitignore @@ -0,0 +1,256 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +src/SplashPage.Web.Mvc/secrets.json +src/SplashPage.Web.Host/secrets.json +src/SplashPage.Migrator/secrets.json diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 00000000..c3f99d3e --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/SplashPage.sln b/SplashPage.sln new file mode 100644 index 00000000..b18ebfae --- /dev/null +++ b/SplashPage.sln @@ -0,0 +1,88 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30709.64 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F10AA149-2626-486E-85BB-9CD5365F3016}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Core", "src\SplashPage.Core\SplashPage.Core.csproj", "{0FA75A5B-AB83-4FD0-B545-279774C01E87}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Application", "src\SplashPage.Application\SplashPage.Application.csproj", "{3870C648-4AEA-4B85-BA3F-F2F63B96136A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Tests", "test\SplashPage.Tests\SplashPage.Tests.csproj", "{0D4C5D00-C144-4213-A007-4B8944113AB1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Migrator", "src\SplashPage.Migrator\SplashPage.Migrator.csproj", "{880B3591-E057-46FE-B525-10BD83828B93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Web.Host", "src\SplashPage.Web.Host\SplashPage.Web.Host.csproj", "{38E184BD-E874-4633-A947-AED4FDB73F40}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Web.Core", "src\SplashPage.Web.Core\SplashPage.Web.Core.csproj", "{22CFE0D2-8DCA-42D7-AD7D-784C3862493F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Web.Mvc", "src\SplashPage.Web.Mvc\SplashPage.Web.Mvc.csproj", "{A2213374-BB48-48FD-BBD4-81E6A961D866}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.EntityFrameworkCore", "src\SplashPage.EntityFrameworkCore\SplashPage.EntityFrameworkCore.csproj", "{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SplashPage.Web.Tests", "test\SplashPage.Web.Tests\SplashPage.Web.Tests.csproj", "{CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Release|Any CPU.Build.0 = Release|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Release|Any CPU.Build.0 = Release|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Release|Any CPU.Build.0 = Release|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Release|Any CPU.Build.0 = Release|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Release|Any CPU.Build.0 = Release|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Release|Any CPU.Build.0 = Release|Any CPU + {A2213374-BB48-48FD-BBD4-81E6A961D866}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2213374-BB48-48FD-BBD4-81E6A961D866}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2213374-BB48-48FD-BBD4-81E6A961D866}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2213374-BB48-48FD-BBD4-81E6A961D866}.Release|Any CPU.Build.0 = Release|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Release|Any CPU.Build.0 = Release|Any CPU + {CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {0FA75A5B-AB83-4FD0-B545-279774C01E87} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {3870C648-4AEA-4B85-BA3F-F2F63B96136A} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {0D4C5D00-C144-4213-A007-4B8944113AB1} = {F10AA149-2626-486E-85BB-9CD5365F3016} + {880B3591-E057-46FE-B525-10BD83828B93} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {38E184BD-E874-4633-A947-AED4FDB73F40} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {A2213374-BB48-48FD-BBD4-81E6A961D866} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087} = {F10AA149-2626-486E-85BB-9CD5365F3016} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9A55C749-0BFF-4EFD-8499-12A2CB3B5B07} + EndGlobalSection +EndGlobal diff --git a/build/build-mvc.ps1 b/build/build-mvc.ps1 new file mode 100644 index 00000000..5e2d8778 --- /dev/null +++ b/build/build-mvc.ps1 @@ -0,0 +1,20 @@ +echo " Welcome to docker build" +echo "" +echo "" + +$ABP_MVC="abp/mvc" +$ABP_MVC_DOCKERFILE_PATH="src/SplashPage.Web.Mvc/Dockerfile" +$ABP_NG="abp/ng" + +cd .. +echo " Building docker image $ABP_MVC..." +docker build -t $ABP_MVC -f $ABP_MVC_DOCKERFILE_PATH . +echo " Done. -- Building docker image $ABP_MVC..." +echo "" +echo "" + +# echo " Pushing docker image $ABP_MVC..." +# docker push $ABP_MVC +# echo " Done. -- Pushing docker image $ABP_MVC..." +# echo "" +# echo "" diff --git a/build/build-with-ng.sh b/build/build-with-ng.sh new file mode 100644 index 00000000..6b006ca0 --- /dev/null +++ b/build/build-with-ng.sh @@ -0,0 +1,34 @@ +#!/bin/bash +echo " Welcome to docker build" +echo "" +echo "" + +ABP_HOST="abp/host" +ABP_NG="abp/ng" + +cd .. +echo " Building docker image $ABP_HOST..." +docker build -t $ABP_HOST . +echo " Done. -- Building docker image $ABP_HOST..." +echo "" +echo "" + +# echo " Pushing docker image $ABP_HOST..." +# docker push $ABP_HOST +# echo " Done. -- Pushing docker image $ABP_HOST..." +# echo "" +# echo "" + +cd .. +cd angular/ +echo " Building docker image $ABP_NG..." +docker build -t $ABP_NG -f Dockerfile . +echo " Done. -- Building docker image $ABP_NG..." +echo "" +echo "" + +# echo " Pushing docker image $ABP_NG..." +# docker push $ABP_NG +# echo " Done. -- Pushing docker image $ABP_NG..." +# echo "" +# echo "" diff --git a/docker/mvc/docker-compose.yml b/docker/mvc/docker-compose.yml new file mode 100644 index 00000000..a08a4657 --- /dev/null +++ b/docker/mvc/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' + +services: + + abp_host: + image: abp/mvc + environment: + ASPNETCORE_ENVIRONMENT: "Staging" + ConnectionStrings__Default: "Server=10.0.75.1; Database=SplashPageDb; User=sa; Password=123qwe;TrustServerCertificate=True;" + TZ: "America/Toronto" + Kestrel__Endpoints__Http__Url: "http://+:80" + ports: + - "44312:80" + volumes: + - "./Mvc-Logs:/app/App_Data/Logs" + restart: always diff --git a/docker/mvc/down.ps1 b/docker/mvc/down.ps1 new file mode 100644 index 00000000..508a7c4d --- /dev/null +++ b/docker/mvc/down.ps1 @@ -0,0 +1 @@ +docker-compose down -v --rmi local \ No newline at end of file diff --git a/docker/mvc/up.ps1 b/docker/mvc/up.ps1 new file mode 100644 index 00000000..5177d11e --- /dev/null +++ b/docker/mvc/up.ps1 @@ -0,0 +1 @@ +docker-compose up -d \ No newline at end of file diff --git a/src/SplashPage.Application/Authorization/AbpLoginResultTypeHelper.cs b/src/SplashPage.Application/Authorization/AbpLoginResultTypeHelper.cs new file mode 100644 index 00000000..25f79662 --- /dev/null +++ b/src/SplashPage.Application/Authorization/AbpLoginResultTypeHelper.cs @@ -0,0 +1,63 @@ +using Abp; +using Abp.Authorization; +using Abp.Dependency; +using Abp.UI; +using System; + +namespace SplashPage.Authorization; + +public class AbpLoginResultTypeHelper : AbpServiceBase, ITransientDependency +{ + public AbpLoginResultTypeHelper() + { + LocalizationSourceName = SplashPageConsts.LocalizationSourceName; + } + + public Exception CreateExceptionForFailedLoginAttempt(AbpLoginResultType result, string usernameOrEmailAddress, string tenancyName) + { + switch (result) + { + case AbpLoginResultType.Success: + return new Exception("Don't call this method with a success result!"); + case AbpLoginResultType.InvalidUserNameOrEmailAddress: + case AbpLoginResultType.InvalidPassword: + return new UserFriendlyException(L("LoginFailed"), L("InvalidUserNameOrPassword")); + case AbpLoginResultType.InvalidTenancyName: + return new UserFriendlyException(L("LoginFailed"), L("ThereIsNoTenantDefinedWithName{0}", tenancyName)); + case AbpLoginResultType.TenantIsNotActive: + return new UserFriendlyException(L("LoginFailed"), L("TenantIsNotActive", tenancyName)); + case AbpLoginResultType.UserIsNotActive: + return new UserFriendlyException(L("LoginFailed"), L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress)); + case AbpLoginResultType.UserEmailIsNotConfirmed: + return new UserFriendlyException(L("LoginFailed"), L("UserEmailIsNotConfirmedAndCanNotLogin")); + case AbpLoginResultType.LockedOut: + return new UserFriendlyException(L("LoginFailed"), L("UserLockedOutMessage")); + default: // Can not fall to default actually. But other result types can be added in the future and we may forget to handle it + Logger.Warn("Unhandled login fail reason: " + result); + return new UserFriendlyException(L("LoginFailed")); + } + } + + public string CreateLocalizedMessageForFailedLoginAttempt(AbpLoginResultType result, string usernameOrEmailAddress, string tenancyName) + { + switch (result) + { + case AbpLoginResultType.Success: + throw new Exception("Don't call this method with a success result!"); + case AbpLoginResultType.InvalidUserNameOrEmailAddress: + case AbpLoginResultType.InvalidPassword: + return L("InvalidUserNameOrPassword"); + case AbpLoginResultType.InvalidTenancyName: + return L("ThereIsNoTenantDefinedWithName{0}", tenancyName); + case AbpLoginResultType.TenantIsNotActive: + return L("TenantIsNotActive", tenancyName); + case AbpLoginResultType.UserIsNotActive: + return L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress); + case AbpLoginResultType.UserEmailIsNotConfirmed: + return L("UserEmailIsNotConfirmedAndCanNotLogin"); + default: // Can not fall to default actually. But other result types can be added in the future and we may forget to handle it + Logger.Warn("Unhandled login fail reason: " + result); + return L("LoginFailed"); + } + } +} diff --git a/src/SplashPage.Application/Authorization/Accounts/AccountAppService.cs b/src/SplashPage.Application/Authorization/Accounts/AccountAppService.cs new file mode 100644 index 00000000..ff880e42 --- /dev/null +++ b/src/SplashPage.Application/Authorization/Accounts/AccountAppService.cs @@ -0,0 +1,56 @@ +using Abp.Configuration; +using Abp.Zero.Configuration; +using SplashPage.Authorization.Accounts.Dto; +using SplashPage.Authorization.Users; +using System.Threading.Tasks; + +namespace SplashPage.Authorization.Accounts; + +public class AccountAppService : SplashPageAppServiceBase, IAccountAppService +{ + // from: http://regexlib.com/REDetails.aspx?regexp_id=1923 + public const string PasswordRegex = "(?=^.{8,}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s)[0-9a-zA-Z!@#$%^&*()]*$"; + + private readonly UserRegistrationManager _userRegistrationManager; + + public AccountAppService( + UserRegistrationManager userRegistrationManager) + { + _userRegistrationManager = userRegistrationManager; + } + + public async Task IsTenantAvailable(IsTenantAvailableInput input) + { + var tenant = await TenantManager.FindByTenancyNameAsync(input.TenancyName); + if (tenant == null) + { + return new IsTenantAvailableOutput(TenantAvailabilityState.NotFound); + } + + if (!tenant.IsActive) + { + return new IsTenantAvailableOutput(TenantAvailabilityState.InActive); + } + + return new IsTenantAvailableOutput(TenantAvailabilityState.Available, tenant.Id); + } + + public async Task Register(RegisterInput input) + { + var user = await _userRegistrationManager.RegisterAsync( + input.Name, + input.Surname, + input.EmailAddress, + input.UserName, + input.Password, + true // Assumed email address is always confirmed. Change this if you want to implement email confirmation. + ); + + var isEmailConfirmationRequiredForLogin = await SettingManager.GetSettingValueAsync(AbpZeroSettingNames.UserManagement.IsEmailConfirmationRequiredForLogin); + + return new RegisterOutput + { + CanLogin = user.IsActive && (user.IsEmailConfirmed || !isEmailConfirmationRequiredForLogin) + }; + } +} diff --git a/src/SplashPage.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs b/src/SplashPage.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs new file mode 100644 index 00000000..dfe35d7f --- /dev/null +++ b/src/SplashPage.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs @@ -0,0 +1,11 @@ +using Abp.MultiTenancy; +using System.ComponentModel.DataAnnotations; + +namespace SplashPage.Authorization.Accounts.Dto; + +public class IsTenantAvailableInput +{ + [Required] + [StringLength(AbpTenantBase.MaxTenancyNameLength)] + public string TenancyName { get; set; } +} diff --git a/src/SplashPage.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs b/src/SplashPage.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs new file mode 100644 index 00000000..e0c5cfb3 --- /dev/null +++ b/src/SplashPage.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs @@ -0,0 +1,18 @@ +namespace SplashPage.Authorization.Accounts.Dto; + +public class IsTenantAvailableOutput +{ + public TenantAvailabilityState State { get; set; } + + public int? TenantId { get; set; } + + public IsTenantAvailableOutput() + { + } + + public IsTenantAvailableOutput(TenantAvailabilityState state, int? tenantId = null) + { + State = state; + TenantId = tenantId; + } +} diff --git a/src/SplashPage.Application/Authorization/Accounts/Dto/RegisterInput.cs b/src/SplashPage.Application/Authorization/Accounts/Dto/RegisterInput.cs new file mode 100644 index 00000000..6649e42a --- /dev/null +++ b/src/SplashPage.Application/Authorization/Accounts/Dto/RegisterInput.cs @@ -0,0 +1,47 @@ +using Abp.Auditing; +using Abp.Authorization.Users; +using Abp.Extensions; +using SplashPage.Validation; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace SplashPage.Authorization.Accounts.Dto; + +public class RegisterInput : IValidatableObject +{ + [Required] + [StringLength(AbpUserBase.MaxNameLength)] + public string Name { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxSurnameLength)] + public string Surname { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxUserNameLength)] + public string UserName { get; set; } + + [Required] + [EmailAddress] + [StringLength(AbpUserBase.MaxEmailAddressLength)] + public string EmailAddress { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxPlainPasswordLength)] + [DisableAuditing] + public string Password { get; set; } + + [DisableAuditing] + public string CaptchaResponse { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if (!UserName.IsNullOrEmpty()) + { + if (!UserName.Equals(EmailAddress) && ValidationHelper.IsEmail(UserName)) + { + yield return new ValidationResult("Username cannot be an email address unless it's the same as your email address!"); + } + } + } +} diff --git a/src/SplashPage.Application/Authorization/Accounts/Dto/RegisterOutput.cs b/src/SplashPage.Application/Authorization/Accounts/Dto/RegisterOutput.cs new file mode 100644 index 00000000..035422bd --- /dev/null +++ b/src/SplashPage.Application/Authorization/Accounts/Dto/RegisterOutput.cs @@ -0,0 +1,6 @@ +namespace SplashPage.Authorization.Accounts.Dto; + +public class RegisterOutput +{ + public bool CanLogin { get; set; } +} diff --git a/src/SplashPage.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs b/src/SplashPage.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs new file mode 100644 index 00000000..c7d290dc --- /dev/null +++ b/src/SplashPage.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs @@ -0,0 +1,8 @@ +namespace SplashPage.Authorization.Accounts.Dto; + +public enum TenantAvailabilityState +{ + Available = 1, + InActive, + NotFound +} diff --git a/src/SplashPage.Application/Authorization/Accounts/IAccountAppService.cs b/src/SplashPage.Application/Authorization/Accounts/IAccountAppService.cs new file mode 100644 index 00000000..b304f470 --- /dev/null +++ b/src/SplashPage.Application/Authorization/Accounts/IAccountAppService.cs @@ -0,0 +1,12 @@ +using Abp.Application.Services; +using SplashPage.Authorization.Accounts.Dto; +using System.Threading.Tasks; + +namespace SplashPage.Authorization.Accounts; + +public interface IAccountAppService : IApplicationService +{ + Task IsTenantAvailable(IsTenantAvailableInput input); + + Task Register(RegisterInput input); +} diff --git a/src/SplashPage.Application/Configuration/ConfigurationAppService.cs b/src/SplashPage.Application/Configuration/ConfigurationAppService.cs new file mode 100644 index 00000000..3d04e20d --- /dev/null +++ b/src/SplashPage.Application/Configuration/ConfigurationAppService.cs @@ -0,0 +1,15 @@ +using Abp.Authorization; +using Abp.Runtime.Session; +using SplashPage.Configuration.Dto; +using System.Threading.Tasks; + +namespace SplashPage.Configuration; + +[AbpAuthorize] +public class ConfigurationAppService : SplashPageAppServiceBase, IConfigurationAppService +{ + public async Task ChangeUiTheme(ChangeUiThemeInput input) + { + await SettingManager.ChangeSettingForUserAsync(AbpSession.ToUserIdentifier(), AppSettingNames.UiTheme, input.Theme); + } +} diff --git a/src/SplashPage.Application/Configuration/Dto/ChangeUiThemeInput.cs b/src/SplashPage.Application/Configuration/Dto/ChangeUiThemeInput.cs new file mode 100644 index 00000000..3fc7c52e --- /dev/null +++ b/src/SplashPage.Application/Configuration/Dto/ChangeUiThemeInput.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace SplashPage.Configuration.Dto; + +public class ChangeUiThemeInput +{ + [Required] + [StringLength(32)] + public string Theme { get; set; } +} diff --git a/src/SplashPage.Application/Configuration/IConfigurationAppService.cs b/src/SplashPage.Application/Configuration/IConfigurationAppService.cs new file mode 100644 index 00000000..c8a43dfd --- /dev/null +++ b/src/SplashPage.Application/Configuration/IConfigurationAppService.cs @@ -0,0 +1,9 @@ +using SplashPage.Configuration.Dto; +using System.Threading.Tasks; + +namespace SplashPage.Configuration; + +public interface IConfigurationAppService +{ + Task ChangeUiTheme(ChangeUiThemeInput input); +} diff --git a/src/SplashPage.Application/Configuration/Ui/UiThemeInfo.cs b/src/SplashPage.Application/Configuration/Ui/UiThemeInfo.cs new file mode 100644 index 00000000..16cfdd23 --- /dev/null +++ b/src/SplashPage.Application/Configuration/Ui/UiThemeInfo.cs @@ -0,0 +1,13 @@ +namespace SplashPage.Configuration.Ui; + +public class UiThemeInfo +{ + public string Name { get; } + public string CssClass { get; } + + public UiThemeInfo(string name, string cssClass) + { + Name = name; + CssClass = cssClass; + } +} diff --git a/src/SplashPage.Application/Configuration/Ui/UiThemes.cs b/src/SplashPage.Application/Configuration/Ui/UiThemes.cs new file mode 100644 index 00000000..2a82f70e --- /dev/null +++ b/src/SplashPage.Application/Configuration/Ui/UiThemes.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; + +namespace SplashPage.Configuration.Ui; + +public static class UiThemes +{ + public static List All { get; } + + static UiThemes() + { + All = new List + { + new UiThemeInfo("Red", "red"), + new UiThemeInfo("Pink", "pink"), + new UiThemeInfo("Purple", "purple"), + new UiThemeInfo("Deep Purple", "deep-purple"), + new UiThemeInfo("Indigo", "indigo"), + new UiThemeInfo("Blue", "blue"), + new UiThemeInfo("Light Blue", "light-blue"), + new UiThemeInfo("Cyan", "cyan"), + new UiThemeInfo("Teal", "teal"), + new UiThemeInfo("Green", "green"), + new UiThemeInfo("Light Green", "light-green"), + new UiThemeInfo("Lime", "lime"), + new UiThemeInfo("Yellow", "yellow"), + new UiThemeInfo("Amber", "amber"), + new UiThemeInfo("Orange", "orange"), + new UiThemeInfo("Deep Orange", "deep-orange"), + new UiThemeInfo("Brown", "brown"), + new UiThemeInfo("Grey", "grey"), + new UiThemeInfo("Blue Grey", "blue-grey"), + new UiThemeInfo("Black", "black") + }; + } +} diff --git a/src/SplashPage.Application/MultiTenancy/Dto/CreateTenantDto.cs b/src/SplashPage.Application/MultiTenancy/Dto/CreateTenantDto.cs new file mode 100644 index 00000000..a86a0c63 --- /dev/null +++ b/src/SplashPage.Application/MultiTenancy/Dto/CreateTenantDto.cs @@ -0,0 +1,28 @@ +using Abp.Authorization.Users; +using Abp.AutoMapper; +using Abp.MultiTenancy; +using System.ComponentModel.DataAnnotations; + +namespace SplashPage.MultiTenancy.Dto; + +[AutoMapTo(typeof(Tenant))] +public class CreateTenantDto +{ + [Required] + [StringLength(AbpTenantBase.MaxTenancyNameLength)] + [RegularExpression(AbpTenantBase.TenancyNameRegex)] + public string TenancyName { get; set; } + + [Required] + [StringLength(AbpTenantBase.MaxNameLength)] + public string Name { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxEmailAddressLength)] + public string AdminEmailAddress { get; set; } + + [StringLength(AbpTenantBase.MaxConnectionStringLength)] + public string ConnectionString { get; set; } + + public bool IsActive { get; set; } +} diff --git a/src/SplashPage.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs b/src/SplashPage.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs new file mode 100644 index 00000000..7eb2ac0f --- /dev/null +++ b/src/SplashPage.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs @@ -0,0 +1,23 @@ +using Abp.Application.Services.Dto; +using Abp.Runtime.Validation; + +namespace SplashPage.MultiTenancy.Dto; + +public class PagedTenantResultRequestDto : PagedResultRequestDto, IShouldNormalize +{ + public string Keyword { get; set; } + public bool? IsActive { get; set; } + + public string Sorting { get; set; } + + public void Normalize() + { + if (string.IsNullOrEmpty(Sorting)) + { + Sorting = "TenancyName,Name"; + } + + Keyword = Keyword?.Trim(); + } +} + diff --git a/src/SplashPage.Application/MultiTenancy/Dto/TenantDto.cs b/src/SplashPage.Application/MultiTenancy/Dto/TenantDto.cs new file mode 100644 index 00000000..e3b84490 --- /dev/null +++ b/src/SplashPage.Application/MultiTenancy/Dto/TenantDto.cs @@ -0,0 +1,21 @@ +using Abp.Application.Services.Dto; +using Abp.AutoMapper; +using Abp.MultiTenancy; +using System.ComponentModel.DataAnnotations; + +namespace SplashPage.MultiTenancy.Dto; + +[AutoMapFrom(typeof(Tenant))] +public class TenantDto : EntityDto +{ + [Required] + [StringLength(AbpTenantBase.MaxTenancyNameLength)] + [RegularExpression(AbpTenantBase.TenancyNameRegex)] + public string TenancyName { get; set; } + + [Required] + [StringLength(AbpTenantBase.MaxNameLength)] + public string Name { get; set; } + + public bool IsActive { get; set; } +} diff --git a/src/SplashPage.Application/MultiTenancy/ITenantAppService.cs b/src/SplashPage.Application/MultiTenancy/ITenantAppService.cs new file mode 100644 index 00000000..ad83fa3c --- /dev/null +++ b/src/SplashPage.Application/MultiTenancy/ITenantAppService.cs @@ -0,0 +1,9 @@ +using Abp.Application.Services; +using SplashPage.MultiTenancy.Dto; + +namespace SplashPage.MultiTenancy; + +public interface ITenantAppService : IAsyncCrudAppService +{ +} + diff --git a/src/SplashPage.Application/MultiTenancy/TenantAppService.cs b/src/SplashPage.Application/MultiTenancy/TenantAppService.cs new file mode 100644 index 00000000..b2e36e07 --- /dev/null +++ b/src/SplashPage.Application/MultiTenancy/TenantAppService.cs @@ -0,0 +1,128 @@ +using Abp.Application.Services; +using Abp.Application.Services.Dto; +using Abp.Authorization; +using Abp.Domain.Repositories; +using Abp.Extensions; +using Abp.IdentityFramework; +using Abp.Linq.Extensions; +using Abp.MultiTenancy; +using Abp.Runtime.Security; +using SplashPage.Authorization; +using SplashPage.Authorization.Roles; +using SplashPage.Authorization.Users; +using SplashPage.Editions; +using SplashPage.MultiTenancy.Dto; +using Microsoft.AspNetCore.Identity; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace SplashPage.MultiTenancy; + +[AbpAuthorize(PermissionNames.Pages_Tenants)] +public class TenantAppService : AsyncCrudAppService, ITenantAppService +{ + private readonly TenantManager _tenantManager; + private readonly EditionManager _editionManager; + private readonly UserManager _userManager; + private readonly RoleManager _roleManager; + private readonly IAbpZeroDbMigrator _abpZeroDbMigrator; + + public TenantAppService( + IRepository repository, + TenantManager tenantManager, + EditionManager editionManager, + UserManager userManager, + RoleManager roleManager, + IAbpZeroDbMigrator abpZeroDbMigrator) + : base(repository) + { + _tenantManager = tenantManager; + _editionManager = editionManager; + _userManager = userManager; + _roleManager = roleManager; + _abpZeroDbMigrator = abpZeroDbMigrator; + } + + public override async Task CreateAsync(CreateTenantDto input) + { + CheckCreatePermission(); + + // Create tenant + var tenant = ObjectMapper.Map(input); + tenant.ConnectionString = input.ConnectionString.IsNullOrEmpty() + ? null + : SimpleStringCipher.Instance.Encrypt(input.ConnectionString); + + var defaultEdition = await _editionManager.FindByNameAsync(EditionManager.DefaultEditionName); + if (defaultEdition != null) + { + tenant.EditionId = defaultEdition.Id; + } + + await _tenantManager.CreateAsync(tenant); + await CurrentUnitOfWork.SaveChangesAsync(); // To get new tenant's id. + + // Create tenant database + _abpZeroDbMigrator.CreateOrMigrateForTenant(tenant); + + // We are working entities of new tenant, so changing tenant filter + using (CurrentUnitOfWork.SetTenantId(tenant.Id)) + { + // Create static roles for new tenant + CheckErrors(await _roleManager.CreateStaticRoles(tenant.Id)); + + await CurrentUnitOfWork.SaveChangesAsync(); // To get static role ids + + // Grant all permissions to admin role + var adminRole = _roleManager.Roles.Single(r => r.Name == StaticRoleNames.Tenants.Admin); + await _roleManager.GrantAllPermissionsAsync(adminRole); + + // Create admin user for the tenant + var adminUser = User.CreateTenantAdminUser(tenant.Id, input.AdminEmailAddress); + await _userManager.InitializeOptionsAsync(tenant.Id); + CheckErrors(await _userManager.CreateAsync(adminUser, User.DefaultPassword)); + await CurrentUnitOfWork.SaveChangesAsync(); // To get admin user's id + + // Assign admin user to role! + CheckErrors(await _userManager.AddToRoleAsync(adminUser, adminRole.Name)); + await CurrentUnitOfWork.SaveChangesAsync(); + } + + return MapToEntityDto(tenant); + } + + protected override IQueryable CreateFilteredQuery(PagedTenantResultRequestDto input) + { + return Repository.GetAll() + .WhereIf(!input.Keyword.IsNullOrWhiteSpace(), x => x.TenancyName.Contains(input.Keyword) || x.Name.Contains(input.Keyword)) + .WhereIf(input.IsActive.HasValue, x => x.IsActive == input.IsActive); + } + + protected override IQueryable ApplySorting(IQueryable query, PagedTenantResultRequestDto input) + { + return query.OrderBy(input.Sorting); + } + + protected override void MapToEntity(TenantDto updateInput, Tenant entity) + { + // Manually mapped since TenantDto contains non-editable properties too. + entity.Name = updateInput.Name; + entity.TenancyName = updateInput.TenancyName; + entity.IsActive = updateInput.IsActive; + } + + public override async Task DeleteAsync(EntityDto input) + { + CheckDeletePermission(); + + var tenant = await _tenantManager.GetByIdAsync(input.Id); + await _tenantManager.DeleteAsync(tenant); + } + + private void CheckErrors(IdentityResult identityResult) + { + identityResult.CheckErrors(LocalizationManager); + } +} + diff --git a/src/SplashPage.Application/Net/MimeTypes/MimeTypeNames.cs b/src/SplashPage.Application/Net/MimeTypes/MimeTypeNames.cs new file mode 100644 index 00000000..d8a8d050 --- /dev/null +++ b/src/SplashPage.Application/Net/MimeTypes/MimeTypeNames.cs @@ -0,0 +1,310 @@ +using System; + +namespace SplashPage.Net.MimeTypes; + +/* Copied from: + * http://stackoverflow.com/questions/10362140/asp-mvc-are-there-any-constants-for-the-default-content-types */ + +/// +/// Common mime types. +/// +public static class MimeTypeNames +{ + ///Used to denote the encoding necessary for files containing JavaScript source code. The alternative MIME type for this file type is text/javascript. + public const string ApplicationXJavascript = "application/x-javascript"; + + ///24bit Linear PCM audio at 8-48kHz, 1-N channels; Defined in RFC 3190 + public const string AudioL24 = "audio/L24"; + + ///Adobe Flash files for example with the extension .swf + public const string ApplicationXShockwaveFlash = "application/x-shockwave-flash"; + + ///Arbitrary binary data.[5] Generally speaking this type identifies files that are not associated with a specific application. Contrary to past assumptions by software packages such as Apache this is not a type that should be applied to unknown files. In such a case, a server or application should not indicate a content type, as it may be incorrect, but rather, should omit the type in order to allow the recipient to guess the type.[6] + public const string ApplicationOctetStream = "application/octet-stream"; + + ///Atom feeds + public const string ApplicationAtomXml = "application/atom+xml"; + + ///Cascading Style Sheets; Defined in RFC 2318 + public const string TextCss = "text/css"; + + ///commands; subtype resident in Gecko browsers like Firefox 3.5 + public const string TextCmd = "text/cmd"; + + ///Comma-separated values; Defined in RFC 4180 + public const string TextCsv = "text/csv"; + + ///deb (file format), a software package format used by the Debian project + public const string ApplicationXDeb = "application/x-deb"; + + ///Defined in RFC 1847 + public const string MultipartEncrypted = "multipart/encrypted"; + + ///Defined in RFC 1847 + public const string MultipartSigned = "multipart/signed"; + + ///Defined in RFC 2616 + public const string MessageHttp = "message/http"; + + ///Defined in RFC 4735 + public const string ModelExample = "model/example"; + + ///device-independent document in DVI format + public const string ApplicationXDvi = "application/x-dvi"; + + ///DTD files; Defined by RFC 3023 + public const string ApplicationXmlDtd = "application/xml-dtd"; + + ///ECMAScript/JavaScript; Defined in RFC 4329 (equivalent to application/ecmascript but with looser processing rules) It is not accepted in IE 8 or earlier - text/javascript is accepted but it is defined as obsolete in RFC 4329. The "type" attribute of the + + + + + + + + diff --git a/src/SplashPage.Web.Mvc/.gitignore b/src/SplashPage.Web.Mvc/.gitignore new file mode 100644 index 00000000..cfc0637a --- /dev/null +++ b/src/SplashPage.Web.Mvc/.gitignore @@ -0,0 +1,6 @@ +# Ignore libraries generated by libman +wwwroot/libs/ + +# Ignore bundle files +wwwroot/view-resources/Views/**/*.min.* +wwwroot/view-resources/Views/Shared/Components/**/*.min.* \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Controllers/AboutController.cs b/src/SplashPage.Web.Mvc/Controllers/AboutController.cs new file mode 100644 index 00000000..77b7daea --- /dev/null +++ b/src/SplashPage.Web.Mvc/Controllers/AboutController.cs @@ -0,0 +1,14 @@ +using Abp.AspNetCore.Mvc.Authorization; +using SplashPage.Controllers; +using Microsoft.AspNetCore.Mvc; + +namespace SplashPage.Web.Controllers; + +[AbpMvcAuthorize] +public class AboutController : SplashPageControllerBase +{ + public ActionResult Index() + { + return View(); + } +} diff --git a/src/SplashPage.Web.Mvc/Controllers/AccountController.cs b/src/SplashPage.Web.Mvc/Controllers/AccountController.cs new file mode 100644 index 00000000..8ec27857 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Controllers/AccountController.cs @@ -0,0 +1,470 @@ +using Abp; +using Abp.AspNetCore.Mvc.Authorization; +using Abp.Authorization; +using Abp.Authorization.Users; +using Abp.Configuration; +using Abp.Configuration.Startup; +using Abp.Domain.Uow; +using Abp.Extensions; +using Abp.MultiTenancy; +using Abp.Notifications; +using Abp.Threading; +using Abp.Timing; +using Abp.UI; +using Abp.Web.Models; +using Abp.Zero.Configuration; +using SplashPage.Authorization; +using SplashPage.Authorization.Users; +using SplashPage.Controllers; +using SplashPage.Identity; +using SplashPage.MultiTenancy; +using SplashPage.Sessions; +using SplashPage.Web.Models.Account; +using SplashPage.Web.Views.Shared.Components.TenantChange; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; + +namespace SplashPage.Web.Controllers; + +public class AccountController : SplashPageControllerBase +{ + private readonly UserManager _userManager; + private readonly TenantManager _tenantManager; + private readonly IMultiTenancyConfig _multiTenancyConfig; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly AbpLoginResultTypeHelper _abpLoginResultTypeHelper; + private readonly LogInManager _logInManager; + private readonly SignInManager _signInManager; + private readonly UserRegistrationManager _userRegistrationManager; + private readonly ISessionAppService _sessionAppService; + private readonly ITenantCache _tenantCache; + private readonly INotificationPublisher _notificationPublisher; + + public AccountController( + UserManager userManager, + IMultiTenancyConfig multiTenancyConfig, + TenantManager tenantManager, + IUnitOfWorkManager unitOfWorkManager, + AbpLoginResultTypeHelper abpLoginResultTypeHelper, + LogInManager logInManager, + SignInManager signInManager, + UserRegistrationManager userRegistrationManager, + ISessionAppService sessionAppService, + ITenantCache tenantCache, + INotificationPublisher notificationPublisher) + { + _userManager = userManager; + _multiTenancyConfig = multiTenancyConfig; + _tenantManager = tenantManager; + _unitOfWorkManager = unitOfWorkManager; + _abpLoginResultTypeHelper = abpLoginResultTypeHelper; + _logInManager = logInManager; + _signInManager = signInManager; + _userRegistrationManager = userRegistrationManager; + _sessionAppService = sessionAppService; + _tenantCache = tenantCache; + _notificationPublisher = notificationPublisher; + } + + #region Login / Logout + + public ActionResult Login(string userNameOrEmailAddress = "", string returnUrl = "", string successMessage = "") + { + if (string.IsNullOrWhiteSpace(returnUrl)) + { + returnUrl = GetAppHomeUrl(); + } + + return View(new LoginFormViewModel + { + ReturnUrl = returnUrl, + IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled, + IsSelfRegistrationAllowed = IsSelfRegistrationEnabled(), + MultiTenancySide = AbpSession.MultiTenancySide + }); + } + + [HttpPost] + [UnitOfWork] + public virtual async Task Login(LoginViewModel loginModel, string returnUrl = "", string returnUrlHash = "") + { + returnUrl = NormalizeReturnUrl(returnUrl); + if (!string.IsNullOrWhiteSpace(returnUrlHash)) + { + returnUrl = returnUrl + returnUrlHash; + } + + var loginResult = await GetLoginResultAsync(loginModel.UsernameOrEmailAddress, loginModel.Password, GetTenancyNameOrNull()); + + await _signInManager.SignInAsync(loginResult.Identity, loginModel.RememberMe); + await UnitOfWorkManager.Current.SaveChangesAsync(); + + return Json(new AjaxResponse { TargetUrl = returnUrl }); + } + + public async Task Logout() + { + await _signInManager.SignOutAsync(); + return RedirectToAction("Login"); + } + + private async Task> GetLoginResultAsync(string usernameOrEmailAddress, string password, string tenancyName) + { + var loginResult = await _logInManager.LoginAsync(usernameOrEmailAddress, password, tenancyName); + + switch (loginResult.Result) + { + case AbpLoginResultType.Success: + return loginResult; + default: + throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(loginResult.Result, usernameOrEmailAddress, tenancyName); + } + } + + #endregion + + #region Register + + public ActionResult Register() + { + return RegisterView(new RegisterViewModel()); + } + + private ActionResult RegisterView(RegisterViewModel model) + { + ViewBag.IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled; + + return View("Register", model); + } + + private bool IsSelfRegistrationEnabled() + { + if (!AbpSession.TenantId.HasValue) + { + return false; // No registration enabled for host users! + } + + return true; + } + + [HttpPost] + [UnitOfWork] + public async Task Register(RegisterViewModel model) + { + try + { + ExternalLoginInfo externalLoginInfo = null; + if (model.IsExternalLogin) + { + externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync(); + if (externalLoginInfo == null) + { + throw new Exception("Can not external login!"); + } + + model.UserName = model.EmailAddress; + model.Password = Authorization.Users.User.CreateRandomPassword(); + } + else + { + if (model.UserName.IsNullOrEmpty() || model.Password.IsNullOrEmpty()) + { + throw new UserFriendlyException(L("FormIsNotValidMessage")); + } + } + + var user = await _userRegistrationManager.RegisterAsync( + model.Name, + model.Surname, + model.EmailAddress, + model.UserName, + model.Password, + true // Assumed email address is always confirmed. Change this if you want to implement email confirmation. + ); + + // Getting tenant-specific settings + var isEmailConfirmationRequiredForLogin = await SettingManager.GetSettingValueAsync(AbpZeroSettingNames.UserManagement.IsEmailConfirmationRequiredForLogin); + + if (model.IsExternalLogin) + { + Debug.Assert(externalLoginInfo != null); + + if (string.Equals(externalLoginInfo.Principal.FindFirstValue(ClaimTypes.Email), model.EmailAddress, StringComparison.OrdinalIgnoreCase)) + { + user.IsEmailConfirmed = true; + } + + user.Logins = new List + { + new UserLogin + { + LoginProvider = externalLoginInfo.LoginProvider, + ProviderKey = externalLoginInfo.ProviderKey, + TenantId = user.TenantId + } + }; + } + + await _unitOfWorkManager.Current.SaveChangesAsync(); + + Debug.Assert(user.TenantId != null); + + var tenant = await _tenantManager.GetByIdAsync(user.TenantId.Value); + + // Directly login if possible + if (user.IsActive && (user.IsEmailConfirmed || !isEmailConfirmationRequiredForLogin)) + { + AbpLoginResult loginResult; + if (externalLoginInfo != null) + { + loginResult = await _logInManager.LoginAsync(externalLoginInfo, tenant.TenancyName); + } + else + { + loginResult = await GetLoginResultAsync(user.UserName, model.Password, tenant.TenancyName); + } + + if (loginResult.Result == AbpLoginResultType.Success) + { + await _signInManager.SignInAsync(loginResult.Identity, false); + return Redirect(GetAppHomeUrl()); + } + + Logger.Warn("New registered user could not be login. This should not be normally. login result: " + loginResult.Result); + } + + return View("RegisterResult", new RegisterResultViewModel + { + TenancyName = tenant.TenancyName, + NameAndSurname = user.Name + " " + user.Surname, + UserName = user.UserName, + EmailAddress = user.EmailAddress, + IsEmailConfirmed = user.IsEmailConfirmed, + IsActive = user.IsActive, + IsEmailConfirmationRequiredForLogin = isEmailConfirmationRequiredForLogin + }); + } + catch (UserFriendlyException ex) + { + ViewBag.ErrorMessage = ex.Message; + + return View("Register", model); + } + } + + #endregion + + #region External Login + + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult ExternalLogin(string provider, string returnUrl) + { + var redirectUrl = Url.Action( + "ExternalLoginCallback", + "Account", + new + { + ReturnUrl = returnUrl + }); + + return Challenge( + // TODO: ...? + // new Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties + // { + // Items = { { "LoginProvider", provider } }, + // RedirectUri = redirectUrl + // }, + provider + ); + } + + [UnitOfWork] + public virtual async Task ExternalLoginCallback(string returnUrl, string remoteError = null) + { + returnUrl = NormalizeReturnUrl(returnUrl); + + if (remoteError != null) + { + Logger.Error("Remote Error in ExternalLoginCallback: " + remoteError); + throw new UserFriendlyException(L("CouldNotCompleteLoginOperation")); + } + + var externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync(); + if (externalLoginInfo == null) + { + Logger.Warn("Could not get information from external login."); + return RedirectToAction(nameof(Login)); + } + + await _signInManager.SignOutAsync(); + + var tenancyName = GetTenancyNameOrNull(); + + var loginResult = await _logInManager.LoginAsync(externalLoginInfo, tenancyName); + + switch (loginResult.Result) + { + case AbpLoginResultType.Success: + await _signInManager.SignInAsync(loginResult.Identity, false); + return Redirect(returnUrl); + case AbpLoginResultType.UnknownExternalLogin: + return await RegisterForExternalLogin(externalLoginInfo); + default: + throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt( + loginResult.Result, + externalLoginInfo.Principal.FindFirstValue(ClaimTypes.Email) ?? externalLoginInfo.ProviderKey, + tenancyName + ); + } + } + + private async Task RegisterForExternalLogin(ExternalLoginInfo externalLoginInfo) + { + var email = externalLoginInfo.Principal.FindFirstValue(ClaimTypes.Email); + var nameinfo = ExternalLoginInfoHelper.GetNameAndSurnameFromClaims(externalLoginInfo.Principal.Claims.ToList()); + + var viewModel = new RegisterViewModel + { + EmailAddress = email, + Name = nameinfo.name, + Surname = nameinfo.surname, + IsExternalLogin = true, + ExternalLoginAuthSchema = externalLoginInfo.LoginProvider + }; + + if (nameinfo.name != null && + nameinfo.surname != null && + email != null) + { + return await Register(viewModel); + } + + return RegisterView(viewModel); + } + + [UnitOfWork] + protected virtual async Task> FindPossibleTenantsOfUserAsync(UserLoginInfo login) + { + List allUsers; + using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) + { + allUsers = await _userManager.FindAllAsync(login); + } + + return allUsers + .Where(u => u.TenantId != null) + .Select(u => AsyncHelper.RunSync(() => _tenantManager.FindByIdAsync(u.TenantId.Value))) + .ToList(); + } + + #endregion + + #region 403 Forbidden + + [Route("/Account/Forbidden")] + public ActionResult Error403() + { + return View(); + } + + #endregion + + #region Helpers + + public ActionResult RedirectToAppHome() + { + return RedirectToAction("Index", "Home"); + } + + public string GetAppHomeUrl() + { + return Url.Action("Index", "About"); + } + + #endregion + + #region Change Tenant + + public async Task TenantChangeModal() + { + var loginInfo = await _sessionAppService.GetCurrentLoginInformations(); + return View("/Views/Shared/Components/TenantChange/_ChangeModal.cshtml", new ChangeModalViewModel + { + TenancyName = loginInfo.Tenant?.TenancyName + }); + } + + #endregion + + #region Common + + private string GetTenancyNameOrNull() + { + if (!AbpSession.TenantId.HasValue) + { + return null; + } + + return _tenantCache.GetOrNull(AbpSession.TenantId.Value)?.TenancyName; + } + + private string NormalizeReturnUrl(string returnUrl, Func defaultValueBuilder = null) + { + if (defaultValueBuilder == null) + { + defaultValueBuilder = GetAppHomeUrl; + } + + if (returnUrl.IsNullOrEmpty()) + { + return defaultValueBuilder(); + } + + if (Url.IsLocalUrl(returnUrl)) + { + return returnUrl; + } + + return defaultValueBuilder(); + } + + #endregion + + #region Etc + + /// + /// This is a demo code to demonstrate sending notification to default tenant admin and host admin uers. + /// Don't use this code in production !!! + /// + /// + /// + [AbpMvcAuthorize] + public async Task TestNotification(string message = "") + { + if (message.IsNullOrEmpty()) + { + message = "This is a test notification, created at " + Clock.Now; + } + + var defaultTenantAdmin = new UserIdentifier(1, 2); + var hostAdmin = new UserIdentifier(null, 1); + + await _notificationPublisher.PublishAsync( + "App.SimpleMessage", + new MessageNotificationData(message), + severity: NotificationSeverity.Info, + userIds: new[] { defaultTenantAdmin, hostAdmin } + ); + + return Content("Sent notification: " + message); + } + + #endregion +} diff --git a/src/SplashPage.Web.Mvc/Controllers/ErrorController.cs b/src/SplashPage.Web.Mvc/Controllers/ErrorController.cs new file mode 100644 index 00000000..759dab1f --- /dev/null +++ b/src/SplashPage.Web.Mvc/Controllers/ErrorController.cs @@ -0,0 +1,35 @@ +using Abp.AspNetCore.Mvc.Controllers; +using Abp.Web.Models; +using Abp.Web.Mvc.Models; +using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using System; + +namespace SplashPage.Web.Controllers; + +public class ErrorController : AbpController +{ + private readonly IErrorInfoBuilder _errorInfoBuilder; + + public ErrorController(IErrorInfoBuilder errorInfoBuilder) + { + _errorInfoBuilder = errorInfoBuilder; + } + + public ActionResult Index() + { + var exHandlerFeature = HttpContext.Features.Get(); + + var exception = exHandlerFeature != null + ? exHandlerFeature.Error + : new Exception("Unhandled exception!"); + + return View( + "Error", + new ErrorViewModel( + _errorInfoBuilder.BuildForException(exception), + exception + ) + ); + } +} diff --git a/src/SplashPage.Web.Mvc/Controllers/HomeController.cs b/src/SplashPage.Web.Mvc/Controllers/HomeController.cs new file mode 100644 index 00000000..dd085de1 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Controllers/HomeController.cs @@ -0,0 +1,14 @@ +using Abp.AspNetCore.Mvc.Authorization; +using SplashPage.Controllers; +using Microsoft.AspNetCore.Mvc; + +namespace SplashPage.Web.Controllers; + +[AbpMvcAuthorize] +public class HomeController : SplashPageControllerBase +{ + public ActionResult Index() + { + return View(); + } +} diff --git a/src/SplashPage.Web.Mvc/Controllers/RolesController.cs b/src/SplashPage.Web.Mvc/Controllers/RolesController.cs new file mode 100644 index 00000000..6d53ec36 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Controllers/RolesController.cs @@ -0,0 +1,40 @@ +using Abp.Application.Services.Dto; +using Abp.AspNetCore.Mvc.Authorization; +using SplashPage.Authorization; +using SplashPage.Controllers; +using SplashPage.Roles; +using SplashPage.Web.Models.Roles; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace SplashPage.Web.Controllers; + +[AbpMvcAuthorize(PermissionNames.Pages_Roles)] +public class RolesController : SplashPageControllerBase +{ + private readonly IRoleAppService _roleAppService; + + public RolesController(IRoleAppService roleAppService) + { + _roleAppService = roleAppService; + } + + public async Task Index() + { + var permissions = (await _roleAppService.GetAllPermissions()).Items; + var model = new RoleListViewModel + { + Permissions = permissions + }; + + return View(model); + } + + public async Task EditModal(int roleId) + { + var output = await _roleAppService.GetRoleForEdit(new EntityDto(roleId)); + var model = ObjectMapper.Map(output); + + return PartialView("_EditModal", model); + } +} diff --git a/src/SplashPage.Web.Mvc/Controllers/TenantsController.cs b/src/SplashPage.Web.Mvc/Controllers/TenantsController.cs new file mode 100644 index 00000000..e143055e --- /dev/null +++ b/src/SplashPage.Web.Mvc/Controllers/TenantsController.cs @@ -0,0 +1,28 @@ +using Abp.Application.Services.Dto; +using Abp.AspNetCore.Mvc.Authorization; +using SplashPage.Authorization; +using SplashPage.Controllers; +using SplashPage.MultiTenancy; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace SplashPage.Web.Controllers; + +[AbpMvcAuthorize(PermissionNames.Pages_Tenants)] +public class TenantsController : SplashPageControllerBase +{ + private readonly ITenantAppService _tenantAppService; + + public TenantsController(ITenantAppService tenantAppService) + { + _tenantAppService = tenantAppService; + } + + public ActionResult Index() => View(); + + public async Task EditModal(int tenantId) + { + var tenantDto = await _tenantAppService.GetAsync(new EntityDto(tenantId)); + return PartialView("_EditModal", tenantDto); + } +} diff --git a/src/SplashPage.Web.Mvc/Controllers/UsersController.cs b/src/SplashPage.Web.Mvc/Controllers/UsersController.cs new file mode 100644 index 00000000..ee75bfbd --- /dev/null +++ b/src/SplashPage.Web.Mvc/Controllers/UsersController.cs @@ -0,0 +1,48 @@ +using Abp.Application.Services.Dto; +using Abp.AspNetCore.Mvc.Authorization; +using SplashPage.Authorization; +using SplashPage.Controllers; +using SplashPage.Users; +using SplashPage.Web.Models.Users; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace SplashPage.Web.Controllers; + +[AbpMvcAuthorize(PermissionNames.Pages_Users)] +public class UsersController : SplashPageControllerBase +{ + private readonly IUserAppService _userAppService; + + public UsersController(IUserAppService userAppService) + { + _userAppService = userAppService; + } + + public async Task Index() + { + var roles = (await _userAppService.GetRoles()).Items; + var model = new UserListViewModel + { + Roles = roles + }; + return View(model); + } + + public async Task EditModal(long userId) + { + var user = await _userAppService.GetAsync(new EntityDto(userId)); + var roles = (await _userAppService.GetRoles()).Items; + var model = new EditUserModalViewModel + { + User = user, + Roles = roles + }; + return PartialView("_EditModal", model); + } + + public ActionResult ChangePassword() + { + return View(); + } +} diff --git a/src/SplashPage.Web.Mvc/Dockerfile b/src/SplashPage.Web.Mvc/Dockerfile new file mode 100644 index 00000000..5e3c1996 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Dockerfile @@ -0,0 +1,29 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build + +RUN dotnet tool install -g Microsoft.Web.LibraryManager.Cli +RUN ln -s ~/.dotnet/tools/libman /usr/local/bin/libman + +WORKDIR /src +COPY ["src/SplashPage.Web.Mvc/SplashPage.Web.Mvc.csproj", "src/SplashPage.Web.Mvc/"] +COPY ["src/SplashPage.Web.Core/SplashPage.Web.Core.csproj", "src/SplashPage.Web.Core/"] +COPY ["src/SplashPage.Application/SplashPage.Application.csproj", "src/SplashPage.Application/"] +COPY ["src/SplashPage.Core/SplashPage.Core.csproj", "src/SplashPage.Core/"] +COPY ["src/SplashPage.EntityFrameworkCore/SplashPage.EntityFrameworkCore.csproj", "src/SplashPage.EntityFrameworkCore/"] +WORKDIR "/src/src/SplashPage.Web.Mvc" +RUN dotnet restore + +WORKDIR /src +COPY ["src/SplashPage.Web.Mvc", "src/SplashPage.Web.Mvc"] +COPY ["src/SplashPage.Web.Core", "src/SplashPage.Web.Core"] +COPY ["src/SplashPage.Application", "src/SplashPage.Application"] +COPY ["src/SplashPage.Core", "src/SplashPage.Core"] +COPY ["src/SplashPage.EntityFrameworkCore", "src/SplashPage.EntityFrameworkCore"] +WORKDIR "/src/src/SplashPage.Web.Mvc" +RUN libman restore +RUN dotnet publish -c Release -o /publish --no-restore + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +EXPOSE 80 +WORKDIR /app +COPY --from=build /publish . +ENTRYPOINT ["dotnet", "SplashPage.Web.Mvc.dll"] diff --git a/src/SplashPage.Web.Mvc/Models/Account/LoginFormViewModel.cs b/src/SplashPage.Web.Mvc/Models/Account/LoginFormViewModel.cs new file mode 100644 index 00000000..72f91062 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Account/LoginFormViewModel.cs @@ -0,0 +1,14 @@ +using Abp.MultiTenancy; + +namespace SplashPage.Web.Models.Account; + +public class LoginFormViewModel +{ + public string ReturnUrl { get; set; } + + public bool IsMultiTenancyEnabled { get; set; } + + public bool IsSelfRegistrationAllowed { get; set; } + + public MultiTenancySides MultiTenancySide { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Models/Account/LoginViewModel.cs b/src/SplashPage.Web.Mvc/Models/Account/LoginViewModel.cs new file mode 100644 index 00000000..622b0bbf --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Account/LoginViewModel.cs @@ -0,0 +1,16 @@ +using Abp.Auditing; +using System.ComponentModel.DataAnnotations; + +namespace SplashPage.Web.Models.Account; + +public class LoginViewModel +{ + [Required] + public string UsernameOrEmailAddress { get; set; } + + [Required] + [DisableAuditing] + public string Password { get; set; } + + public bool RememberMe { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Models/Account/RegisterResultViewModel.cs b/src/SplashPage.Web.Mvc/Models/Account/RegisterResultViewModel.cs new file mode 100644 index 00000000..5208ed02 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Account/RegisterResultViewModel.cs @@ -0,0 +1,18 @@ +namespace SplashPage.Web.Models.Account; + +public class RegisterResultViewModel +{ + public string TenancyName { get; set; } + + public string UserName { get; set; } + + public string EmailAddress { get; set; } + + public string NameAndSurname { get; set; } + + public bool IsActive { get; set; } + + public bool IsEmailConfirmationRequiredForLogin { get; set; } + + public bool IsEmailConfirmed { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Models/Account/RegisterViewModel.cs b/src/SplashPage.Web.Mvc/Models/Account/RegisterViewModel.cs new file mode 100644 index 00000000..416d640e --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Account/RegisterViewModel.cs @@ -0,0 +1,46 @@ +using Abp.Auditing; +using Abp.Authorization.Users; +using Abp.Extensions; +using SplashPage.Validation; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace SplashPage.Web.Models.Account; + +public class RegisterViewModel : IValidatableObject +{ + [Required] + [StringLength(AbpUserBase.MaxNameLength)] + public string Name { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxSurnameLength)] + public string Surname { get; set; } + + [StringLength(AbpUserBase.MaxUserNameLength)] + public string UserName { get; set; } + + [Required] + [EmailAddress] + [StringLength(AbpUserBase.MaxEmailAddressLength)] + public string EmailAddress { get; set; } + + [StringLength(AbpUserBase.MaxPlainPasswordLength)] + [DisableAuditing] + public string Password { get; set; } + + public bool IsExternalLogin { get; set; } + + public string ExternalLoginAuthSchema { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if (!UserName.IsNullOrEmpty()) + { + if (!UserName.Equals(EmailAddress) && ValidationHelper.IsEmail(UserName)) + { + yield return new ValidationResult("Username cannot be an email address unless it's the same as your email address!"); + } + } + } +} diff --git a/src/SplashPage.Web.Mvc/Models/Common/IPermissionsEditViewModel.cs b/src/SplashPage.Web.Mvc/Models/Common/IPermissionsEditViewModel.cs new file mode 100644 index 00000000..694096ab --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Common/IPermissionsEditViewModel.cs @@ -0,0 +1,9 @@ +using SplashPage.Roles.Dto; +using System.Collections.Generic; + +namespace SplashPage.Web.Models.Common; + +public interface IPermissionsEditViewModel +{ + List Permissions { get; set; } +} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Models/Common/Modals/ModalHeaderViewModel.cs b/src/SplashPage.Web.Mvc/Models/Common/Modals/ModalHeaderViewModel.cs new file mode 100644 index 00000000..608cc9f1 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Common/Modals/ModalHeaderViewModel.cs @@ -0,0 +1,11 @@ +namespace SplashPage.Web.Models.Common.Modals; + +public class ModalHeaderViewModel +{ + public string Title { get; set; } + + public ModalHeaderViewModel(string title) + { + Title = title; + } +} diff --git a/src/SplashPage.Web.Mvc/Models/Roles/EditRoleModalViewModel.cs b/src/SplashPage.Web.Mvc/Models/Roles/EditRoleModalViewModel.cs new file mode 100644 index 00000000..5d8b975e --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Roles/EditRoleModalViewModel.cs @@ -0,0 +1,14 @@ +using Abp.AutoMapper; +using SplashPage.Roles.Dto; +using SplashPage.Web.Models.Common; + +namespace SplashPage.Web.Models.Roles; + +[AutoMapFrom(typeof(GetRoleForEditOutput))] +public class EditRoleModalViewModel : GetRoleForEditOutput, IPermissionsEditViewModel +{ + public bool HasPermission(FlatPermissionDto permission) + { + return GrantedPermissionNames.Contains(permission.Name); + } +} diff --git a/src/SplashPage.Web.Mvc/Models/Roles/RoleListViewModel.cs b/src/SplashPage.Web.Mvc/Models/Roles/RoleListViewModel.cs new file mode 100644 index 00000000..2e629fd8 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Roles/RoleListViewModel.cs @@ -0,0 +1,9 @@ +using SplashPage.Roles.Dto; +using System.Collections.Generic; + +namespace SplashPage.Web.Models.Roles; + +public class RoleListViewModel +{ + public IReadOnlyList Permissions { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Models/Users/EditUserModalViewModel.cs b/src/SplashPage.Web.Mvc/Models/Users/EditUserModalViewModel.cs new file mode 100644 index 00000000..61b4664c --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Users/EditUserModalViewModel.cs @@ -0,0 +1,18 @@ +using SplashPage.Roles.Dto; +using SplashPage.Users.Dto; +using System.Collections.Generic; +using System.Linq; + +namespace SplashPage.Web.Models.Users; + +public class EditUserModalViewModel +{ + public UserDto User { get; set; } + + public IReadOnlyList Roles { get; set; } + + public bool UserIsInRole(RoleDto role) + { + return User.RoleNames != null && User.RoleNames.Any(r => r == role.NormalizedName); + } +} diff --git a/src/SplashPage.Web.Mvc/Models/Users/UserListViewModel.cs b/src/SplashPage.Web.Mvc/Models/Users/UserListViewModel.cs new file mode 100644 index 00000000..ab1652aa --- /dev/null +++ b/src/SplashPage.Web.Mvc/Models/Users/UserListViewModel.cs @@ -0,0 +1,9 @@ +using SplashPage.Roles.Dto; +using System.Collections.Generic; + +namespace SplashPage.Web.Models.Users; + +public class UserListViewModel +{ + public IReadOnlyList Roles { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Properties/launchSettings.json b/src/SplashPage.Web.Mvc/Properties/launchSettings.json new file mode 100644 index 00000000..1f5dea74 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "https://localhost:44312/", + "sslPort": 44312 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "SplashPage.Web": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:44312", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/SplashPage.Web.Mvc/Resources/IWebResourceManager.cs b/src/SplashPage.Web.Mvc/Resources/IWebResourceManager.cs new file mode 100644 index 00000000..36080a0c --- /dev/null +++ b/src/SplashPage.Web.Mvc/Resources/IWebResourceManager.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Mvc.Razor; +using System.Collections.Generic; + +namespace SplashPage.Web.Resources; + +public interface IWebResourceManager +{ + void AddScript(string url, bool addMinifiedOnProd = true); + + IReadOnlyList GetScripts(); + + HelperResult RenderScripts(); +} diff --git a/src/SplashPage.Web.Mvc/Resources/WebResourceManager.cs b/src/SplashPage.Web.Mvc/Resources/WebResourceManager.cs new file mode 100644 index 00000000..868460f3 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Resources/WebResourceManager.cs @@ -0,0 +1,58 @@ +using Abp.Collections.Extensions; +using Abp.Extensions; +using Abp.Timing; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Razor; +using Microsoft.Extensions.Hosting; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace SplashPage.Web.Resources; + +public class WebResourceManager : IWebResourceManager +{ + private readonly IWebHostEnvironment _environment; + private readonly List _scriptUrls; + + public WebResourceManager(IWebHostEnvironment environment) + { + _environment = environment; + _scriptUrls = new List(); + } + + public void AddScript(string url, bool addMinifiedOnProd = true) + { + _scriptUrls.AddIfNotContains(NormalizeUrl(url, "js")); + } + + public IReadOnlyList GetScripts() + { + return _scriptUrls.ToImmutableList(); + } + + public HelperResult RenderScripts() + { + return new HelperResult(async writer => + { + foreach (var scriptUrl in _scriptUrls) + { + await writer.WriteAsync($""); + } + }); + } + + private string NormalizeUrl(string url, string ext) + { + if (_environment.IsDevelopment()) + { + return url; + } + + if (url.EndsWith(".min." + ext)) + { + return url; + } + + return url.Left(url.Length - ext.Length) + "min." + ext; + } +} diff --git a/src/SplashPage.Web.Mvc/SplashPage.Web.Mvc.csproj b/src/SplashPage.Web.Mvc/SplashPage.Web.Mvc.csproj new file mode 100644 index 00000000..34ce36cd --- /dev/null +++ b/src/SplashPage.Web.Mvc/SplashPage.Web.Mvc.csproj @@ -0,0 +1,48 @@ + + + SplashPage.Web.Mvc + Exe + SplashPage.Web.Mvc + AbpCompanyName-SplashPage-56C2EF2F-ABD6-4EFC-AAF2-2E81C34E8FB1 + SplashPage.Web + net9.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + true + true + true + true + false + true + + + + Always + + + PreserveNewest + PreserveNewest + + + PreserveNewest + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Startup/AuthConfigurer.cs b/src/SplashPage.Web.Mvc/Startup/AuthConfigurer.cs new file mode 100644 index 00000000..339c7718 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Startup/AuthConfigurer.cs @@ -0,0 +1,49 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.IdentityModel.Tokens; +using System; +using System.Text; + +namespace SplashPage.Web.Startup; + +public static class AuthConfigurer +{ + public static void Configure(IServiceCollection services, IConfiguration configuration) + { + services.ConfigureApplicationCookie(options => + { + options.AccessDeniedPath = "/Account/Forbidden"; + }); + + if (bool.Parse(configuration["Authentication:JwtBearer:IsEnabled"])) + { + services.AddAuthentication() + .AddJwtBearer(options => + { + options.Audience = configuration["Authentication:JwtBearer:Audience"]; + + options.TokenValidationParameters = new TokenValidationParameters + { + // The signing key must match! + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(configuration["Authentication:JwtBearer:SecurityKey"])), + + // Validate the JWT Issuer (iss) claim + ValidateIssuer = true, + ValidIssuer = configuration["Authentication:JwtBearer:Issuer"], + + // Validate the JWT Audience (aud) claim + ValidateAudience = true, + ValidAudience = configuration["Authentication:JwtBearer:Audience"], + + // Validate the token expiry + ValidateLifetime = true, + + // If you want to allow a certain amount of clock drift, set that here + ClockSkew = TimeSpan.Zero + }; + }); + + } + } +} diff --git a/src/SplashPage.Web.Mvc/Startup/PageNames.cs b/src/SplashPage.Web.Mvc/Startup/PageNames.cs new file mode 100644 index 00000000..019d3551 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Startup/PageNames.cs @@ -0,0 +1,10 @@ +namespace SplashPage.Web.Startup; + +public class PageNames +{ + public const string Home = "Home"; + public const string About = "About"; + public const string Tenants = "Tenants"; + public const string Users = "Users"; + public const string Roles = "Roles"; +} diff --git a/src/SplashPage.Web.Mvc/Startup/Program.cs b/src/SplashPage.Web.Mvc/Startup/Program.cs new file mode 100644 index 00000000..144b11dd --- /dev/null +++ b/src/SplashPage.Web.Mvc/Startup/Program.cs @@ -0,0 +1,22 @@ +using Abp.AspNetCore.Dependency; +using Abp.Dependency; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace SplashPage.Web.Startup; + +public class Program +{ + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + internal static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }) + .UseCastleWindsor(IocManager.Instance.IocContainer); +} diff --git a/src/SplashPage.Web.Mvc/Startup/SplashPageNavigationProvider.cs b/src/SplashPage.Web.Mvc/Startup/SplashPageNavigationProvider.cs new file mode 100644 index 00000000..1ebf3a64 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Startup/SplashPageNavigationProvider.cs @@ -0,0 +1,145 @@ +using Abp.Application.Navigation; +using Abp.Authorization; +using Abp.Localization; +using SplashPage.Authorization; + +namespace SplashPage.Web.Startup; + +/// +/// This class defines menus for the application. +/// +public class SplashPageNavigationProvider : NavigationProvider +{ + public override void SetNavigation(INavigationProviderContext context) + { + context.Manager.MainMenu + .AddItem( + new MenuItemDefinition( + PageNames.About, + L("About"), + url: "About", + icon: "fas fa-info-circle" + ) + ) + .AddItem( + new MenuItemDefinition( + PageNames.Home, + L("HomePage"), + url: "", + icon: "fas fa-home", + requiresAuthentication: true + ) + ).AddItem( + new MenuItemDefinition( + PageNames.Tenants, + L("Tenants"), + url: "Tenants", + icon: "fas fa-building", + permissionDependency: new SimplePermissionDependency(PermissionNames.Pages_Tenants) + ) + ).AddItem( + new MenuItemDefinition( + PageNames.Users, + L("Users"), + url: "Users", + icon: "fas fa-users", + permissionDependency: new SimplePermissionDependency(PermissionNames.Pages_Users) + ) + ).AddItem( + new MenuItemDefinition( + PageNames.Roles, + L("Roles"), + url: "Roles", + icon: "fas fa-theater-masks", + permissionDependency: new SimplePermissionDependency(PermissionNames.Pages_Roles) + ) + ) + .AddItem( // Menu items below is just for demonstration! + new MenuItemDefinition( + "MultiLevelMenu", + L("MultiLevelMenu"), + icon: "fas fa-circle" + ).AddItem( + new MenuItemDefinition( + "AspNetBoilerplate", + new FixedLocalizableString("ASP.NET Boilerplate"), + icon: "far fa-circle" + ).AddItem( + new MenuItemDefinition( + "AspNetBoilerplateHome", + new FixedLocalizableString("Home"), + url: "https://aspnetboilerplate.com?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ).AddItem( + new MenuItemDefinition( + "AspNetBoilerplateTemplates", + new FixedLocalizableString("Templates"), + url: "https://aspnetboilerplate.com/Templates?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ).AddItem( + new MenuItemDefinition( + "AspNetBoilerplateSamples", + new FixedLocalizableString("Samples"), + url: "https://aspnetboilerplate.com/Samples?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ).AddItem( + new MenuItemDefinition( + "AspNetBoilerplateDocuments", + new FixedLocalizableString("Documents"), + url: "https://aspnetboilerplate.com/Pages/Documents?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ) + ).AddItem( + new MenuItemDefinition( + "AspNetZero", + new FixedLocalizableString("ASP.NET Zero"), + icon: "far fa-circle" + ).AddItem( + new MenuItemDefinition( + "AspNetZeroHome", + new FixedLocalizableString("Home"), + url: "https://aspnetzero.com?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ).AddItem( + new MenuItemDefinition( + "AspNetZeroFeatures", + new FixedLocalizableString("Features"), + url: "https://aspnetzero.com/Features?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ).AddItem( + new MenuItemDefinition( + "AspNetZeroPricing", + new FixedLocalizableString("Pricing"), + url: "https://aspnetzero.com/Pricing?ref=abptmpl#pricing", + icon: "far fa-dot-circle" + ) + ).AddItem( + new MenuItemDefinition( + "AspNetZeroFaq", + new FixedLocalizableString("Faq"), + url: "https://aspnetzero.com/Faq?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ).AddItem( + new MenuItemDefinition( + "AspNetZeroDocuments", + new FixedLocalizableString("Documents"), + url: "https://aspnetzero.com/Documents?ref=abptmpl", + icon: "far fa-dot-circle" + ) + ) + ) + ); + } + + private static ILocalizableString L(string name) + { + return new LocalizableString(name, SplashPageConsts.LocalizationSourceName); + } +} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Startup/SplashPageWebMvcModule.cs b/src/SplashPage.Web.Mvc/Startup/SplashPageWebMvcModule.cs new file mode 100644 index 00000000..e493d72e --- /dev/null +++ b/src/SplashPage.Web.Mvc/Startup/SplashPageWebMvcModule.cs @@ -0,0 +1,30 @@ +using Abp.Modules; +using Abp.Reflection.Extensions; +using SplashPage.Configuration; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; + +namespace SplashPage.Web.Startup; + +[DependsOn(typeof(SplashPageWebCoreModule))] +public class SplashPageWebMvcModule : AbpModule +{ + private readonly IWebHostEnvironment _env; + private readonly IConfigurationRoot _appConfiguration; + + public SplashPageWebMvcModule(IWebHostEnvironment env) + { + _env = env; + _appConfiguration = env.GetAppConfiguration(); + } + + public override void PreInitialize() + { + Configuration.Navigation.Providers.Add(); + } + + public override void Initialize() + { + IocManager.RegisterAssemblyByConvention(typeof(SplashPageWebMvcModule).GetAssembly()); + } +} diff --git a/src/SplashPage.Web.Mvc/Startup/Startup.cs b/src/SplashPage.Web.Mvc/Startup/Startup.cs new file mode 100644 index 00000000..05ff9d0d --- /dev/null +++ b/src/SplashPage.Web.Mvc/Startup/Startup.cs @@ -0,0 +1,100 @@ +using Abp.AspNetCore; +using Abp.AspNetCore.Mvc.Antiforgery; +using Abp.AspNetCore.SignalR.Hubs; +using Abp.Castle.Logging.Log4Net; +using SplashPage.Authentication.JwtBearer; +using SplashPage.Configuration; +using SplashPage.Identity; +using SplashPage.Web.Resources; +using Castle.Facilities.Logging; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; +using System.Text.Unicode; + +namespace SplashPage.Web.Startup; + +public class Startup +{ + private readonly IWebHostEnvironment _hostingEnvironment; + private readonly IConfigurationRoot _appConfiguration; + + public Startup(IWebHostEnvironment env) + { + _hostingEnvironment = env; + _appConfiguration = env.GetAppConfiguration(); + } + + public void ConfigureServices(IServiceCollection services) + { + // MVC + services.AddControllersWithViews( + options => + { + options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()); + options.Filters.Add(new AbpAutoValidateAntiforgeryTokenAttribute()); + } + ); + + IdentityRegistrar.Register(services); + AuthConfigurer.Configure(services, _appConfiguration); + + services.Configure(options => + { + options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All); + }); + + services.AddScoped(); + + services.AddSignalR(); + + // Configure Abp and Dependency Injection + services.AddAbpWithoutCreatingServiceProvider( + // Configure Log4Net logging + options => options.IocManager.IocContainer.AddFacility( + f => f.UseAbpLog4Net().WithConfig( + _hostingEnvironment.IsDevelopment() + ? "log4net.config" + : "log4net.Production.config" + ) + ) + ); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) + { + app.UseAbp(); // Initializes ABP framework. + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + } + + app.UseStaticFiles(); + + app.UseRouting(); + + app.UseAuthentication(); + + app.UseJwtTokenMiddleware(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapHub("/signalr"); + endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); + endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}"); + }); + } +} diff --git a/src/SplashPage.Web.Mvc/Views/About/Index.cshtml b/src/SplashPage.Web.Mvc/Views/About/Index.cshtml new file mode 100644 index 00000000..d9e967d9 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/About/Index.cshtml @@ -0,0 +1,97 @@ +@using SplashPage.Web.Startup +@{ + ViewBag.CurrentPageName = PageNames.About; + ViewBag.Title = L("About"); +} +
+
+
+
+

@L("About")

+
+
+
+
+
+
+
+
+
+
+

+ This is a simple startup template based on ASP.NET Boilerplate framework and Module Zero. + If you need an enterprise startup project, check ASP.NET ZERO. +

+ +

What is ASP.NET Boilerplate?

+ +

+ ASP.NET Boilerplate is an application framework built on latest ASP.NET Core framework. + It makes easy to use authorization, dependency injection, validation, exception handling, localization, logging, caching, background jobs and so on. + It's built on already familiar tools like Entity Framework, AutoMapper, Castle Windsor... +

+ +

+ ASP.NET Boilerplate implements NLayer architecture (Domain, Application, Infrastructure and Presentation Layers) + and Domain Driven Design (Entities, Repositories, Domain/Application Services, DTO's...). + Also implements and provides a good infrastructure to implement common software development best practices. +

+ +

What is Module Zero?

+ +

+ ASP.NET Boilerplate framework is designed to be independent of any database + schema and to be as generic as possible. Therefore, It leaves some concepts + abstract and optional (like audit logging, permission and setting stores) + which requires some data store. +

+

+ Module Zero implements all fundamental concepts of ASP.NET + Boilerplate framework such as tenant management (multi-tenancy), + + role management + , user management, + authorization ( + permission management + ), + setting management, + language management + , audit logging + and so on. +

+

+ Module-Zero defines entities and implements domain logic + (domain layer) and leaves application and presentation layers to you. +

+ +

Based on Microsoft ASP.NET Core Identity

+ +

+ Module Zero is based on Microsoft's + ASP.NET Core Identity library. + It extends user and role managers and implements user and role stores using generic repositories. +

+ +

Documentation

+ + + +

Source code

+ +

+ This template is developed open source on Github. You can contribute to the template. + https://github.com/aspnetboilerplate/module-zero-core-template +

+
+
+
+
+
+
diff --git a/src/SplashPage.Web.Mvc/Views/Account/Error403.cshtml b/src/SplashPage.Web.Mvc/Views/Account/Error403.cshtml new file mode 100644 index 00000000..87f2aa42 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/Error403.cshtml @@ -0,0 +1,26 @@ +@{ + ViewBag.Title = L("403PageHeader"); + ViewBag.HideTenantChange = true; +} + +@section styles +{ + +} + +
+
+
+ 403 +
+
+

+ @L("403PageHeader") +

+
+

+ @L("403PageDescription") +

+ @L("403PageButton") +
+
\ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Views/Account/Login.cshtml b/src/SplashPage.Web.Mvc/Views/Account/Login.cshtml new file mode 100644 index 00000000..acf7f756 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/Login.cshtml @@ -0,0 +1,68 @@ +@using Abp.Authorization.Users +@model SplashPage.Web.Models.Account.LoginFormViewModel +@{ + ViewBag.Title = L("LogIn"); +} +@section scripts +{ + + + + + + + +} +

@L("LogIn")

+
+ + +
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+@**@ +

+ @if (Model.IsSelfRegistrationAllowed) + { +

+ } +

diff --git a/src/SplashPage.Web.Mvc/Views/Account/Register.cshtml b/src/SplashPage.Web.Mvc/Views/Account/Register.cshtml new file mode 100644 index 00000000..278043f8 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/Register.cshtml @@ -0,0 +1,85 @@ +@using Abp.Authorization.Users +@model SplashPage.Web.Models.Account.RegisterViewModel +@{ + ViewBag.Title = L("Register"); +} +@section scripts +{ + + + + + + + +} +

@L("Register")

+
+ @if (ViewBag.ErrorMessage != null) + { +
+ @ViewBag.ErrorMessage +
+ } + + +
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+@**@ diff --git a/src/SplashPage.Web.Mvc/Views/Account/RegisterResult.cshtml b/src/SplashPage.Web.Mvc/Views/Account/RegisterResult.cshtml new file mode 100644 index 00000000..91c87031 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/RegisterResult.cshtml @@ -0,0 +1,30 @@ +@model SplashPage.Web.Models.Account.RegisterResultViewModel +@{ + ViewBag.Title = L("SuccessfullyRegistered"); +} +
+
+

@L("SuccessfullyRegistered")

+
    +
  • @L("NameSurname"): @Model.NameAndSurname
  • +
  • @L("TenancyName"): @Model.TenancyName
  • +
  • @L("UserName"): @Model.UserName
  • +
  • @L("EmailAddress"): @Model.EmailAddress
  • +
+
+ @if (!Model.IsActive) + { + + } + + @if (Model.IsEmailConfirmationRequiredForLogin && !Model.IsEmailConfirmed) + { + + } +
+
+
diff --git a/src/SplashPage.Web.Mvc/Views/Account/_Layout.cshtml b/src/SplashPage.Web.Mvc/Views/Account/_Layout.cshtml new file mode 100644 index 00000000..70395f1c --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/_Layout.cshtml @@ -0,0 +1,60 @@ +@using Abp.Configuration.Startup +@using Abp.Web.Security.AntiForgery +@using SplashPage +@using SplashPage.Web.Resources +@inject IAbpAntiForgeryManager AbpAntiForgeryManager +@inject IWebResourceManager WebResourceManager +@inject ILanguageManager LanguageManager +@inject IMultiTenancyConfig MultiTenancyConfig +@{ + Layout = null; + AbpAntiForgeryManager.SetCookie(Context); + + var pageTitle = !string.IsNullOrWhiteSpace(ViewBag.Title) ? ViewBag.Title + " / " : ""; + pageTitle += "SplashPage"; + + var hideTenantChange = ViewBag.HideTenantChange != null && ViewBag.HideTenantChange == true; + var showTenantChange = MultiTenancyConfig.IsEnabled && !hideTenantChange; +} + + + + + + + + @pageTitle + + @await Html.PartialAsync("_Styles.cshtml") + @RenderSection("styles", required: false) + + + + @await Html.PartialAsync("_Scripts.cshtml") + @RenderSection("scripts", required: false) + @WebResourceManager.RenderScripts() + + diff --git a/src/SplashPage.Web.Mvc/Views/Account/_Scripts.cshtml b/src/SplashPage.Web.Mvc/Views/Account/_Scripts.cshtml new file mode 100644 index 00000000..64d75831 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/_Scripts.cshtml @@ -0,0 +1,95 @@ +@using System.Globalization +@using Abp.AspNetCore.Mvc.Caching +@using Abp.CachedUniqueKeys +@inject SplashPage.Timing.AppTimes AppTimes +@inject ICachedUniqueKeyPerUser CachedUniqueKeyPerUser +@inject IGetScriptsResponsePerUserConfiguration GetScriptsResponsePerUserConfiguration + + + @*core scripts start*@ + + @*core scripts end*@ + + @*admin-lte scripts start*@ + + + @*admin-lte scripts end*@ + + @*abp scripts start*@ + + + + + + + + + + + + + @*abp scripts end*@ + + @*other scripts start*@ + + + @*other scripts end*@ + + @*custom scripts start*@ + + @*custom scripts end*@ + + + + + + + + + +@if (CultureInfo.CurrentUICulture.Name != "en") +{ + var normalizedCurrentUICultureName = CultureInfo.CurrentUICulture.Name.Replace("-", "_"); + var localizationFileNameWithExtension = "messages_"; + switch (normalizedCurrentUICultureName) + { + case "zh_Hans": + localizationFileNameWithExtension += "zh"; + break; + case "es_MX": + localizationFileNameWithExtension += "es"; + break; + default: + localizationFileNameWithExtension += normalizedCurrentUICultureName; + break; + } + localizationFileNameWithExtension += ".min.js"; + +} + + + + + + +@if (GetScriptsResponsePerUserConfiguration.IsEnabled) +{ + +} +else +{ + +} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Views/Account/_Styles.cshtml b/src/SplashPage.Web.Mvc/Views/Account/_Styles.cshtml new file mode 100644 index 00000000..0bfe7870 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/_Styles.cshtml @@ -0,0 +1,24 @@ + + + + + @*admin-lte styles start*@ + + + + @*admin-lte styles end*@ + + @*abp styles start*@ + + + @*abp styles end*@ + + @*custom styles start*@ + + + @*custom styles end*@ + + + + + \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Views/Account/_ViewStart.cshtml b/src/SplashPage.Web.Mvc/Views/Account/_ViewStart.cshtml new file mode 100644 index 00000000..35c93f51 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Account/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "~/Views/Account/_Layout.cshtml"; +} diff --git a/src/SplashPage.Web.Mvc/Views/Home/Index.cshtml b/src/SplashPage.Web.Mvc/Views/Home/Index.cshtml new file mode 100644 index 00000000..821b5e1c --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Home/Index.cshtml @@ -0,0 +1,418 @@ +@using SplashPage.Web.Startup +@{ + ViewBag.Title = L("HomePage"); + ViewBag.CurrentPageName = PageNames.Home; +} + +@section scripts +{ + + + + + + + + +} + +
+
+
+
+

@L("HomePage")

+
+
+
+
+
+
+
+
+
+
This is a sample Dashboard which doesn't show any server side data. However, you can develop your own dashboard inspired by this one and its source code.
+
+
+
+ +
+
+
+ + + +
+ CPU Traffic + + 10 + % + +
+ +
+ +
+ +
+
+ + + +
+ Likes + 41,410 +
+ +
+ +
+ + +
+
+
+ + + +
+ Sales + 760 +
+ +
+ +
+ +
+
+ + + +
+ New Members + 2,000 +
+ +
+ +
+ +
+ +
+
+
+
+
Monthly Recap Report
+
+ + + +
+
+ +
+
+
+

+ Sales: 1 Jan, 2014 - 30 Jul, 2014 +

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

+ Goal Completion +

+
+ Add Products to Cart + 160/200 +
+
+
+
+ +
+ Complete Purchase + 310/400 +
+
+
+
+ +
+ Visit Premium Page + 480/800 +
+
+
+
+ +
+ Send Inquiries + 250/500 +
+
+
+
+ +
+ +
+ +
+ + + +
+ +
+ +
+ + +
+ +
+ +
+
+

Latest Orders

+
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Order IDItemStatusPopularity
+ OR9842 + Call of Duty IV + Shipped + +
90,80,90,-70,61,-83,63
+
+ OR1848 + Samsung Smart TV + Pending + +
90,80,-90,70,61,-83,68
+
+ OR7429 + iPhone 6 Plus + Delivered + +
90,-80,90,70,-61,83,63
+
+ OR7429 + Samsung Smart TV + Processing + +
90,80,-90,70,-61,83,63
+
+ OR1848 + Samsung Smart TV + Pending + +
90,80,-90,70,61,-83,68
+
+ OR7429 + iPhone 6 Plus + Delivered + +
90,-80,90,70,-61,83,63
+
+ OR9842 + Call of Duty IV + Shipped + +
90,80,90,-70,61,-83,63
+
+
+ +
+ + + +
+ +
+ +
+ +
+ + + +
+ Inventory + 5,200 +
+ +
+ +
+ + + +
+ Mentions + 92,050 +
+ +
+ +
+ + + +
+ Downloads + 114,381 +
+ +
+ +
+ + + +
+ Direct Messages + 163,921 +
+ +
+
+ +
+ +
+
diff --git a/src/SplashPage.Web.Mvc/Views/Roles/Index.AdvancedSearch.cshtml b/src/SplashPage.Web.Mvc/Views/Roles/Index.AdvancedSearch.cshtml new file mode 100644 index 00000000..456ae41a --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Roles/Index.AdvancedSearch.cshtml @@ -0,0 +1,12 @@ + diff --git a/src/SplashPage.Web.Mvc/Views/Roles/Index.cshtml b/src/SplashPage.Web.Mvc/Views/Roles/Index.cshtml new file mode 100644 index 00000000..4d92392f --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Roles/Index.cshtml @@ -0,0 +1,76 @@ +@using SplashPage.Web.Startup +@model SplashPage.Web.Models.Roles.RoleListViewModel +@{ + ViewBag.Title = L("Roles"); + ViewBag.CurrentPageName = PageNames.Roles; +} +@section scripts +{ + + + + + + + +} +
+
+
+
+

@L("Roles")

+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+ @await Html.PartialAsync("~/Views/Roles/Index.AdvancedSearch.cshtml") +
+
+
+
+
+ + + + + + + + + + + +
@L("RoleName")@L("DisplayName")@L("Actions")
+
+
+
+
+
+
+
+ +@await Html.PartialAsync("~/Views/Roles/_CreateModal.cshtml", Model) + + diff --git a/src/SplashPage.Web.Mvc/Views/Roles/_CreateModal.cshtml b/src/SplashPage.Web.Mvc/Views/Roles/_CreateModal.cshtml new file mode 100644 index 00000000..7e80aca8 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Roles/_CreateModal.cshtml @@ -0,0 +1,49 @@ +@using SplashPage.Web.Models.Common.Modals +@model SplashPage.Web.Models.Roles.RoleListViewModel +@{ + Layout = null; +} + diff --git a/src/SplashPage.Web.Mvc/Views/Roles/_EditModal.cshtml b/src/SplashPage.Web.Mvc/Views/Roles/_EditModal.cshtml new file mode 100644 index 00000000..56b298a6 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Roles/_EditModal.cshtml @@ -0,0 +1,48 @@ +@using SplashPage.Web.Models.Roles +@using SplashPage.Web.Models.Common.Modals +@model EditRoleModalViewModel +@{ + Layout = null; +} +@await Html.PartialAsync("~/Views/Shared/Modals/_ModalHeader.cshtml", new ModalHeaderViewModel(L("EditRole"))) +
+ + + + @await Html.PartialAsync("~/Views/Shared/Modals/_ModalFooterWithSaveAndCancel.cshtml") +
+ + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/AccountLanguagesViewComponent.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/AccountLanguagesViewComponent.cs new file mode 100644 index 00000000..e083f7a9 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/AccountLanguagesViewComponent.cs @@ -0,0 +1,30 @@ +using Abp.Localization; +using Microsoft.AspNetCore.Mvc; +using System.Linq; +using System.Threading.Tasks; + +namespace SplashPage.Web.Views.Shared.Components.AccountLanguages; + +public class AccountLanguagesViewComponent : SplashPageViewComponent +{ + private readonly ILanguageManager _languageManager; + + public AccountLanguagesViewComponent(ILanguageManager languageManager) + { + _languageManager = languageManager; + } + + public Task InvokeAsync() + { + var model = new LanguageSelectionViewModel + { + CurrentLanguage = _languageManager.CurrentLanguage, + Languages = _languageManager.GetLanguages().Where(l => !l.IsDisabled).ToList() + .Where(l => !l.IsDisabled) + .ToList(), + CurrentUrl = Request.Path + }; + + return Task.FromResult(View(model) as IViewComponentResult); + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/Default.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/Default.cshtml new file mode 100644 index 00000000..36623e65 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/Default.cshtml @@ -0,0 +1,18 @@ +@using SplashPage.Web.Views.Shared.Components.AccountLanguages +@model LanguageSelectionViewModel +@if (Model.Languages.Count > 1) +{ +
+ @foreach (var languageInfo in Model.Languages) + { + + + + + + } +
+} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/LanguageSelectionViewModel.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/LanguageSelectionViewModel.cs new file mode 100644 index 00000000..7359c1d4 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/AccountLanguages/LanguageSelectionViewModel.cs @@ -0,0 +1,14 @@ +using Abp.Localization; +using Microsoft.AspNetCore.Http; +using System.Collections.Generic; + +namespace SplashPage.Web.Views.Shared.Components.AccountLanguages; + +public class LanguageSelectionViewModel +{ + public LanguageInfo CurrentLanguage { get; set; } + + public IReadOnlyList Languages { get; set; } + + public PathString CurrentUrl { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/Default.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/Default.cshtml new file mode 100644 index 00000000..2662c36d --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/Default.cshtml @@ -0,0 +1,23 @@ +@using SplashPage.Web.Views.Shared.Components.RightNavbarLanguageSwitch +@model RightNavbarLanguageSwitchViewModel + + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/RightNavbarLanguageSwitchViewComponent.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/RightNavbarLanguageSwitchViewComponent.cs new file mode 100644 index 00000000..d8a28766 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/RightNavbarLanguageSwitchViewComponent.cs @@ -0,0 +1,26 @@ +using Abp.Localization; +using Microsoft.AspNetCore.Mvc; +using System.Linq; + +namespace SplashPage.Web.Views.Shared.Components.RightNavbarLanguageSwitch; + +public class RightNavbarLanguageSwitchViewComponent : SplashPageViewComponent +{ + private readonly ILanguageManager _languageManager; + + public RightNavbarLanguageSwitchViewComponent(ILanguageManager languageManager) + { + _languageManager = languageManager; + } + + public IViewComponentResult Invoke() + { + var model = new RightNavbarLanguageSwitchViewModel + { + CurrentLanguage = _languageManager.CurrentLanguage, + Languages = _languageManager.GetLanguages().Where(l => !l.IsDisabled).ToList() + }; + + return View(model); + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/RightNavbarLanguageSwitchViewModel.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/RightNavbarLanguageSwitchViewModel.cs new file mode 100644 index 00000000..cb3cfaf4 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarLanguageSwitch/RightNavbarLanguageSwitchViewModel.cs @@ -0,0 +1,11 @@ +using Abp.Localization; +using System.Collections.Generic; + +namespace SplashPage.Web.Views.Shared.Components.RightNavbarLanguageSwitch; + +public class RightNavbarLanguageSwitchViewModel +{ + public LanguageInfo CurrentLanguage { get; set; } + + public IReadOnlyList Languages { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/Default.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/Default.cshtml new file mode 100644 index 00000000..b282e769 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/Default.cshtml @@ -0,0 +1,15 @@ +@model SplashPage.Web.Views.Shared.Components.RightNavbarUserArea.RightNavbarUserAreaViewModel + + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/RightNavbarUserAreaViewComponent.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/RightNavbarUserAreaViewComponent.cs new file mode 100644 index 00000000..9d9748c1 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/RightNavbarUserAreaViewComponent.cs @@ -0,0 +1,32 @@ +using Abp.Configuration.Startup; +using SplashPage.Sessions; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace SplashPage.Web.Views.Shared.Components.RightNavbarUserArea; + +public class RightNavbarUserAreaViewComponent : SplashPageViewComponent +{ + private readonly ISessionAppService _sessionAppService; + private readonly IMultiTenancyConfig _multiTenancyConfig; + + public RightNavbarUserAreaViewComponent( + ISessionAppService sessionAppService, + IMultiTenancyConfig multiTenancyConfig) + { + _sessionAppService = sessionAppService; + _multiTenancyConfig = multiTenancyConfig; + } + + public async Task InvokeAsync() + { + var model = new RightNavbarUserAreaViewModel + { + LoginInformations = await _sessionAppService.GetCurrentLoginInformations(), + IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled, + }; + + return View(model); + } +} + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/RightNavbarUserAreaViewModel.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/RightNavbarUserAreaViewModel.cs new file mode 100644 index 00000000..74291f46 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/RightNavbarUserArea/RightNavbarUserAreaViewModel.cs @@ -0,0 +1,25 @@ +using SplashPage.Sessions.Dto; + +namespace SplashPage.Web.Views.Shared.Components.RightNavbarUserArea; + +public class RightNavbarUserAreaViewModel +{ + public GetCurrentLoginInformationsOutput LoginInformations { get; set; } + + public bool IsMultiTenancyEnabled { get; set; } + + public string GetShownLoginName() + { + var userName = LoginInformations.User.UserName; + + if (!IsMultiTenancyEnabled) + { + return userName; + } + + return LoginInformations.Tenant == null + ? ".\\" + userName + : LoginInformations.Tenant.TenancyName + "\\" + userName; + } +} + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/Default.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/Default.cshtml new file mode 100644 index 00000000..1d214c50 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/Default.cshtml @@ -0,0 +1,16 @@ +@using SplashPage.Web.Views.Shared.Components.SideBarMenu +@model SideBarMenuViewModel +@{ + var orderedMenuItems = Model.MainMenu.Items.Where(x => x.IsVisible).ToList(); +} + + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/SideBarMenuViewComponent.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/SideBarMenuViewComponent.cs new file mode 100644 index 00000000..7ee95c83 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/SideBarMenuViewComponent.cs @@ -0,0 +1,30 @@ +using Abp.Application.Navigation; +using Abp.Runtime.Session; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace SplashPage.Web.Views.Shared.Components.SideBarMenu; + +public class SideBarMenuViewComponent : SplashPageViewComponent +{ + private readonly IUserNavigationManager _userNavigationManager; + private readonly IAbpSession _abpSession; + + public SideBarMenuViewComponent( + IUserNavigationManager userNavigationManager, + IAbpSession abpSession) + { + _userNavigationManager = userNavigationManager; + _abpSession = abpSession; + } + + public async Task InvokeAsync() + { + var model = new SideBarMenuViewModel + { + MainMenu = await _userNavigationManager.GetMenuAsync("MainMenu", _abpSession.ToUserIdentifier()) + }; + + return View(model); + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/SideBarMenuViewModel.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/SideBarMenuViewModel.cs new file mode 100644 index 00000000..4ea89a93 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/SideBarMenuViewModel.cs @@ -0,0 +1,8 @@ +using Abp.Application.Navigation; + +namespace SplashPage.Web.Views.Shared.Components.SideBarMenu; + +public class SideBarMenuViewModel +{ + public UserMenu MainMenu { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/UserMenuItemExtensions.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/UserMenuItemExtensions.cs new file mode 100644 index 00000000..37c2559b --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/UserMenuItemExtensions.cs @@ -0,0 +1,15 @@ +using Abp.Application.Navigation; +using System.Collections.Generic; +using System.Linq; + +namespace SplashPage.Web.Views.Shared.Components.SideBarMenu; + +public static class UserMenuItemExtensions +{ + public static IOrderedEnumerable OrderByCustom(this IEnumerable menuItems) + { + return menuItems + .OrderBy(menuItem => menuItem.Order) + .ThenBy(menuItem => menuItem.DisplayName); + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/_MenuItem.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/_MenuItem.cshtml new file mode 100644 index 00000000..dab82c15 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarMenu/_MenuItem.cshtml @@ -0,0 +1,86 @@ +@using SplashPage.Web.Views +@using SplashPage.Web.Views.Shared.Components.SideBarMenu +@using Abp.Application.Navigation +@model Abp.Application.Navigation.UserMenuItem +@inject ILanguageManager LanguageManager +@{ + var isActive = IsActiveMenuItem(Model, ViewBag.CurrentPageName); + var subMenus = Model.Items.Where(x => x.IsVisible).OrderByCustom().ToList(); + var hasSubMenus = subMenus.Any(); +} +@functions { + static bool IsActiveMenuItem(UserMenuItem menuItem, string pageName) + { + if (string.IsNullOrWhiteSpace(pageName)) + return false; + + return pageName.Equals(menuItem.Name, StringComparison.InvariantCultureIgnoreCase) + || menuItem.Items.Any(cn => IsActiveMenuItem(cn, pageName)); + } + + string CalculateMenuUrl(string url) + { + if (string.IsNullOrEmpty(url)) + return ApplicationPath; + + if (UrlChecker.IsRooted(url)) + return url; + + return ApplicationPath + url; + } +} +@if (!hasSubMenus) +{ + var linkUrl = CalculateMenuUrl(Model.Url); + var linkClasses = $"nav-link {(isActive ? "active" : null)}"; + var linkTarget = !string.IsNullOrEmpty(Model.Target) ? Html.Raw($" target=\"{Model.Target}\"") : null; + + +} +else +{ + var navitemClasses = $"nav-item {(hasSubMenus ? "has-treeview" : "")} {(isActive ? "menu-open" : "")}"; + navitemClasses = !string.IsNullOrEmpty(navitemClasses?.Trim()) ? navitemClasses : null; + var linkClasses = $"nav-link {(isActive ? "active" : null)}"; + +
  • + + @if (!string.IsNullOrEmpty(Model.Icon)) + { + + + + } +

    + @Model.DisplayName + @if (LanguageManager.CurrentLanguage.IsRightToLeft) + { + + } + else + { + + } +

    +
    + @if (hasSubMenus) + { + + } +
  • +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/Default.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/Default.cshtml new file mode 100644 index 00000000..612631f4 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/Default.cshtml @@ -0,0 +1,11 @@ +@using SplashPage.Web.Views.Shared.Components.SideBarUserArea +@model SideBarUserAreaViewModel + + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/SideBarUserAreaViewComponent.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/SideBarUserAreaViewComponent.cs new file mode 100644 index 00000000..22e653b6 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/SideBarUserAreaViewComponent.cs @@ -0,0 +1,31 @@ +using Abp.Configuration.Startup; +using SplashPage.Sessions; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace SplashPage.Web.Views.Shared.Components.SideBarUserArea; + +public class SideBarUserAreaViewComponent : SplashPageViewComponent +{ + private readonly ISessionAppService _sessionAppService; + private readonly IMultiTenancyConfig _multiTenancyConfig; + + public SideBarUserAreaViewComponent( + ISessionAppService sessionAppService, + IMultiTenancyConfig multiTenancyConfig) + { + _sessionAppService = sessionAppService; + _multiTenancyConfig = multiTenancyConfig; + } + + public async Task InvokeAsync() + { + var model = new SideBarUserAreaViewModel + { + LoginInformations = await _sessionAppService.GetCurrentLoginInformations(), + IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled, + }; + + return View(model); + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/SideBarUserAreaViewModel.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/SideBarUserAreaViewModel.cs new file mode 100644 index 00000000..07c17642 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/SideBarUserArea/SideBarUserAreaViewModel.cs @@ -0,0 +1,24 @@ +using SplashPage.Sessions.Dto; + +namespace SplashPage.Web.Views.Shared.Components.SideBarUserArea; + +public class SideBarUserAreaViewModel +{ + public GetCurrentLoginInformationsOutput LoginInformations { get; set; } + + public bool IsMultiTenancyEnabled { get; set; } + + public string GetShownLoginName() + { + var userName = LoginInformations.User.UserName; + + if (!IsMultiTenancyEnabled) + { + return userName; + } + + return LoginInformations.Tenant == null + ? ".\\" + userName + : LoginInformations.Tenant.TenancyName + "\\" + userName; + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/ChangeModalViewModel.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/ChangeModalViewModel.cs new file mode 100644 index 00000000..66e63b7d --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/ChangeModalViewModel.cs @@ -0,0 +1,6 @@ +namespace SplashPage.Web.Views.Shared.Components.TenantChange; + +public class ChangeModalViewModel +{ + public string TenancyName { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/Default.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/Default.cshtml new file mode 100644 index 00000000..55ac7c3c --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/Default.cshtml @@ -0,0 +1,27 @@ +@using SplashPage.Web.Resources +@inject IWebResourceManager WebResourceManager +@{ + WebResourceManager.AddScript(ApplicationPath + "view-resources/Views/Shared/Components/TenantChange/Default.js"); +} +
    + + @L("CurrentTenant"): + + @if (Model.Tenant != null) + { + @Model.Tenant.TenancyName + } + else + { + @L("NotSelected") + } + + (@L("Change")) + +
    + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/TenantChangeViewComponent.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/TenantChangeViewComponent.cs new file mode 100644 index 00000000..a542d2ff --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/TenantChangeViewComponent.cs @@ -0,0 +1,25 @@ +using Abp.ObjectMapping; +using SplashPage.Sessions; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace SplashPage.Web.Views.Shared.Components.TenantChange; + +public class TenantChangeViewComponent : SplashPageViewComponent +{ + private readonly ISessionAppService _sessionAppService; + private readonly IObjectMapper _objectMapper; + + public TenantChangeViewComponent(ISessionAppService sessionAppService, IObjectMapper objectMapper) + { + _sessionAppService = sessionAppService; + _objectMapper = objectMapper; + } + + public async Task InvokeAsync() + { + var loginInfo = await _sessionAppService.GetCurrentLoginInformations(); + var model = _objectMapper.Map(loginInfo); + return View(model); + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/TenantChangeViewModel.cs b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/TenantChangeViewModel.cs new file mode 100644 index 00000000..eb40c562 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/TenantChangeViewModel.cs @@ -0,0 +1,10 @@ +using Abp.AutoMapper; +using SplashPage.Sessions.Dto; + +namespace SplashPage.Web.Views.Shared.Components.TenantChange; + +[AutoMapFrom(typeof(GetCurrentLoginInformationsOutput))] +public class TenantChangeViewModel +{ + public TenantLoginInfoDto Tenant { get; set; } +} diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/_ChangeModal.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/_ChangeModal.cshtml new file mode 100644 index 00000000..3e8465e2 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Components/TenantChange/_ChangeModal.cshtml @@ -0,0 +1,23 @@ +@using Abp.MultiTenancy +@using SplashPage.Web.Models.Common.Modals +@using SplashPage.Web.Views.Shared.Components.TenantChange +@model ChangeModalViewModel +@{ + Layout = null; +} +@await Html.PartialAsync("~/Views/Shared/Modals/_ModalHeader.cshtml", new ModalHeaderViewModel(L("ChangeTenant"))) + +
    + + @await Html.PartialAsync("~/Views/Shared/Modals/_ModalFooterWithSaveAndCancel.cshtml") +
    + + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Error.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Error.cshtml new file mode 100644 index 00000000..f03f9575 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Error.cshtml @@ -0,0 +1,36 @@ +@using Abp.Collections.Extensions +@model Abp.Web.Mvc.Models.ErrorViewModel +
    +
    +
    +
    +
    +
    +

    @Model.ErrorInfo.Message

    +
    +
    +

    + @(!string.IsNullOrEmpty(Model.ErrorInfo.Details) ? Model.ErrorInfo.Details : Model.ErrorInfo.Message) +

    + @* Show validation errors *@ + @if (!Model.ErrorInfo.ValidationErrors.IsNullOrEmpty()) + { +
      + @foreach (var validationError in Model.ErrorInfo.ValidationErrors) + { +
    • + @validationError.Message + @if (validationError.Members != null && validationError.Members.Any()) + { + (@string.Join(", ", validationError.Members)) + } +
    • + } +
    + } +
    +
    +
    +
    +
    +
    diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Alerts.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Alerts.cshtml new file mode 100644 index 00000000..d871dbd2 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Alerts.cshtml @@ -0,0 +1,45 @@ +@using Abp.Web.Mvc.Alerts + +@inject IAlertManager AlertManager + +@if (AlertManager.Alerts.Any()) +{ +
    + @foreach (var alert in AlertManager.Alerts) + { + var alertClass = "alert-"; + var iconClass = "fa-"; + switch (alert.Type) + { + case AlertType.Success: + alertClass += "success"; + iconClass += "check"; + break; + case AlertType.Danger: + alertClass += "danger"; + iconClass += "ban"; + break; + case AlertType.Warning: + alertClass += "warning"; + iconClass += "exclamation-triangle"; + break; + case AlertType.Info: + alertClass += "info"; + iconClass += "info"; + break; + } + +
    + @if (alert.Dismissible) + { + + } +
    + + @alert.Title +
    + @alert.Text +
    + } +
    +} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Footer.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Footer.cshtml new file mode 100644 index 00000000..bfa92ba2 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Footer.cshtml @@ -0,0 +1,7 @@ +@using SplashPage +
    + Copyright © @DateTime.Now.Year SplashPage. All rights reserved. +
    + @L("Version") @AppVersionHelper.Version [@AppVersionHelper.ReleaseDate.ToString("yyyyMMdd")] +
    +
    diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.LeftNavbar.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.LeftNavbar.cshtml new file mode 100644 index 00000000..00a19b32 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.LeftNavbar.cshtml @@ -0,0 +1,11 @@ + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.RightNavbar.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.RightNavbar.cshtml new file mode 100644 index 00000000..88fb1aae --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.RightNavbar.cshtml @@ -0,0 +1,6 @@ +@using SplashPage.Web.Views.Shared.Components.RightNavbarLanguageSwitch +@using SplashPage.Web.Views.Shared.Components.RightNavbarUserArea + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.cshtml new file mode 100644 index 00000000..e897b6ef --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Header.cshtml @@ -0,0 +1,4 @@ + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Layout.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Layout.cshtml new file mode 100644 index 00000000..ca0f6325 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Layout.cshtml @@ -0,0 +1,43 @@ +@using Abp.Configuration.Startup +@using Abp.Web.Mvc.Alerts +@using Abp.Web.Security.AntiForgery +@using SplashPage.Web.Resources +@inject IAbpAntiForgeryManager AbpAntiForgeryManager +@inject IMultiTenancyConfig MultiTenancyConfig +@inject IWebResourceManager WebResourceManager +@inject IAlertManager AlertManager +@inject ILanguageManager LanguageManager +@{ + AbpAntiForgeryManager.SetCookie(Context); + + var pageTitle = !string.IsNullOrWhiteSpace(ViewBag.Title) ? ViewBag.Title + " / " : ""; + pageTitle += "SplashPage"; +} + + + + + + + + @pageTitle + + @await Html.PartialAsync("_Styles.cshtml") + @RenderSection("styles", required: false) + + +
    + @await Html.PartialAsync("_Header.cshtml") + @await Html.PartialAsync("_SideBar.cshtml") +
    + @await Html.PartialAsync("_Alerts.cshtml") + @RenderBody() +
    + @await Html.PartialAsync("_Footer.cshtml") +
    + + @await Html.PartialAsync("_Scripts.cshtml") + @RenderSection("scripts", required: false) + @WebResourceManager.RenderScripts() + + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Scripts.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Scripts.cshtml new file mode 100644 index 00000000..08b20bc9 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Scripts.cshtml @@ -0,0 +1,107 @@ +@using System.Globalization +@using Abp.AspNetCore.Mvc.Caching +@using Abp.CachedUniqueKeys +@inject SplashPage.Timing.AppTimes AppTimes +@inject ICachedUniqueKeyPerUser CachedUniqueKeyPerUser +@inject IGetScriptsResponsePerUserConfiguration GetScriptsResponsePerUserConfiguration + + + @*core scripts start*@ + + @*core scripts end*@ + + @*admin-lte scripts start*@ + + + + + + + + + + + @*admin-lte scripts end*@ + + @*abp scripts start*@ + + + + + + + + + + + + + + + @*abp scripts end*@ + + @*other scripts start*@ + + + + @*other scripts end*@ + + @*custom scripts start*@ + + + @*custom scripts end*@ + + + + + + + + + +@if (CultureInfo.CurrentUICulture.Name != "en") +{ + var normalizedCurrentUICultureName = CultureInfo.CurrentUICulture.Name.Replace("-", "_"); + var localizationFileNameWithExtension = "messages_"; + switch (normalizedCurrentUICultureName) + { + case "zh_Hans": + localizationFileNameWithExtension += "zh"; + break; + case "es_MX": + localizationFileNameWithExtension += "es"; + break; + default: + localizationFileNameWithExtension += normalizedCurrentUICultureName; + break; + } + localizationFileNameWithExtension += ".min.js"; + +} + + + + + + +@if (GetScriptsResponsePerUserConfiguration.IsEnabled) +{ + +} +else +{ + +} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_SideBar.Logo.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_SideBar.Logo.cshtml new file mode 100644 index 00000000..6820fbf7 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_SideBar.Logo.cshtml @@ -0,0 +1,4 @@ + + Logo + SplashPage + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_SideBar.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_SideBar.cshtml new file mode 100644 index 00000000..586397d0 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_SideBar.cshtml @@ -0,0 +1,9 @@ +@using SplashPage.Web.Views.Shared.Components.SideBarMenu +@using SplashPage.Web.Views.Shared.Components.SideBarUserArea + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Styles.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Styles.cshtml new file mode 100644 index 00000000..0ae93120 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Layout/_Styles.cshtml @@ -0,0 +1,27 @@ + + + + + @*admin-lte styles start*@ + + + + + + + @*admin-lte styles end*@ + + @*abp styles start*@ + + + @*abp styles end*@ + + @*custom styles start*@ + + + @*custom styles end*@ + + + + + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Modals/_ModalFooterWithSaveAndCancel.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Modals/_ModalFooterWithSaveAndCancel.cshtml new file mode 100644 index 00000000..6a61ca90 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Modals/_ModalFooterWithSaveAndCancel.cshtml @@ -0,0 +1,4 @@ + diff --git a/src/SplashPage.Web.Mvc/Views/Shared/Modals/_ModalHeader.cshtml b/src/SplashPage.Web.Mvc/Views/Shared/Modals/_ModalHeader.cshtml new file mode 100644 index 00000000..6eafb582 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Shared/Modals/_ModalHeader.cshtml @@ -0,0 +1,8 @@ +@using SplashPage.Web.Models.Common.Modals +@model ModalHeaderViewModel + diff --git a/src/SplashPage.Web.Mvc/Views/SplashPageRazorPage.cs b/src/SplashPage.Web.Mvc/Views/SplashPageRazorPage.cs new file mode 100644 index 00000000..0892db45 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/SplashPageRazorPage.cs @@ -0,0 +1,16 @@ +using Abp.AspNetCore.Mvc.Views; +using Abp.Runtime.Session; +using Microsoft.AspNetCore.Mvc.Razor.Internal; + +namespace SplashPage.Web.Views; + +public abstract class SplashPageRazorPage : AbpRazorPage +{ + [RazorInject] + public IAbpSession AbpSession { get; set; } + + protected SplashPageRazorPage() + { + LocalizationSourceName = SplashPageConsts.LocalizationSourceName; + } +} diff --git a/src/SplashPage.Web.Mvc/Views/SplashPageViewComponent.cs b/src/SplashPage.Web.Mvc/Views/SplashPageViewComponent.cs new file mode 100644 index 00000000..84eb94da --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/SplashPageViewComponent.cs @@ -0,0 +1,11 @@ +using Abp.AspNetCore.Mvc.ViewComponents; + +namespace SplashPage.Web.Views; + +public abstract class SplashPageViewComponent : AbpViewComponent +{ + protected SplashPageViewComponent() + { + LocalizationSourceName = SplashPageConsts.LocalizationSourceName; + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Tenants/Index.AdvancedSearch.cshtml b/src/SplashPage.Web.Mvc/Views/Tenants/Index.AdvancedSearch.cshtml new file mode 100644 index 00000000..02da9983 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Tenants/Index.AdvancedSearch.cshtml @@ -0,0 +1,55 @@ + diff --git a/src/SplashPage.Web.Mvc/Views/Tenants/Index.cshtml b/src/SplashPage.Web.Mvc/Views/Tenants/Index.cshtml new file mode 100644 index 00000000..2c259fd8 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Tenants/Index.cshtml @@ -0,0 +1,75 @@ +@using SplashPage.Web.Startup +@{ + ViewBag.Title = L("Tenants"); + ViewBag.CurrentPageName = PageNames.Tenants; +} +@section scripts +{ + + + + + + + +} +
    +
    +
    +
    +

    @L("Tenants")

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + @await Html.PartialAsync("~/Views/Tenants/Index.AdvancedSearch.cshtml") +
    +
    +
    +
    +
    + + + + + + + + + + + +
    @L("TenancyName")@L("Name")@L("IsActive")@L("Actions")
    +
    +
    +
    +
    +
    +
    +
    + +@await Html.PartialAsync("~/Views/Tenants/_CreateModal.cshtml") + + diff --git a/src/SplashPage.Web.Mvc/Views/Tenants/_CreateModal.cshtml b/src/SplashPage.Web.Mvc/Views/Tenants/_CreateModal.cshtml new file mode 100644 index 00000000..660ed0af --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Tenants/_CreateModal.cshtml @@ -0,0 +1,56 @@ +@using Abp.Authorization.Users +@using Abp.MultiTenancy +@using SplashPage.MultiTenancy +@using SplashPage.Web.Models.Common.Modals +@{ + Layout = null; +} + diff --git a/src/SplashPage.Web.Mvc/Views/Tenants/_EditModal.cshtml b/src/SplashPage.Web.Mvc/Views/Tenants/_EditModal.cshtml new file mode 100644 index 00000000..a5b8fbce --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Tenants/_EditModal.cshtml @@ -0,0 +1,33 @@ +@using SplashPage.MultiTenancy.Dto +@using SplashPage.Web.Models.Common.Modals +@model TenantDto +@{ + Layout = null; +} +@await Html.PartialAsync("~/Views/Shared/Modals/_ModalHeader.cshtml", new ModalHeaderViewModel(L("EditTenant"))) +
    + + + @await Html.PartialAsync("~/Views/Shared/Modals/_ModalFooterWithSaveAndCancel.cshtml") +
    + + diff --git a/src/SplashPage.Web.Mvc/Views/UrlChecker.cs b/src/SplashPage.Web.Mvc/Views/UrlChecker.cs new file mode 100644 index 00000000..9599c96f --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/UrlChecker.cs @@ -0,0 +1,23 @@ +using System.Text.RegularExpressions; + +namespace SplashPage.Web.Views; + +public static class UrlChecker +{ + private static readonly Regex UrlWithProtocolRegex = new Regex("^.{1,10}://.*$"); + + public static bool IsRooted(string url) + { + if (url.StartsWith("/")) + { + return true; + } + + if (UrlWithProtocolRegex.IsMatch(url)) + { + return true; + } + + return false; + } +} diff --git a/src/SplashPage.Web.Mvc/Views/Users/ChangePassword.cshtml b/src/SplashPage.Web.Mvc/Views/Users/ChangePassword.cshtml new file mode 100644 index 00000000..36c13015 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Users/ChangePassword.cshtml @@ -0,0 +1,58 @@ +@using Abp.Authorization.Users +@{ + ViewBag.Title = L("UpdatePassword"); +} +@section scripts +{ + + + + + + + +} +
    +
    +
    +
    +

    @L("UpdatePassword")

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/Views/Users/Index.AdvancedSearch.cshtml b/src/SplashPage.Web.Mvc/Views/Users/Index.AdvancedSearch.cshtml new file mode 100644 index 00000000..b41db6ce --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Users/Index.AdvancedSearch.cshtml @@ -0,0 +1,12 @@ + diff --git a/src/SplashPage.Web.Mvc/Views/Users/Index.cshtml b/src/SplashPage.Web.Mvc/Views/Users/Index.cshtml new file mode 100644 index 00000000..80dcaa17 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Users/Index.cshtml @@ -0,0 +1,78 @@ +@using SplashPage.Web.Startup +@using SplashPage.Web.Models.Users +@model UserListViewModel +@{ + ViewBag.Title = L("Users"); + ViewBag.CurrentPageName = PageNames.Users; +} +@section scripts +{ + + + + + + + +} +
    +
    +
    +
    +

    @L("Users")

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + @await Html.PartialAsync("~/Views/Users/Index.AdvancedSearch.cshtml") +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    @L("UserName")@L("FullName")@L("EmailAddress")@L("IsActive")@L("Actions")
    +
    +
    +
    +
    +
    +
    +
    + +@await Html.PartialAsync("~/Views/Users/_CreateModal.cshtml", Model) + + diff --git a/src/SplashPage.Web.Mvc/Views/Users/_CreateModal.cshtml b/src/SplashPage.Web.Mvc/Views/Users/_CreateModal.cshtml new file mode 100644 index 00000000..cb73d735 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Users/_CreateModal.cshtml @@ -0,0 +1,84 @@ +@using Abp.Authorization.Users +@using SplashPage.Web.Models.Common.Modals +@using SplashPage.Web.Models.Users +@model UserListViewModel +@{ + Layout = null; +} + diff --git a/src/SplashPage.Web.Mvc/Views/Users/_EditModal.cshtml b/src/SplashPage.Web.Mvc/Views/Users/_EditModal.cshtml new file mode 100644 index 00000000..8eddcbcf --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/Users/_EditModal.cshtml @@ -0,0 +1,69 @@ +@using Abp.Authorization.Users +@using SplashPage.Web.Models.Common.Modals +@using SplashPage.Web.Models.Users +@model EditUserModalViewModel +@{ + Layout = null; +} +@await Html.PartialAsync("~/Views/Shared/Modals/_ModalHeader.cshtml", new ModalHeaderViewModel(L("EditUser"))) +
    + + + @await Html.PartialAsync("~/Views/Shared/Modals/_ModalFooterWithSaveAndCancel.cshtml") +
    + + diff --git a/src/SplashPage.Web.Mvc/Views/_ViewImports.cshtml b/src/SplashPage.Web.Mvc/Views/_ViewImports.cshtml new file mode 100644 index 00000000..e2f4f632 --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/_ViewImports.cshtml @@ -0,0 +1,4 @@ +@using Abp.Localization +@inherits SplashPage.Web.Views.SplashPageRazorPage +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, SplashPage.Web.Mvc diff --git a/src/SplashPage.Web.Mvc/Views/_ViewStart.cshtml b/src/SplashPage.Web.Mvc/Views/_ViewStart.cshtml new file mode 100644 index 00000000..e367860f --- /dev/null +++ b/src/SplashPage.Web.Mvc/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "~/Views/Shared/Layout/_Layout.cshtml"; +} diff --git a/src/SplashPage.Web.Mvc/appsettings.Staging.json b/src/SplashPage.Web.Mvc/appsettings.Staging.json new file mode 100644 index 00000000..607d7656 --- /dev/null +++ b/src/SplashPage.Web.Mvc/appsettings.Staging.json @@ -0,0 +1,8 @@ +{ + "ConnectionStrings": { + "Default": "Server=10.0.75.1; Database=SplashPageDb; User=sa; Password=123qwe;" + }, + "App": { + "WebSiteRootAddress": "http://localhost:9903/" + } +} diff --git a/src/SplashPage.Web.Mvc/appsettings.json b/src/SplashPage.Web.Mvc/appsettings.json new file mode 100644 index 00000000..4894fa4b --- /dev/null +++ b/src/SplashPage.Web.Mvc/appsettings.json @@ -0,0 +1,21 @@ +{ + "ConnectionStrings": { + "Default": "Server=localhost; Database=SplashPageDb; Trusted_Connection=True; TrustServerCertificate=True;" + }, + "Authentication": { + "JwtBearer": { + "IsEnabled": "true", + "SecurityKey": "SplashPage_800C4C0D3F1E48BC89D62C2223B90F7C", + "Issuer": "SplashPage", + "Audience": "SplashPage" + } + }, + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/src/SplashPage.Web.Mvc/bundleconfig.json b/src/SplashPage.Web.Mvc/bundleconfig.json new file mode 100644 index 00000000..3abb2825 --- /dev/null +++ b/src/SplashPage.Web.Mvc/bundleconfig.json @@ -0,0 +1,160 @@ +[ + { + "outputFileName": "wwwroot/view-resources/Views/_Bundles/account-layout.min.css", + "inputFiles": [ + "wwwroot/libs/font-awesome/css/all.css", + "wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.css", + "wwwroot/libs/icheck-bootstrap/icheck-bootstrap.css", + "wwwroot/libs/toastr/toastr.css", + "wwwroot/libs/admin-lte/dist/css/adminlte.css", + "wwwroot/css/style.css", + "wwwroot/view-resources/Views/Account/_Layout.css" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/_Bundles/account-layout.min.js", + "inputFiles": [ + "wwwroot/libs/jquery/jquery.js", + "wwwroot/libs/bootstrap/dist/js/bootstrap.bundle.js", + "wwwroot/libs/admin-lte/dist/js/adminlte.js", + "wwwroot/libs/jquery-validate/jquery.validate.js", + "wwwroot/libs/jquery-validate/jquery.validate.unobtrusive.js", + "wwwroot/libs/toastr/toastr.min.js", + "wwwroot/libs/block-ui/jquery.blockUI.js", + "wwwroot/libs/spin/spin.js", + "wwwroot/libs-ext/spin/jquery.spin.js", + "wwwroot/libs/sweetalert/sweetalert.min.js", + "wwwroot/libs/moment/moment-with-locales.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/abp.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.jquery.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.toastr.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.blockUI.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.spin.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.sweet-alert.js", + "wwwroot/js/main.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/_Bundles/shared-layout.min.css", + "inputFiles": [ + "wwwroot/libs/font-awesome/css/all.min.css", + "wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.min.css", + "wwwroot/libs/icheck-bootstrap/icheck-bootstrap.css", + "wwwroot/libs/toastr/toastr.css", + "wwwroot/libs/admin-lte/dist/css/adminlte.min.css", + "wwwroot/libs/datatables/css/dataTables.bootstrap4.min.css", + "wwwroot/libs/datatables/css/responsive.bootstrap4.min.css", + "wwwroot/libs/datatables/css/buttons.bootstrap4.min.css", + "wwwroot/css/style.css", + "wwwroot/view-resources/Views/Shared/_Layout.css" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/_Bundles/shared-layout.min.js", + "inputFiles": [ + "wwwroot/libs/jquery/jquery.js", + + "wwwroot/libs/bootstrap/dist/js/bootstrap.bundle.js", + "wwwroot/libs/datatables/js/jquery.dataTables.min.js", + "wwwroot/Common/helpers.js", + "wwwroot/Common/datatables.ajax.js", + "wwwroot/libs/datatables/js/dataTables.bootstrap4.min.js", + "wwwroot/libs/datatables/js/dataTables.responsive.min.js", + "wwwroot/libs/datatables/js/responsive.bootstrap4.min.js", + "wwwroot/libs/datatables/js/dataTables.buttons.js", + "wwwroot/libs/datatables/js/buttons.bootstrap4.js", + "wwwroot/libs/admin-lte/dist/js/adminlte.js", + + "wwwroot/libs/block-ui/jquery.blockUI.js", + "wwwroot/libs/spin/spin.js", + "wwwroot/libs-ext/spin/jquery.spin.js", + "wwwroot/libs/sweetalert/sweetalert.min.js", + "wwwroot/libs/toastr/toastr.min.js", + "wwwroot/libs/moment/moment-with-locales.js", + "wwwroot/libs/signalr/dist/browser/signalr.js", + + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/abp.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.jquery.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.toastr.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.blockUI.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.spin.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.sweet-alert.js", + "wwwroot/libs/abp-web-resources/Abp/Framework/scripts/libs/abp.signalr-client.js", + + "wwwroot/libs/jquery-validate/jquery.validate.js", + "wwwroot/libs/jquery-validate/jquery.validate.unobtrusive.js", + "wwwroot/libs/push.js/push.js", + + "wwwroot/js/abp.dataTable.js", + "wwwroot/js/main.js", + "wwwroot/view-resources/Views/Shared/_Layout.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/_Bundles/home-index.min.js", + "inputFiles": [ + "wwwroot/libs/chartjs/dist/Chart.js", + "wwwroot/view-resources/Views/Home/Index.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Tenants/Index.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Tenants/Index.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Users/Index.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Users/Index.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Users/ChangePassword.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Users/ChangePassword.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Roles/Index.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Roles/Index.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Account/Login.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Account/Login.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Account/Register.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Account/Register.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Shared/Components/TenantChange/Default.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Shared/Components/TenantChange/Default.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/Shared/Components/TenantChange/_ChangeModal.min.js", + "inputFiles": [ + "wwwroot/view-resources/Views/Shared/Components/TenantChange/_ChangeModal.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/_Bundles/datatables.ajax.min.js", + "inputFiles": [ + "wwwroot/Common/datatables.ajax.js" + ] + }, + { + "outputFileName": "wwwroot/view-resources/Views/_Bundles/helpers.min.js", + "inputFiles": [ + "wwwroot/Common/helpers.js" + ] + } +] diff --git a/src/SplashPage.Web.Mvc/compilerconfig.json b/src/SplashPage.Web.Mvc/compilerconfig.json new file mode 100644 index 00000000..9ff47aa5 --- /dev/null +++ b/src/SplashPage.Web.Mvc/compilerconfig.json @@ -0,0 +1,14 @@ +[ + { + "outputFile": "wwwroot/view-resources/Views/Account/_Layout.css", + "inputFile": "wwwroot/view-resources/Views/Account/_Layout.scss" + }, + { + "outputFile": "wwwroot/view-resources/Views/Shared/_Layout.css", + "inputFile": "wwwroot/view-resources/Views/Shared/_Layout.scss" + }, + { + "outputFile": "wwwroot/css/style.css", + "inputFile": "wwwroot/scss/style.scss" + } +] diff --git a/src/SplashPage.Web.Mvc/compilerconfig.json.defaults b/src/SplashPage.Web.Mvc/compilerconfig.json.defaults new file mode 100644 index 00000000..c75eb7d5 --- /dev/null +++ b/src/SplashPage.Web.Mvc/compilerconfig.json.defaults @@ -0,0 +1,49 @@ +{ + "compilers": { + "less": { + "autoPrefix": "", + "cssComb": "none", + "ieCompat": true, + "strictMath": false, + "strictUnits": false, + "relativeUrls": true, + "rootPath": "", + "sourceMapRoot": "", + "sourceMapBasePath": "", + "sourceMap": false + }, + "sass": { + "includePath": "", + "indentType": "space", + "indentWidth": 2, + "outputStyle": "nested", + "Precision": 5, + "relativeUrls": true, + "sourceMapRoot": "", + "sourceMap": false + }, + "stylus": { + "sourceMap": false + }, + "babel": { + "sourceMap": false + }, + "coffeescript": { + "bare": false, + "runtimeMode": "node", + "sourceMap": false + } + }, + "minifiers": { + "css": { + "enabled": true, + "termSemicolons": true, + "gzip": false + }, + "javascript": { + "enabled": true, + "termSemicolons": true, + "gzip": false + } + } +} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/libman.json b/src/SplashPage.Web.Mvc/libman.json new file mode 100644 index 00000000..85032c35 --- /dev/null +++ b/src/SplashPage.Web.Mvc/libman.json @@ -0,0 +1,190 @@ +{ + "defaultProvider": "cdnjs", + "version": "1.0", + "libraries": [ + //core libs start + { + "library": "jquery@3.4.1", + "destination": "wwwroot/libs/jquery", + "files": [ + "jquery.js", + "jquery.min.js", + "jquery.min.map" + ] + }, + //core libs end + + //abp libs start + { + "library": "abp-web-resources@6.0.0", + "provider": "jsdelivr", + "destination": "wwwroot/libs/abp-web-resources" + }, + { + "library": "jquery.blockUI@2.70", + "destination": "wwwroot/libs/block-ui" + }, + { + "library": "sweetalert@2.1.2", + "destination": "wwwroot/libs/sweetalert" + }, + { + "library": "spin.js@2.3.2", + "destination": "wwwroot/libs/spin" + }, + { + "library": "toastr.js@2.1.4", + "destination": "wwwroot/libs/toastr" + }, + { + "library": "moment.js@2.24.0", + "destination": "wwwroot/libs/moment" + }, + { + "library": "moment-timezone@0.5.23", + "destination": "wwwroot/libs/moment-timezone" + }, + { + "library": "signalr.js@2.4.0", + "destination": "wwwroot/libs/signalr" + }, + { + "library": "@aspnet/signalr@1.0.0", + "provider": "jsdelivr", + "destination": "wwwroot/libs/signalr", + "files": [ + "dist/browser/signalr.js", + "dist/browser/signalr.js.map" + ] + }, + //abp libs end + + //admin-lte libs start + { + "library": "admin-lte@3.1.0", + "provider": "jsdelivr", + "destination": "wwwroot/libs/admin-lte", + "files": [ + "dist/js/adminlte.js", + "dist/js/adminlte.js.map", + "dist/js/adminlte.min.js", + "dist/js/adminlte.min.js.map", + "dist/css/adminlte.css", + "dist/css/adminlte.css.map", + "dist/css/adminlte.min.css", + "dist/css/adminlte.min.css.map", + "dist/img/avatar5.png" + ] + }, + { + "library": "bootstrap@4.6.0", + "provider": "jsdelivr", + "destination": "wwwroot/libs/bootstrap", + "files": [ + "dist/js/bootstrap.bundle.js", + "dist/js/bootstrap.bundle.min.js", + "dist/js/bootstrap.bundle.js.map", + "dist/js/bootstrap.bundle.min.js.map" + ] + }, + { + "library": "@fortawesome/fontawesome-free@5.15.3", + "provider": "jsdelivr", + "destination": "wwwroot/libs/font-awesome" + }, + { + "library": "icheck-bootstrap@3.0.1", + "provider": "jsdelivr", + "destination": "wwwroot/libs/icheck-bootstrap", + "files": [ + "icheck-bootstrap.css", + "icheck-bootstrap.min.css" + ] + }, + { + "library": "datatables.net@1.10.24", + "provider": "jsdelivr", + "destination": "wwwroot/libs/datatables", + "files": [ + "js/jquery.dataTables.js", + "js/jquery.dataTables.min.js" + ] + }, + { + "library": "datatables.net-bs4@1.10.24", + "provider": "jsdelivr", + "destination": "wwwroot/libs/datatables", + "files": [ + "css/dataTables.bootstrap4.css", + "css/dataTables.bootstrap4.min.css", + "js/dataTables.bootstrap4.js", + "js/dataTables.bootstrap4.min.js" + ] + }, + { + "library": "datatables.net-responsive@2.2.7", + "provider": "jsdelivr", + "destination": "wwwroot/libs/datatables", + "files": [ + "js/dataTables.responsive.js", + "js/dataTables.responsive.min.js" + ] + }, + { + "library": "datatables.net-responsive-bs4@2.2.7", + "provider": "jsdelivr", + "destination": "wwwroot/libs/datatables", + "files": [ + "css/responsive.bootstrap4.css", + "css/responsive.bootstrap4.min.css", + "js/responsive.bootstrap4.js", + "js/responsive.bootstrap4.min.js" + ] + }, + { + "library": "datatables.net-buttons@1.7.0", + "provider": "jsdelivr", + "destination": "wwwroot/libs/datatables", + "files": [ + "js/dataTables.buttons.js", + "js/dataTables.buttons.min.js" + ] + }, + { + "library": "datatables.net-buttons-bs4@1.7.0", + "provider": "jsdelivr", + "destination": "wwwroot/libs/datatables", + "files": [ + "css/buttons.bootstrap4.css", + "css/buttons.bootstrap4.min.css", + "js/buttons.bootstrap4.js", + "js/buttons.bootstrap4.min.js" + ] + }, + { + "library": "chart.js@2.9.4", + "provider": "jsdelivr", + "destination": "wwwroot/libs/chartjs", + "files": [ + "dist/Chart.css", + "dist/Chart.js" + ] + }, + //admin-lte libs end + + //other libs start + { + "library": "jquery-validate@1.19.1", + "destination": "wwwroot/libs/jquery-validate" + }, + { + "library": "jquery-validation-unobtrusive@3.2.11", + "destination": "wwwroot/libs/jquery-validate" + }, + { + "library": "push.js@1.0.12", + "destination": "wwwroot/libs/push.js" + } + //other libs end + ] +} diff --git a/src/SplashPage.Web.Mvc/log4net.Production.config b/src/SplashPage.Web.Mvc/log4net.Production.config new file mode 100644 index 00000000..01ac57e0 --- /dev/null +++ b/src/SplashPage.Web.Mvc/log4net.Production.config @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/log4net.config b/src/SplashPage.Web.Mvc/log4net.config new file mode 100644 index 00000000..549d1a50 --- /dev/null +++ b/src/SplashPage.Web.Mvc/log4net.config @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/wwwroot/Common/datatables.ajax.js b/src/SplashPage.Web.Mvc/wwwroot/Common/datatables.ajax.js new file mode 100644 index 00000000..63474d1c --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/Common/datatables.ajax.js @@ -0,0 +1,100 @@ +/************************************************************************ + * Ajax extension for datatables * + *************************************************************************/ +(function ($) { + if (!$.fn.dataTableExt) { + return; + } + + var doAjax = function (listAction, requestData, callbackFunction, settings) { + var inputFilter = {}; + + //set table defined filters + if (listAction.inputFilter) { + inputFilter = $.extend(inputFilter, listAction.inputFilter()); + } + + //set paging filters + if (settings.oInit.paging) { + inputFilter = $.extend(inputFilter, { + maxResultCount: requestData.length, + skipCount: requestData.start, + }); + } + + //set sorting filter + if (requestData.order && requestData.order.length > 0) { + if (!inputFilter.sorting) { + inputFilter.sorting = ''; + } + + for (var i = 0; i < requestData.order.length; i++) { + var orderingField = requestData.order[i]; + if (i > 0) { + inputFilter.sorting += ','; + } + if (requestData.columns[orderingField.column].name) { + inputFilter.sorting += requestData.columns[orderingField.column].name + ' ' + orderingField.dir; + } else if (requestData.columns[orderingField.column].data) { + inputFilter.sorting += requestData.columns[orderingField.column].data + ' ' + orderingField.dir; + } + } + } + + //execute ajax function with filter + if (listAction.ajaxFunction) { + listAction + .ajaxFunction(inputFilter) + .done(function (result) { + //store raw server response for custom rendering. + settings.rawServerResponse = result; + + //html encoding can be disabled by adding "disableResponseHtmlEncoding: true" to "listAction" field + var dataItems; + if (listAction.disableResponseHtmlEncoding) { + dataItems = result.items; + } else { + //HTML encodes the response items for XSS protection. + dataItems = app.htmlUtils.htmlEncodeJson(result.items); + } + + //invoke callback + callbackFunction({ + recordsTotal: result.totalCount, + recordsFiltered: result.totalCount, + data: dataItems, + }); + }) + .always(function () { + abp.ui.clearBusy(settings.nTable); + }); + } + }; + + if (!$.fn.dataTable) { + return; + } + + $.extend(true, $.fn.dataTable.defaults, { + ajax: function (requestData, callbackFunction, settings) { + if (!settings) { + return; + } + + if (!settings.oInit) { + return; + } + + if (!settings.oInit.listAction) { + return; + } + + doAjax(settings.oInit.listAction, requestData, callbackFunction, settings); + }, + }); + + $.fn.dataTable.Api.register('ajax.reloadPage()', function () { + // user paging is not reset on reload. https://datatables.net/reference/api/ajax.reload() + this.ajax.reload(null, false); + }); +})(jQuery); \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/wwwroot/Common/helpers.js b/src/SplashPage.Web.Mvc/wwwroot/Common/helpers.js new file mode 100644 index 00000000..000a5ac6 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/Common/helpers.js @@ -0,0 +1,20 @@ +var app = app || {}; +(function () { + app.htmlUtils = { + htmlEncodeText: function (value) { + return $("
    ").text(value).html(); + }, + + htmlDecodeText: function (value) { + return $("
    ").html(value).text(); + }, + + htmlEncodeJson: function (jsonObject) { + return JSON.parse(app.htmlUtils.htmlEncodeText(JSON.stringify(jsonObject))); + }, + + htmlDecodeJson: function (jsonObject) { + return JSON.parse(app.htmlUtils.htmlDecodeText(JSON.stringify(jsonObject))); + } + }; +})(); \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/wwwroot/css/style.css b/src/SplashPage.Web.Mvc/wwwroot/css/style.css new file mode 100644 index 00000000..e6329b14 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/css/style.css @@ -0,0 +1,31 @@ +/* prevent the drop down icon going onto a new line for the top bar language link */ +.top-bar-language-nav-link { + min-width: 65px; +} + +/* bootstrap model showing two scroll bars */ +html { + overflow: visible; +} + +/* main sidebar not under model */ +.modal { + z-index: 1110; +} + +.form-group.required .col-form-label:after { + color: #d00; + content: "*"; + position: absolute; + margin-left: 3px; +} + +.nav-user-menu .user-image { + width: 20px; + margin-right: 4px; + margin-top: -4px; +} + +.famfamfam-flags { + display: inline-block; +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/css/style.min.css b/src/SplashPage.Web.Mvc/wwwroot/css/style.min.css new file mode 100644 index 00000000..d8bfb170 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/css/style.min.css @@ -0,0 +1 @@ +.top-bar-language-nav-link{min-width:65px;}html{overflow:visible;}.modal{z-index:1110;}.form-group.required .col-form-label:after{color:#d00;content:"*";position:absolute;margin-left:3px;}.nav-user-menu .user-image{width:20px;margin-right:4px;margin-top:-4px;} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/wwwroot/img/favicon.ico b/src/SplashPage.Web.Mvc/wwwroot/img/favicon.ico new file mode 100644 index 00000000..75a2aa12 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/img/favicon.ico differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/img/logo.png b/src/SplashPage.Web.Mvc/wwwroot/img/logo.png new file mode 100644 index 00000000..c9b0fc88 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/img/logo.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/js/abp.dataTable.js b/src/SplashPage.Web.Mvc/wwwroot/js/abp.dataTable.js new file mode 100644 index 00000000..22cc96f3 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/js/abp.dataTable.js @@ -0,0 +1,52 @@ +var abp = abp || {}; +(function () { + if (!$.fn.dataTable) { + return; + } + + abp.libs = abp.libs || {}; + var l = abp.localization.getSource("SplashPage"); + + var language = { + emptyTable: "No data available in table", + info: "_START_-_END_ of _TOTAL_ items", + infoEmpty: "No records", + infoFiltered: "(filtered from _MAX_ total entries)", + infoPostFix: "", + infoThousands: ",", + lengthMenu: "Show _MENU_ entries", + loadingRecords: "Loading...", + processing: '', + search: "Search:", + zeroRecords: "No matching records found", + paginate: { + first: '', + last: '', + next: '', + previous: '' + }, + aria: { + sortAscending: ": activate to sort column ascending", + sortDescending: ": activate to sort column descending" + } + }; + + $.extend(true, $.fn.dataTable.defaults, { + searching: false, + ordering: true, + language: language, + processing: true, + autoWidth: false, + responsive: true, + dom: [ + "<'row'<'col-md-12'f>>", + "<'row'<'col-md-12't>>", + "<'row mt-2'", + "<'col-lg-1 col-xs-12'<'float-left text-center data-tables-refresh'B>>", + "<'col-lg-3 col-xs-12'<'float-left text-center'i>>", + "<'col-lg-3 col-xs-12'<'text-center'l>>", + "<'col-lg-5 col-xs-12'<'float-right'p>>", + ">" + ].join('') + }); +})(); diff --git a/src/SplashPage.Web.Mvc/wwwroot/js/main.js b/src/SplashPage.Web.Mvc/wwwroot/js/main.js new file mode 100644 index 00000000..eb93d13b --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/js/main.js @@ -0,0 +1,133 @@ +(function ($) { + //Notification handler + abp.event.on('abp.notifications.received', function (userNotification) { + abp.notifications.showUiNotifyForUserNotification(userNotification); + + //Desktop notification + Push.create("SplashPage", { + body: userNotification.notification.data.message, + icon: abp.appPath + 'img/logo.png', + timeout: 6000, + onClick: function () { + window.focus(); + this.close(); + } + }); + }); + + //serializeFormToObject plugin for jQuery + $.fn.serializeFormToObject = function (camelCased = false) { + //serialize to array + var data = $(this).serializeArray(); + + //add also disabled items + $(':disabled[name]', this).each(function () { + data.push({ name: this.name, value: $(this).val() }); + }); + + //map to object + var obj = {}; + data.map(function (x) { obj[x.name] = x.value; }); + + if (camelCased && camelCased === true) { + return convertToCamelCasedObject(obj); + } + + return obj; + }; + + //Configure blockUI + if ($.blockUI) { + $.blockUI.defaults.baseZ = 2000; + } + + //Configure validator + $.validator.setDefaults({ + highlight: (el) => { + $(el).addClass('is-invalid'); + }, + unhighlight: (el) => { + $(el).removeClass('is-invalid'); + }, + errorElement: 'p', + errorClass: 'text-danger', + errorPlacement: (error, element) => { + if (element.parent('.input-group').length) { + error.insertAfter(element.parent()); + } else { + error.insertAfter(element); + } + } + }); + + function convertToCamelCasedObject(obj) { + var newObj, origKey, newKey, value; + if (obj instanceof Array) { + return obj.map(value => { + if (typeof value === 'object') { + value = convertToCamelCasedObject(value); + } + return value; + }); + } else { + newObj = {}; + for (origKey in obj) { + if (obj.hasOwnProperty(origKey)) { + newKey = ( + origKey.charAt(0).toLowerCase() + origKey.slice(1) || origKey + ).toString(); + value = obj[origKey]; + if ( + value instanceof Array || + (value !== null && value.constructor === Object) + ) { + value = convertToCamelCasedObject(value); + } + newObj[newKey] = value; + } + } + } + return newObj; + } + + function initAdvSearch() { + $('.abp-advanced-search').each((i, obj) => { + var $advSearch = $(obj); + setAdvSearchDropdownMenuWidth($advSearch); + setAdvSearchStopingPropagations($advSearch); + }); + } + + initAdvSearch(); + + $(window).resize(() => { + clearTimeout(window.resizingFinished); + window.resizingFinished = setTimeout(() => { + initAdvSearch(); + }, 500); + }); + + function setAdvSearchDropdownMenuWidth($advSearch) { + var advSearchWidth = 0; + $advSearch.each((i, obj) => { + advSearchWidth += parseInt($(obj).width(), 10); + }); + $advSearch.find('.dropdown-menu').width(advSearchWidth) + } + + function setAdvSearchStopingPropagations($advSearch) { + $advSearch.find('.dd-menu, .btn-search, .txt-search') + .on('click', (e) => { + e.stopPropagation(); + }); + } + + $.fn.clearForm = function () { + var $this = $(this); + $this.validate().resetForm(); + $('[name]', $this).each((i, obj) => { + $(obj).removeClass('is-invalid'); + }); + $this[0].reset(); + }; +})(jQuery); diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/CHANGELOG.md b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/CHANGELOG.md new file mode 100644 index 00000000..38422f5f --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/CHANGELOG.md @@ -0,0 +1,146 @@ +## Change Log + +### 0.5.1 (2016/02/15 09:42 +00:00) +- [37efc40](https://github.com/legacy-icons/famfamfam-flags/commit/37efc40be0563d2bb1be65e6ee6ef3a5a10e499d) chore: v0.5.1 (@t1st3) +- [#20](https://github.com/legacy-icons/famfamfam-flags/pull/20) chore(package): update gulp-cssnano to version 2.1.1 (@t1st3) +- [ba06931](https://github.com/legacy-icons/famfamfam-flags/commit/ba06931a869f1823368c0bd8795cc5c943776d89) chore(package): update gulp-cssnano to version 2.1.1 (@greenkeeperio-bot) +- [#19](https://github.com/legacy-icons/famfamfam-flags/pull/19) chore(package): update gulp to version 3.9.1 (@t1st3) +- [ebee8b3](https://github.com/legacy-icons/famfamfam-flags/commit/ebee8b3fca3d899cde7bb47fb47efd51afa6b3ab) chore(package): update gulp to version 3.9.1 (@greenkeeperio-bot) +- [e63239d](https://github.com/legacy-icons/famfamfam-flags/commit/e63239d271ff8cafceba660c36a68dec1835efc6) docs: update REDAME structure (@t1st3) +- [91a8b55](https://github.com/legacy-icons/famfamfam-flags/commit/91a8b55a64f188add081d67ca7f059f705c87dee) docs: update REDAME structure (@t1st3) +- [e83179a](https://github.com/legacy-icons/famfamfam-flags/commit/e83179ac6962aa6675b30c83783ba15319bc0042) docs: update REDAME structure (@t1st3) +- [e4725cf](https://github.com/legacy-icons/famfamfam-flags/commit/e4725cf64785faef310a2e10e08b0b8cae2e5a17) docs: explain dev-deps install for NPM 3 (@t1st3) +- [adbaa7e](https://github.com/legacy-icons/famfamfam-flags/commit/adbaa7e42bb41a61b91c926b474172119b7a9849) chore: renamed T1st3 to t1st3 (@t1st3) +- [b2f2dd1](https://github.com/legacy-icons/famfamfam-flags/commit/b2f2dd1006d744ef8755c30eb2529e2c36bcdfd5) chore: renamed T1st3 to t1st3 (@t1st3) +- [7e0defd](https://github.com/legacy-icons/famfamfam-flags/commit/7e0defd471467e74478af84ceef62cbbb98fbccf) chore: travis.yml indentation (@t1st3) + +### 0.5.0 (2016/01/19 13:39 +00:00) +- [6e46357](https://github.com/legacy-icons/famfamfam-flags/commit/6e46357c5047251c629712619536a0db86e0704a) chore: update changelog (@t1st3) +- [1b856d2](https://github.com/legacy-icons/famfamfam-flags/commit/1b856d20da3c2b891130560ffc3427eecdd1384f) chore: v0.5.0 (@t1st3) +- [323a768](https://github.com/legacy-icons/famfamfam-flags/commit/323a7686b4346ee5258b2bbad71bc7ce3f4fae0c) chore: update deps versions with caret ranges (@t1st3) +- [c2b8b05](https://github.com/legacy-icons/famfamfam-flags/commit/c2b8b05c3bfba72d5ca8dab1e697262c0de85c17) chore: replace gulp-minify-css with gulp-cssnano (@t1st3) +- [ececd5e](https://github.com/legacy-icons/famfamfam-flags/commit/ececd5e3a1dbaa2db3b95b4270c51b83b988157e) docs: add license docs for JE icon (@t1st3) +- [de5d968](https://github.com/legacy-icons/famfamfam-flags/commit/de5d968c19e02b5708c0efb46cba017c9c721965) chore: add @ before Github usernames (@t1st3) +- [b2ce7cf](https://github.com/legacy-icons/famfamfam-flags/commit/b2ce7cfbbaf20ca5450e3b9cb3f37ffb5762dca0) docs: add documentation for aliases in README (@t1st3) +- [d6c7231](https://github.com/legacy-icons/famfamfam-flags/commit/d6c723189277ca4c0c6642e0f5af503ca8f47a6c) chore: update changelog (@t1st3) +- [4b872e4](https://github.com/legacy-icons/famfamfam-flags/commit/4b872e43071bbace63a545be3300d6fbc775349f) chore: rebuild with new aliases (@t1st3) +- [e067fe5](https://github.com/legacy-icons/famfamfam-flags/commit/e067fe5c3aa49aff5533478193642fd3aad3a772) fix: add aliases for RE, YT and GP to FR (@t1st3) +- [72fb1c6](https://github.com/legacy-icons/famfamfam-flags/commit/72fb1c602a276ce39e10fa75a79f6bb07d5e21e4) fix: remove BL alias (@t1st3) +- [b7975c8](https://github.com/legacy-icons/famfamfam-flags/commit/b7975c800a52138269d5eeabc08a6680124b0841) chore: update changelog (@t1st3) +- [a2afcdd](https://github.com/legacy-icons/famfamfam-flags/commit/a2afcdd595120e130999fbcdc194ca3f06ebe61d) chore: remove figlets, cowsays and notifications (@t1st3) +- [#16](https://github.com/legacy-icons/famfamfam-flags/pull/16) Add mechanism for aliases, use for `BQ`, `BL` & `MF` codes (@Rangoo94) +- [be74af7](https://github.com/legacy-icons/famfamfam-flags/commit/be74af77b06f289093c9f553d0bd80b956ad1520) Add mechanism for aliases, use for `BQ`, `BL` & `MF` codes (@Rangoo94) +- [#12](https://github.com/legacy-icons/famfamfam-flags/pull/12) Rename Jersey flag from `jersey` to `je` (@Rangoo94) +- [50e0d97](https://github.com/legacy-icons/famfamfam-flags/commit/50e0d9743cd0aee569abf033756e918f84b51136) docs: add lucas34 in License for Myanmar flag (@t1st3) +- [#11](https://github.com/legacy-icons/famfamfam-flags/pull/11) Add information about ImageMagick as dependency (@Rangoo94) +- [d5e68f5](https://github.com/legacy-icons/famfamfam-flags/commit/d5e68f5dd2d44f4cf7d8d303731282b9098bd046) Rename Jersey flag from `jersey` to `je` (@Rangoo94) +- [feb1182](https://github.com/legacy-icons/famfamfam-flags/commit/feb1182c625a4e5751c2fca1002f15c52e739f3b) Add information about ImageMagick as dependency (@Rangoo94) +- [195cacf](https://github.com/legacy-icons/famfamfam-flags/commit/195cacf0b406841c465d7ed14d92229c054b2834) chore: add newline at end of config and .md files (@t1st3) +- [439a811](https://github.com/legacy-icons/famfamfam-flags/commit/439a8119669048fa04692d0d2f28bab28ebdafdf) docs: move licenses from README to LICENSE.md (@t1st3) +- [#7](https://github.com/legacy-icons/famfamfam-flags/pull/7) chore(package): update gulp-minify-css to version 1.2.3 (@T1st3) +- [144935d](https://github.com/legacy-icons/famfamfam-flags/commit/144935d3845baa3dec0e2c84f75e02af48368ea3) docs: add CHANGELOG.md (@t1st3) +- [529b03b](https://github.com/legacy-icons/famfamfam-flags/commit/529b03bec32a7916ae819c812dd7b40cd2ba83e7) chore(package): update gulp-minify-css to version 1.2.3 (@greenkeeperio-bot) + +### 0.4.1 (2015/12/22 13:03 +00:00) +- [acd82de](https://github.com/legacy-icons/famfamfam-flags/commit/acd82de268068bbf932d62459125e201d1f8c873) chore: v0.4.1 (@t1st3) +- [854cb96](https://github.com/legacy-icons/famfamfam-flags/commit/854cb96fab33a50fa59c146c29e34289a59670b9) feat: add MyGet deployment files and support for NuGet (@t1st3) +- [#6](https://github.com/legacy-icons/famfamfam-flags/pull/6) Update all dependencies 🌴 (@T1st3) +- [565d94d](https://github.com/legacy-icons/famfamfam-flags/commit/565d94d245ffeff9bc62a8be0e3eb2deca5f775f) chore(package): update dependencies (@greenkeeperio-bot) +- [ad56ea1](https://github.com/legacy-icons/famfamfam-flags/commit/ad56ea1aecbd6499b1be71d20690021869c674b0) chore: fix build task (@t1st3) + +### 0.4.0 (2015/10/20 11:04 +00:00) +- [f686b9c](https://github.com/legacy-icons/famfamfam-flags/commit/f686b9c7a3f6d8be6b29385257a073a4613f4bf1) chore: v0.4.0 (@t1st3) +- [37783a2](https://github.com/legacy-icons/famfamfam-flags/commit/37783a264c74974cf76d3d140387c286976bffbe) feat: add jersey.png (@t1st3) +- [10037bc](https://github.com/legacy-icons/famfamfam-flags/commit/10037bc550d3ba9ed3ce69cc39a39d88df3163f0) chore: update NPM deps (del) (@t1st3) +- [0f69eb4](https://github.com/legacy-icons/famfamfam-flags/commit/0f69eb41127e0840b06d2f4b8f70bfb636834d64) chore: update.travis.yml to use Travis container-based infra (@t1st3) +- [fd8d78f](https://github.com/legacy-icons/famfamfam-flags/commit/fd8d78fae3fca628c913a95a1bceb5dead85e3aa) docs: fix wrong links from previous commit (@t1st3) +- [5f818f5](https://github.com/legacy-icons/famfamfam-flags/commit/5f818f5938756ce6f35769475a8a9b34af09c459) docs: update README (@t1st3) + +### 0.3.5 (2015/08/17 13:30 +00:00) +- [223e6d8](https://github.com/legacy-icons/famfamfam-flags/commit/223e6d81cd29bf9cc2ea63a65b8e6a6ac5e11762) chore: v0.3.5 (@t1st3) +- [d282c71](https://github.com/legacy-icons/famfamfam-flags/commit/d282c71f81535c67e2034fa58b30fd107a1c60ae) fix: update mm flag (Myanmar) (@t1st3) +- [#3](https://github.com/legacy-icons/famfamfam-flags/pull/3) Fix Myanmar flag (@lucas34) +- [2fc45e2](https://github.com/legacy-icons/famfamfam-flags/commit/2fc45e2a7791571a9537a25e0174490ce1f4f592) Fix Myanmar flag (@lucas34) + +### 0.3.4 (2015/07/28 00:53 +00:00) +- [668fbbf](https://github.com/legacy-icons/famfamfam-flags/commit/668fbbf90ffa7d3775652b3e1042211045695525) chore: v0.3.4 (@t1st3) +- [a293305](https://github.com/legacy-icons/famfamfam-flags/commit/a293305f30e19a86f884ac428f0a5c9f85010089) chore: update npm deps (@t1st3) +- [d5d5e80](https://github.com/legacy-icons/famfamfam-flags/commit/d5d5e8074184362e73e21aad6530510f6ac6b7e0) chore: update npm dev-deps (@t1st3) +- [99c6db7](https://github.com/legacy-icons/famfamfam-flags/commit/99c6db718ee8a4c0866bd1258f8058066816b68b) docs: update README (@t1st3) +- [9a376ba](https://github.com/legacy-icons/famfamfam-flags/commit/9a376ba010a53dd2782c495beb2d459cd222d9c7) docs: update README (@t1st3) +- [f4460f3](https://github.com/legacy-icons/famfamfam-flags/commit/f4460f3aac00003602ffbf50362a62fda268c0f4) docs: update README (@t1st3) +- [b817d0e](https://github.com/legacy-icons/famfamfam-flags/commit/b817d0e5a4f38e1c00f3c69bdd473b9e2b88b25c) docs: update README (@t1st3) +- [0828d06](https://github.com/legacy-icons/famfamfam-flags/commit/0828d067906a88f5864de8384e0bc5ea8b3e5ba3) docs: fix Silk-Companion URL in README (@t1st3) +- [d898f82](https://github.com/legacy-icons/famfamfam-flags/commit/d898f8207143842c8342e7c94c9329beb6fb7b84) docs: fix Silk-Companion URL in README (@t1st3) +- [fc7c9c7](https://github.com/legacy-icons/famfamfam-flags/commit/fc7c9c7fc197cdd880de6929b247fd0db6c563ae) chore: update bower ignores (@t1st3) + +### 0.3.3 (2015/03/22 15:04 +00:00) +- [d0a195c](https://github.com/legacy-icons/famfamfam-flags/commit/d0a195c11ef11ea9db336db1c0a8771273965f93) chore: v0.3.3 (@t1st3) +- [6a674a6](https://github.com/legacy-icons/famfamfam-flags/commit/6a674a61d801ed0f9858cc0ae6fb19e7d933f47b) docs: include spritesheet to README (@t1st3) +- [a7cd08c](https://github.com/legacy-icons/famfamfam-flags/commit/a7cd08c2bc8c839eb8631a599b9c5eb2e1a92e41) feat: add gg flag, from Silk Companion (@t1st3) +- [be4ca90](https://github.com/legacy-icons/famfamfam-flags/commit/be4ca908a096597bfedf6ec6dbc842f50c3140d9) docs: add build badge in README (@t1st3) +- [5e488d3](https://github.com/legacy-icons/famfamfam-flags/commit/5e488d3a4a17292926b40e478655c326fa64553b) docs: add dependency badge in README (@t1st3) + +### 0.3.2 (2015/03/19 16:23 +00:00) +- [a07266a](https://github.com/legacy-icons/famfamfam-flags/commit/a07266afe668343b1aec5f01708d88e897a64555) chore: v0.3.2 (@t1st3) +- [bed4c6e](https://github.com/legacy-icons/famfamfam-flags/commit/bed4c6e8d42fead2e21b3c385d5203638ad2e331) docs: update mention to spritesheets in README (@t1st3) +- [1f01166](https://github.com/legacy-icons/famfamfam-flags/commit/1f011662428a0fa9ed09863fdab3f582f71a2a59) docs: update mention to spritesheets in README (@t1st3) +- [95f448e](https://github.com/legacy-icons/famfamfam-flags/commit/95f448e7f3f8296fc002556168dccce8d4dcd248) docs: update mention to spritesheets in README (@t1st3) +- [3343f3a](https://github.com/legacy-icons/famfamfam-flags/commit/3343f3af7a6f6da3970e63200a46afd2c9111637) docs: add mention to spritesheet in README (@t1st3) + +### 0.3.1 (2015/03/18 17:51 +00:00) +- [a5ac872](https://github.com/legacy-icons/famfamfam-flags/commit/a5ac872b959189dbe1feb2ce928fd021f46692c9) chore: v0.3.1 (@t1st3) +- [c815ede](https://github.com/legacy-icons/famfamfam-flags/commit/c815ede2c181923f847bb042e8417717ab111c5e) fix: update travis.yml to fix CI error (@t1st3) + +### 0.3.0 (2015/03/18 16:39 +00:00) +- [48dd346](https://github.com/legacy-icons/famfamfam-flags/commit/48dd3461211d49a1634c1367e4c15fb46731daeb) chore: v0.3.0 (@t1st3) +- [e5187ac](https://github.com/legacy-icons/famfamfam-flags/commit/e5187ac8a3a2d62b5638f8c34e9e9e37ce83f02d) feat: build with imagemin, add spritesheet (@t1st3) +- [3f185e1](https://github.com/legacy-icons/famfamfam-flags/commit/3f185e14f4c8241eb1d53f4167f7d39f300742b8) chore: add imagemin and spritesheet as dev deps (@t1st3) +- [e53d76d](https://github.com/legacy-icons/famfamfam-flags/commit/e53d76db2bc72cf5216704e5dfe7fd7c588e093a) chore: add icons to README (@t1st3) +- [0505d10](https://github.com/legacy-icons/famfamfam-flags/commit/0505d10380a9897c07a5c5cbd97646f450c2c233) chore: add icons to README (@t1st3) +- [81df1a4](https://github.com/legacy-icons/famfamfam-flags/commit/81df1a40865a22993c742a4498218821d41328e4) chore: add icons to README (@t1st3) +- [762f1f0](https://github.com/legacy-icons/famfamfam-flags/commit/762f1f0049566403c4453bb167b1bf4c6ac94232) chore: add icons to README (@t1st3) +- [d089ed6](https://github.com/legacy-icons/famfamfam-flags/commit/d089ed6e5ce2f6eddacdb5b90d9d6add910a33b7) chore: add icons to README (@t1st3) +- [17f4d12](https://github.com/legacy-icons/famfamfam-flags/commit/17f4d121901f3f2e47e263429be26aff8906c152) feat: add NPM deps and a 1st gulp task: gulp info (@t1st3) +- [1af7abc](https://github.com/legacy-icons/famfamfam-flags/commit/1af7abc00030e7c92e49fb2c9f1ea136f815ebb0) chore: update .npmignore to exclude composer files (@t1st3) + +### 0.2.4 (2015/03/10 21:40 +00:00) +- [ca959d7](https://github.com/legacy-icons/famfamfam-flags/commit/ca959d7fd51da851c6bf266e94bee164ae2ce400) chore: v0.2.4 (@t1st3) +- [e69d3f7](https://github.com/legacy-icons/famfamfam-flags/commit/e69d3f7470d5143e67fe7287b8acd6007b157917) chore: update package.json files (@t1st3) + +### 0.2.3 (2015/03/10 21:18 +00:00) +- [1d80637](https://github.com/legacy-icons/famfamfam-flags/commit/1d80637f6191ecbedb5142cfac6727504f8c9832) chore: v0.2.3 (@t1st3) +- [c11ed44](https://github.com/legacy-icons/famfamfam-flags/commit/c11ed4446bed139620a51f9efdcf03bb58908734) chore: update package.json files (@t1st3) +- [02a769e](https://github.com/legacy-icons/famfamfam-flags/commit/02a769eacb7d1c4f4fa7361a8d6f5ffff816eb72) chore: update package.json files (@t1st3) +- [8baa44f](https://github.com/legacy-icons/famfamfam-flags/commit/8baa44f326f96a150a0228d43b25e10575f9c6aa) chore: update package.json files (@t1st3) +- [435a3fe](https://github.com/legacy-icons/famfamfam-flags/commit/435a3fe2077bee4887a2eaae3338b349c2d16caa) chore: update bower.json ignores (@t1st3) + +### 0.2.2 (2015/03/10 06:45 +00:00) +- [5e38b80](https://github.com/legacy-icons/famfamfam-flags/commit/5e38b80390e44c194cb103a92c0e275e8d96f959) chore: v0.2.2 (@t1st3) +- [1b16fd9](https://github.com/legacy-icons/famfamfam-flags/commit/1b16fd9f79802c6940202a26ac97473698a7f9e6) feat: add auto-deploy on Travis (@t1st3) + +### 0.2.1 (2015/03/10 01:58 +00:00) +- [cf1cfa7](https://github.com/legacy-icons/famfamfam-flags/commit/cf1cfa71cd533b62dc90e0168fba09d893b3a884) chore: v0.2.1 (@t1st3) +- [8973495](https://github.com/legacy-icons/famfamfam-flags/commit/8973495d7dd03dd7481ab305d31f09f8d627f9be) fix: remove version from composer.json (@t1st3) +- [0aa8f21](https://github.com/legacy-icons/famfamfam-flags/commit/0aa8f217d83f390e76893bad30abc38573d4bad6) fix: edit package name in README (@t1st3) + +### 0.2.0 (2015/03/10 01:50 +00:00) +- [3b4dd34](https://github.com/legacy-icons/famfamfam-flags/commit/3b4dd34598bc620f266d7f409479b342100bae83) chore: change owner from kwipi to t1st3; bump to v0.2.0 (@t1st3) +- [#1](https://github.com/legacy-icons/famfamfam-flags/pull/1) Added composer "component" syntax (@tagme) +- [6ab6a93](https://github.com/legacy-icons/famfamfam-flags/commit/6ab6a9309417824da9b2139a5d6668d1f5a5e0f8) Version information is not needed for composer/packagist to work. Using tags instead (@vworldat) +- [19ba451](https://github.com/legacy-icons/famfamfam-flags/commit/19ba451d11f945336ae609e5ac33e42bedad9bfd) Added composer "component" syntax (@vworldat) + +### 0.1.1 (2014/02/27 21:42 +00:00) +- [bea3a8c](https://github.com/legacy-icons/famfamfam-flags/commit/bea3a8cefad5062b59d59f0603f37366ecbd032d) Bump to 0.1.1 (@t1st3) +- [e556b09](https://github.com/legacy-icons/famfamfam-flags/commit/e556b0959d7b2a5db37bded2299dfa0459e174b1) bump to 0.1.1 (@jonrandoem) +- [c11959d](https://github.com/legacy-icons/famfamfam-flags/commit/c11959def0f7399898bdcb8b959b51db2e99cdca) Update readme (@jonrandoem) +- [c00e061](https://github.com/legacy-icons/famfamfam-flags/commit/c00e061f30c9d4d4ee17924a7b529b413dbfe3bb) Add composer.json (@jonrandoem) +- [acc4f83](https://github.com/legacy-icons/famfamfam-flags/commit/acc4f83383b59204cc4f66bd9212179a86f6c845) Update README (@t1st3) +- [182b3b8](https://github.com/legacy-icons/famfamfam-flags/commit/182b3b827d043459a2ea712ea55c29cf33a6d0ba) Update README (@t1st3) +- [832d8b6](https://github.com/legacy-icons/famfamfam-flags/commit/832d8b66c7f529653750512795536c322d470d4c) Add bower.json (@t1st3) +- [6bd6976](https://github.com/legacy-icons/famfamfam-flags/commit/6bd697627e6fa8cd1b27bc1029e4eabb51c6806f) Add bowerrc (@t1st3) +- [1898009](https://github.com/legacy-icons/famfamfam-flags/commit/1898009583b4370abae82ac558b44878a53b4920) Add .gitignore (@t1st3) +- [17501cd](https://github.com/legacy-icons/famfamfam-flags/commit/17501cdd185cb4c3851993339c08f579c3823bd8) Add package.json (@t1st3) +- [ddbc530](https://github.com/legacy-icons/famfamfam-flags/commit/ddbc530fe377318a844fd63762d69dbd009a31b6) Add README (@t1st3) +- [3a57e23](https://github.com/legacy-icons/famfamfam-flags/commit/3a57e234df13b4ddecb579bacf83d9501da877ad) Add icons (@t1st3) +- [d80056d](https://github.com/legacy-icons/famfamfam-flags/commit/d80056da422b5117065fe3a4c8443062875c6548) Initial commit (@t1st3) \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/LICENSE.md b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/LICENSE.md new file mode 100644 index 00000000..27c6f125 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/LICENSE.md @@ -0,0 +1,83 @@ + +License of original icon set +---------- + +Flag icons - [http://www.famfamfam.com](http://www.famfamfam.com) + +These icons are public domain, and as such are free for any use (attribution appreciated but not required). + +Note that these flags are named using the ISO3166-1 alpha-2 country codes where appropriate. +A list of codes can be found at [http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + +If you find these icons useful, please donate via paypal to mjames@gmail.com +(or click the donate button available at [http://www.famfamfam.com/lab/icons/silk](http://www.famfamfam.com/lab/icons/silk)) + +Contact: mjames@gmail.com + + + +License for the `gg` add-on icon +---------- + +Silk companion icon set #1 - "More Silk!" +Last updated: 19 November 2007 + +_________________________________________ +Damien Guard (@damieng) +http://damieng.com/creative/icons/silk-companion-1-icons +_________________________________________ + +This work is licensed under a +Creative Commons Attribution 2.5 License. +[ http://creativecommons.org/licenses/by/2.5/ ] + +The FamFamFam Silk icon set is a very large, +consistent set of well-drawn icons that has +proven to be popular with both applications +and web sites. + +On a number of occasions I have found myself +wanting more icons in the same style. This +companion set represents what I needed but also +what I felt like adding. + +Some are new icons in the same style, some are +alternative sizes/colours of the existing icons +and some are new compositions of the elements. + +Any questions about this companion set please +contact damieng@gmail.com. + + +License for the `mm` (Myanmar) add-on icon +---------- + +Suggested by [@lucas34](https://github.com/lucas34). + +[https://commons.wikimedia.org/wiki/File:Flag_of_Myanmar-new.jpg](Original flag license): + +The copyright holder of this work allows anyone to use it for any purpose including unrestricted redistribution, commercial use, and modification. + + +License for the `je` (Jersey) add-on icon +---------- + +Suggested by [@ryankane](https://github.com/ryankane). + +[http://en.wikipedia.org/wiki/File:Flag_of_Jersey.svg](Original flag license): + +The copyright holder grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law. + + +The icon modified by Drew Noakes [@drewnoakes](https://github.com/drewnoakes) before submitting: + +See [discussion](https://code.google.com/p/famfamfam/issues/detail?id=1). + + +About the rest (all this repository but the icons) +---------- + +All the content of this repository (excepted the icon pack) +is licensed under the [MIT license](http://opensource.org/licenses/MIT). + +Though, it is just composed a few trivial json files and a Readme. diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/README.md b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/README.md new file mode 100644 index 00000000..2dae6d79 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/README.md @@ -0,0 +1,128 @@ + +# famfamfam-flags + +[![NPM version](https://img.shields.io/npm/v/famfamfam-flags.svg)](https://www.npmjs.org/package/famfamfam-flags) +[![Bower version](https://img.shields.io/bower/v/famfamfam-flags.svg)](http://bower.io/search/?q=famfamfam-flags) +[![Packagist version](https://img.shields.io/packagist/v/legacy-icons/famfamfam-flags.svg)](https://packagist.org/packages/legacy-icons/famfamfam-flags) +[![Nuget version](https://img.shields.io/nuget/v/famfamfam-flags.svg)](https://www.nuget.org/packages/famfamfam-flags/) + +[![Dependency Status](https://img.shields.io/david/dev/legacy-icons/famfamfam-flags.svg)](https://david-dm.org/legacy-icons/famfamfam-flags) +[![Build Status](https://img.shields.io/travis/legacy-icons/famfamfam-flags.svg)](https://travis-ci.org/legacy-icons/famfamfam-flags) + + + +## About + +The `Flags` icon pack, as available on [famfamfam website](http://www.famfamfam.com/lab/icons/flags/). + +All credits for these icons go to their original author: Mark James (mjames@gmail.com) + +The aim of this project is to make this icon pack available through various package managers, such as: + +- [NPM](https://npmjs.org) +- [Bower](http://bower.io) +- [Packagist](https://packagist.org) +- [NuGet](https://www.nuget.org) + + +All icons are supplied in both PNG and GIF formats. + + +## Extensions and updates + +A flag has been added to the original package: `gg.png` (or `gg.gif`). +This flag was created by [Damien Guard (@damieng)](https://github.com/damieng) (damieng@gmail.com), in the "add-on" package for FamFamFam icons named [Silk Companion](http://damieng.com/creative/icons/silk-companion-1-icons). + + +The flag for Myanmar has been updated: `mm.png` (or `mm.gif`). +This flag was updated by [@Lucas](https://github.com/lucas34), and was created from [Wikipedia](https://commons.wikimedia.org/wiki/File:Flag_of_Myanmar-new.jpg). + + +The project now supports aliases in CSS spritesheets (see below). The feature was brought by [@Rangoo94](https://github.com/Rangoo94). For example, `RE` ([Reunion](https://en.wikipedia.org/wiki/.re)) is an alias for `FR` ([France](https://en.wikipedia.org/wiki/.fr)), since Reunion shares the same flag as France. To see the aliases, please check the [aliases.json file](https://github.com/legacy-icons/famfamfam-flags/blob/master/aliases.json). + + +## CSS spritesheets + +You can insert the icons directly into your HTML with a common IMG tag: + +```html +French Flag +``` + + +In addition to the icons by themselves, this project also ships a CSS spritesheet for the icon-pack. This spritesheet allows to load the entire icon-pack in just 1 image, and thus reduce HTTP calls. + +This is what it actually looks: + +![Spritesheet](https://raw.githubusercontent.com/legacy-icons/famfamfam-flags/master/dist/sprite/famfamfam-flags.png) + + +All the positioning of the icons inside this alone image is made through CSS, which allows you to just add block-type tags with the proper class and get the same result: + +```html +
    +``` + +Just remember to add the CSS stylesheet to the HEAD of your HTML page! + +## Install + +### NPM + +> npm install famfamfam-flags + + +### Bower + +> bower install famfamfam-flags + + +### Composer / Packagist + +> composer require legacy-icons/famfamfam-flags + + +### NuGet + +> Install-Package famfamfam-flags + + + +## Build the whole project or your custom project + +We use [Gulp](http://gulpjs.com/) to build the project, so if you want to re-build or customize this project, you'll need Gulp. + +After gulp is installed, and your CLI is pointed to your work directory, first install the dependencies: + +**with NPM 2.x.x** + +> npm install + +**with NPM 3.x.x** (resolve dependencies for `node-spritesheet` before this module's ones) + +> npm install grunt grunt-contrib-coffee grunt-contrib-clean + +> npm install + +then be sure that you have *[ImageMagick](http://www.imagemagick.org/script/binary-releases.php)* installed for building spritesheet. + +then, you can run the `gulp build` task to build the project: + +> gulp build + + +### What the build task does? + +First, it takes PNG and GIF files from the `src` folder, and tidies them to the `dist` folder. + +Then it creates a spritesheet from the PNG images located in the `src` folder, and thus creates the `sprite` folder in `dist`. + +If, for example you just want `fr` and `gg` icons in a spritesheet, you just have to fork this project, point your CLI to the working directory, +empty the `src` directory, except `fr` and `gg` icons in PNG format, and then run the `gulp build` task. + +You'll get the proper spritesheet and copies of the icons directly in the `dist` folder. + + +## License + +See [License](https://github.com/legacy-icons/famfamfam-flags/blob/master/LICENSE.md) diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/aliases.json b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/aliases.json new file mode 100644 index 00000000..04d52360 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/aliases.json @@ -0,0 +1,11 @@ +{ + "fr": [ + "gp", + "mf", + "re", + "yt" + ], + "nl": [ + "bq" + ] +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ad.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ad.gif new file mode 100644 index 00000000..8c9c8a2b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ad.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ae.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ae.gif new file mode 100644 index 00000000..2dbd5971 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ae.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/af.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/af.gif new file mode 100644 index 00000000..a5ecb6be Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/af.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ag.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ag.gif new file mode 100644 index 00000000..57d0e916 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ag.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ai.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ai.gif new file mode 100644 index 00000000..4e25778c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ai.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/al.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/al.gif new file mode 100644 index 00000000..5e481da4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/al.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/am.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/am.gif new file mode 100644 index 00000000..9fdf57ad Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/am.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/an.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/an.gif new file mode 100644 index 00000000..e47b6bec Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/an.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ao.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ao.gif new file mode 100644 index 00000000..a0310feb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ao.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ar.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ar.gif new file mode 100644 index 00000000..c059073b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ar.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/as.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/as.gif new file mode 100644 index 00000000..2ecd855f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/as.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/at.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/at.gif new file mode 100644 index 00000000..c853c4e3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/at.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/au.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/au.gif new file mode 100644 index 00000000..fe12b65d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/au.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/aw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/aw.gif new file mode 100644 index 00000000..2b323c18 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/aw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ax.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ax.gif new file mode 100644 index 00000000..dee87faa Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ax.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/az.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/az.gif new file mode 100644 index 00000000..7e51f06c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/az.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ba.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ba.gif new file mode 100644 index 00000000..709872c1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ba.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bb.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bb.gif new file mode 100644 index 00000000..49f4b6cf Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bb.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bd.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bd.gif new file mode 100644 index 00000000..abbf8ac4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bd.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/be.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/be.gif new file mode 100644 index 00000000..b0ac5519 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/be.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bf.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bf.gif new file mode 100644 index 00000000..732652ef Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bf.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bg.gif new file mode 100644 index 00000000..643aff5d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bh.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bh.gif new file mode 100644 index 00000000..12c72d77 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bh.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bi.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bi.gif new file mode 100644 index 00000000..be6f9657 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bi.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bj.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bj.gif new file mode 100644 index 00000000..045d9aac Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bj.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bm.gif new file mode 100644 index 00000000..129c8477 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bn.gif new file mode 100644 index 00000000..463e0904 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bo.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bo.gif new file mode 100644 index 00000000..416df630 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bo.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/br.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/br.gif new file mode 100644 index 00000000..e3e953b0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/br.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bs.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bs.gif new file mode 100644 index 00000000..fcbb908f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bs.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bt.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bt.gif new file mode 100644 index 00000000..c64e2367 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bt.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bv.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bv.gif new file mode 100644 index 00000000..2e5bb136 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bv.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bw.gif new file mode 100644 index 00000000..361a059b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/by.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/by.gif new file mode 100644 index 00000000..99342290 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/by.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bz.gif new file mode 100644 index 00000000..ce2e503c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/bz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ca.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ca.gif new file mode 100644 index 00000000..0cb2cc1a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ca.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/catalonia.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/catalonia.gif new file mode 100644 index 00000000..e31b342c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/catalonia.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cc.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cc.gif new file mode 100644 index 00000000..597a02c4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cc.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cd.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cd.gif new file mode 100644 index 00000000..aee403cc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cd.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cf.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cf.gif new file mode 100644 index 00000000..1cc8fc5c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cf.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cg.gif new file mode 100644 index 00000000..06f44378 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ch.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ch.gif new file mode 100644 index 00000000..3693ccdf Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ch.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ci.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ci.gif new file mode 100644 index 00000000..3a6b22b1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ci.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ck.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ck.gif new file mode 100644 index 00000000..f66d2188 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ck.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cl.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cl.gif new file mode 100644 index 00000000..c7bbbd7d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cl.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cm.gif new file mode 100644 index 00000000..d9d64313 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cn.gif new file mode 100644 index 00000000..ad7d60cb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/co.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/co.gif new file mode 100644 index 00000000..a8e06c38 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/co.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cr.gif new file mode 100644 index 00000000..bd0b9582 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cs.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cs.gif new file mode 100644 index 00000000..a29d579a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cs.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cu.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cu.gif new file mode 100644 index 00000000..5084bb8a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cu.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cv.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cv.gif new file mode 100644 index 00000000..d7d136aa Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cv.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cx.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cx.gif new file mode 100644 index 00000000..29a64af0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cx.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cy.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cy.gif new file mode 100644 index 00000000..f5f68d98 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cy.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cz.gif new file mode 100644 index 00000000..8e4eae14 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/cz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/de.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/de.gif new file mode 100644 index 00000000..f2b9bd9f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/de.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dj.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dj.gif new file mode 100644 index 00000000..4cb73a6d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dj.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dk.gif new file mode 100644 index 00000000..1744bde9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dm.gif new file mode 100644 index 00000000..9f132afa Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/do.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/do.gif new file mode 100644 index 00000000..7a590ced Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/do.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dz.gif new file mode 100644 index 00000000..bb163661 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/dz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ec.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ec.gif new file mode 100644 index 00000000..dbe9fa47 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ec.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ee.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ee.gif new file mode 100644 index 00000000..483a1cd7 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ee.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/eg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/eg.gif new file mode 100644 index 00000000..dbd31f98 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/eg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/eh.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/eh.gif new file mode 100644 index 00000000..06ca66ed Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/eh.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/england.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/england.gif new file mode 100644 index 00000000..1aaa85e3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/england.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/er.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/er.gif new file mode 100644 index 00000000..348299fc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/er.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/es.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/es.gif new file mode 100644 index 00000000..d55be2d8 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/es.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/et.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/et.gif new file mode 100644 index 00000000..abfbc64a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/et.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/europeanunion.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/europeanunion.gif new file mode 100644 index 00000000..e3b0afd5 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/europeanunion.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fam.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fam.gif new file mode 100644 index 00000000..3f6180e8 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fam.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fi.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fi.gif new file mode 100644 index 00000000..fd97ba07 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fi.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fj.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fj.gif new file mode 100644 index 00000000..de4ce2dc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fj.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fk.gif new file mode 100644 index 00000000..d528833a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fm.gif new file mode 100644 index 00000000..f15a9d77 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fo.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fo.gif new file mode 100644 index 00000000..02296afc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fo.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fr.gif new file mode 100644 index 00000000..dbd3c5b6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/fr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ga.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ga.gif new file mode 100644 index 00000000..81dd3e88 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ga.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gb.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gb.gif new file mode 100644 index 00000000..0c3c4ca1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gb.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gd.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gd.gif new file mode 100644 index 00000000..9722277f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gd.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ge.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ge.gif new file mode 100644 index 00000000..0bd3eb27 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ge.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gf.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gf.gif new file mode 100644 index 00000000..dbd3c5b6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gf.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gg.gif new file mode 100644 index 00000000..5596bba0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gh.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gh.gif new file mode 100644 index 00000000..dc47f432 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gh.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gi.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gi.gif new file mode 100644 index 00000000..c15c1c70 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gi.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gl.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gl.gif new file mode 100644 index 00000000..40d45d6f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gl.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gm.gif new file mode 100644 index 00000000..d7a40980 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gn.gif new file mode 100644 index 00000000..1ebceec8 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gp.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gp.gif new file mode 100644 index 00000000..098ec4e6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gp.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gq.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gq.gif new file mode 100644 index 00000000..1cae26c2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gq.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gr.gif new file mode 100644 index 00000000..fb28097c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gs.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gs.gif new file mode 100644 index 00000000..d1ea4a5e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gs.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gt.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gt.gif new file mode 100644 index 00000000..2ec5040a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gt.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gu.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gu.gif new file mode 100644 index 00000000..29d75308 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gu.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gw.gif new file mode 100644 index 00000000..c8d6e070 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gy.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gy.gif new file mode 100644 index 00000000..d4b30471 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/gy.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hk.gif new file mode 100644 index 00000000..60a75d12 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hm.gif new file mode 100644 index 00000000..fe12b65d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hn.gif new file mode 100644 index 00000000..ce3e996b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hr.gif new file mode 100644 index 00000000..0a602e18 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ht.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ht.gif new file mode 100644 index 00000000..d228b71e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ht.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hu.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hu.gif new file mode 100644 index 00000000..6e444296 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/hu.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/id.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/id.gif new file mode 100644 index 00000000..15503645 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/id.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ie.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ie.gif new file mode 100644 index 00000000..069f53e6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ie.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/il.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/il.gif new file mode 100644 index 00000000..1e716c4e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/il.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/in.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/in.gif new file mode 100644 index 00000000..80eba526 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/in.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/io.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/io.gif new file mode 100644 index 00000000..17bc5dff Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/io.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/iq.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/iq.gif new file mode 100644 index 00000000..d20d1883 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/iq.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ir.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ir.gif new file mode 100644 index 00000000..5b387ec6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ir.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/is.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/is.gif new file mode 100644 index 00000000..6b798341 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/is.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/it.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/it.gif new file mode 100644 index 00000000..dec3910b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/it.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/je.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/je.gif new file mode 100644 index 00000000..5b6f2c91 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/je.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jm.gif new file mode 100644 index 00000000..731d8cee Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jo.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jo.gif new file mode 100644 index 00000000..f2e5cff0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jo.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jp.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jp.gif new file mode 100644 index 00000000..4fc7ac51 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/jp.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ke.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ke.gif new file mode 100644 index 00000000..e8cc318e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ke.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kg.gif new file mode 100644 index 00000000..801ae6fd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kh.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kh.gif new file mode 100644 index 00000000..8959efa0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kh.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ki.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ki.gif new file mode 100644 index 00000000..44671208 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ki.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/km.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/km.gif new file mode 100644 index 00000000..754a85ac Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/km.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kn.gif new file mode 100644 index 00000000..b6105f8a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kp.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kp.gif new file mode 100644 index 00000000..7d2213aa Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kp.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kr.gif new file mode 100644 index 00000000..3a26ab77 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kw.gif new file mode 100644 index 00000000..4731079a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ky.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ky.gif new file mode 100644 index 00000000..60a1b8e2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ky.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kz.gif new file mode 100644 index 00000000..75db2d26 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/kz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/la.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/la.gif new file mode 100644 index 00000000..4e713104 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/la.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lb.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lb.gif new file mode 100644 index 00000000..b2c1bec0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lb.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lc.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lc.gif new file mode 100644 index 00000000..6cd2e9da Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lc.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/li.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/li.gif new file mode 100644 index 00000000..865a25a6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/li.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lk.gif new file mode 100644 index 00000000..083fe764 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lr.gif new file mode 100644 index 00000000..45be539e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ls.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ls.gif new file mode 100644 index 00000000..0c21ea01 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ls.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lt.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lt.gif new file mode 100644 index 00000000..f5125f17 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lt.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lu.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lu.gif new file mode 100644 index 00000000..dd19226f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lu.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lv.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lv.gif new file mode 100644 index 00000000..3dc682df Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/lv.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ly.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ly.gif new file mode 100644 index 00000000..481977ce Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ly.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ma.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ma.gif new file mode 100644 index 00000000..54e074bd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ma.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mc.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mc.gif new file mode 100644 index 00000000..b8f859b5 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mc.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/md.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/md.gif new file mode 100644 index 00000000..e2901ed9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/md.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/me.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/me.gif new file mode 100644 index 00000000..f1d49abe Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/me.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mg.gif new file mode 100644 index 00000000..332adfe9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mh.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mh.gif new file mode 100644 index 00000000..30fc6386 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mh.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mk.gif new file mode 100644 index 00000000..ab783d78 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ml.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ml.gif new file mode 100644 index 00000000..3e9db35a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ml.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mm.gif new file mode 100644 index 00000000..ececbd84 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mn.gif new file mode 100644 index 00000000..04124445 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mo.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mo.gif new file mode 100644 index 00000000..39e446a3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mo.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mp.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mp.gif new file mode 100644 index 00000000..5296c424 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mp.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mq.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mq.gif new file mode 100644 index 00000000..e8408ece Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mq.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mr.gif new file mode 100644 index 00000000..08c3a2ab Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ms.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ms.gif new file mode 100644 index 00000000..75857205 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ms.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mt.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mt.gif new file mode 100644 index 00000000..7d4f32ab Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mt.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mu.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mu.gif new file mode 100644 index 00000000..9246ed9e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mu.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mv.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mv.gif new file mode 100644 index 00000000..d7106098 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mv.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mw.gif new file mode 100644 index 00000000..9c4a4618 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mx.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mx.gif new file mode 100644 index 00000000..7a545781 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mx.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/my.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/my.gif new file mode 100644 index 00000000..5a4b433f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/my.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mz.gif new file mode 100644 index 00000000..ea6f19f1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/mz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/na.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/na.gif new file mode 100644 index 00000000..629781d7 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/na.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nc.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nc.gif new file mode 100644 index 00000000..3eb1ff2b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nc.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ne.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ne.gif new file mode 100644 index 00000000..4c07e0f3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ne.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nf.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nf.gif new file mode 100644 index 00000000..71d62d7c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nf.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ng.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ng.gif new file mode 100644 index 00000000..211f873d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ng.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ni.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ni.gif new file mode 100644 index 00000000..af0bbebe Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ni.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nl.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nl.gif new file mode 100644 index 00000000..efaeda45 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nl.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/no.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/no.gif new file mode 100644 index 00000000..2e5bb136 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/no.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/np.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/np.gif new file mode 100644 index 00000000..1096893a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/np.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nr.gif new file mode 100644 index 00000000..f5e1c943 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nu.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nu.gif new file mode 100644 index 00000000..0ec09e6b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nu.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nz.gif new file mode 100644 index 00000000..a645946f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/nz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/om.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/om.gif new file mode 100644 index 00000000..3d0ae277 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/om.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pa.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pa.gif new file mode 100644 index 00000000..080ddc37 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pa.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pe.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pe.gif new file mode 100644 index 00000000..72d06b04 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pe.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pf.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pf.gif new file mode 100644 index 00000000..516137c7 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pf.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pg.gif new file mode 100644 index 00000000..543b75ec Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ph.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ph.gif new file mode 100644 index 00000000..0c03715a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ph.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pk.gif new file mode 100644 index 00000000..20b011a6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pl.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pl.gif new file mode 100644 index 00000000..acf622ac Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pl.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pm.gif new file mode 100644 index 00000000..8856f223 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pn.gif new file mode 100644 index 00000000..a1f2999e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pr.gif new file mode 100644 index 00000000..0b16a6de Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ps.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ps.gif new file mode 100644 index 00000000..89bec86c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ps.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pt.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pt.gif new file mode 100644 index 00000000..ceb4d92a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pt.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pw.gif new file mode 100644 index 00000000..3dde9c83 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/pw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/py.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/py.gif new file mode 100644 index 00000000..a1f60a01 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/py.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/qa.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/qa.gif new file mode 100644 index 00000000..3abcfccf Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/qa.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/re.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/re.gif new file mode 100644 index 00000000..dbd3c5b6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/re.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ro.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ro.gif new file mode 100644 index 00000000..b0e93801 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ro.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/rs.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/rs.gif new file mode 100644 index 00000000..64d15eeb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/rs.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ru.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ru.gif new file mode 100644 index 00000000..a068e566 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ru.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/rw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/rw.gif new file mode 100644 index 00000000..5ebccbda Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/rw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sa.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sa.gif new file mode 100644 index 00000000..c55a7f3a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sa.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sb.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sb.gif new file mode 100644 index 00000000..0f7950cd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sb.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sc.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sc.gif new file mode 100644 index 00000000..d1c6e395 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sc.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/scotland.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/scotland.gif new file mode 100644 index 00000000..f13520b0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/scotland.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sd.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sd.gif new file mode 100644 index 00000000..2da5db5b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sd.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/se.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/se.gif new file mode 100644 index 00000000..6c18d6c8 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/se.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sg.gif new file mode 100644 index 00000000..d1f727d1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sh.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sh.gif new file mode 100644 index 00000000..b85b65bf Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sh.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/si.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/si.gif new file mode 100644 index 00000000..12378732 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/si.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sj.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sj.gif new file mode 100644 index 00000000..2e5bb136 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sj.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sk.gif new file mode 100644 index 00000000..16f07319 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sl.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sl.gif new file mode 100644 index 00000000..644235ed Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sl.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sm.gif new file mode 100644 index 00000000..40d76740 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sn.gif new file mode 100644 index 00000000..4f4a0592 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/so.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/so.gif new file mode 100644 index 00000000..ce6fde60 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/so.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sr.gif new file mode 100644 index 00000000..634b48a5 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/st.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/st.gif new file mode 100644 index 00000000..f44804bc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/st.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sv.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sv.gif new file mode 100644 index 00000000..40d0dbc4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sv.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sy.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sy.gif new file mode 100644 index 00000000..5d8bbb51 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sy.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sz.gif new file mode 100644 index 00000000..8e297be9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/sz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tc.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tc.gif new file mode 100644 index 00000000..964e3170 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tc.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/td.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/td.gif new file mode 100644 index 00000000..8ff17247 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/td.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tf.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tf.gif new file mode 100644 index 00000000..6f80cd44 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tf.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tg.gif new file mode 100644 index 00000000..3c6c33bb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/th.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/th.gif new file mode 100644 index 00000000..3704ae47 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/th.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tj.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tj.gif new file mode 100644 index 00000000..f5ed35e4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tj.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tk.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tk.gif new file mode 100644 index 00000000..d004a89f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tk.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tl.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tl.gif new file mode 100644 index 00000000..6787ea72 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tl.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tm.gif new file mode 100644 index 00000000..02ae95fe Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tn.gif new file mode 100644 index 00000000..0c24f927 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/to.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/to.gif new file mode 100644 index 00000000..5990a62b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/to.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tr.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tr.gif new file mode 100644 index 00000000..037ad28a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tr.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tt.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tt.gif new file mode 100644 index 00000000..e9c15702 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tt.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tv.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tv.gif new file mode 100644 index 00000000..4e9b3f52 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tv.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tw.gif new file mode 100644 index 00000000..9cad7f29 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tz.gif new file mode 100644 index 00000000..4154a8ed Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/tz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ua.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ua.gif new file mode 100644 index 00000000..9448bf12 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ua.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ug.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ug.gif new file mode 100644 index 00000000..ec9ef438 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ug.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/um.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/um.gif new file mode 100644 index 00000000..20d04afb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/um.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/us.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/us.gif new file mode 100644 index 00000000..447c2b2b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/us.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/uy.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/uy.gif new file mode 100644 index 00000000..84b2e5cc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/uy.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/uz.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/uz.gif new file mode 100644 index 00000000..0089526d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/uz.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/va.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/va.gif new file mode 100644 index 00000000..f3f2fe3d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/va.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vc.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vc.gif new file mode 100644 index 00000000..429f8c98 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vc.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ve.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ve.gif new file mode 100644 index 00000000..af6e8f00 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ve.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vg.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vg.gif new file mode 100644 index 00000000..3426f8cc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vg.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vi.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vi.gif new file mode 100644 index 00000000..6d9dd6e3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vi.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vn.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vn.gif new file mode 100644 index 00000000..02e13878 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vn.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vu.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vu.gif new file mode 100644 index 00000000..37353c73 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/vu.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/wales.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/wales.gif new file mode 100644 index 00000000..40792c91 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/wales.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/wf.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/wf.gif new file mode 100644 index 00000000..67a1420e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/wf.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ws.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ws.gif new file mode 100644 index 00000000..9e1ca628 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ws.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ye.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ye.gif new file mode 100644 index 00000000..05ec9338 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/ye.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/yt.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/yt.gif new file mode 100644 index 00000000..28221e53 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/yt.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/za.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/za.gif new file mode 100644 index 00000000..f120d5da Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/za.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/zm.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/zm.gif new file mode 100644 index 00000000..f88e6458 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/zm.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/zw.gif b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/zw.gif new file mode 100644 index 00000000..2e47bccd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/gif/zw.gif differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ad.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ad.png new file mode 100644 index 00000000..84e49781 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ad.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ae.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ae.png new file mode 100644 index 00000000..ef3a1ecf Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ae.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/af.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/af.png new file mode 100644 index 00000000..30b77326 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/af.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ag.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ag.png new file mode 100644 index 00000000..f03b07f2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ag.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ai.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ai.png new file mode 100644 index 00000000..2b00f2cc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ai.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/al.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/al.png new file mode 100644 index 00000000..fea63efc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/al.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/am.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/am.png new file mode 100644 index 00000000..b4df362f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/am.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/an.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/an.png new file mode 100644 index 00000000..633e4b89 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/an.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ao.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ao.png new file mode 100644 index 00000000..bcbd1d6d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ao.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ar.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ar.png new file mode 100644 index 00000000..9bcd298b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ar.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/as.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/as.png new file mode 100644 index 00000000..221462ad Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/as.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/at.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/at.png new file mode 100644 index 00000000..2f87300c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/at.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/au.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/au.png new file mode 100644 index 00000000..9763ee3b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/au.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/aw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/aw.png new file mode 100644 index 00000000..0da58d3f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/aw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ax.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ax.png new file mode 100644 index 00000000..45bd963f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ax.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/az.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/az.png new file mode 100644 index 00000000..eec86cdc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/az.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ba.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ba.png new file mode 100644 index 00000000..0f76bd39 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ba.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bb.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bb.png new file mode 100644 index 00000000..9196cb38 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bb.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bd.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bd.png new file mode 100644 index 00000000..423e2231 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bd.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/be.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/be.png new file mode 100644 index 00000000..7ed6a145 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/be.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bf.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bf.png new file mode 100644 index 00000000..984b150f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bf.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bg.png new file mode 100644 index 00000000..80242c2b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bh.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bh.png new file mode 100644 index 00000000..ea8ce687 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bh.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bi.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bi.png new file mode 100644 index 00000000..efbbec66 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bi.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bj.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bj.png new file mode 100644 index 00000000..02920a19 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bj.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bm.png new file mode 100644 index 00000000..0ba86b15 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bn.png new file mode 100644 index 00000000..0eeb4fd2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bo.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bo.png new file mode 100644 index 00000000..5d8fbd81 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bo.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/br.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/br.png new file mode 100644 index 00000000..4949701d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/br.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bs.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bs.png new file mode 100644 index 00000000..7262df73 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bs.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bt.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bt.png new file mode 100644 index 00000000..4aee474d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bt.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bv.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bv.png new file mode 100644 index 00000000..0860d269 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bv.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bw.png new file mode 100644 index 00000000..186fc90f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/by.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/by.png new file mode 100644 index 00000000..563f063f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/by.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bz.png new file mode 100644 index 00000000..3a68dec2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/bz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ca.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ca.png new file mode 100644 index 00000000..33a3b60c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ca.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/catalonia.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/catalonia.png new file mode 100644 index 00000000..fbdbede3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/catalonia.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cc.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cc.png new file mode 100644 index 00000000..29524c29 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cc.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cd.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cd.png new file mode 100644 index 00000000..5e489424 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cd.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cf.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cf.png new file mode 100644 index 00000000..00782542 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cf.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cg.png new file mode 100644 index 00000000..e3fe4d7f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ch.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ch.png new file mode 100644 index 00000000..15194bab Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ch.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ci.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ci.png new file mode 100644 index 00000000..55acf14d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ci.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ck.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ck.png new file mode 100644 index 00000000..b14a3ab6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ck.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cl.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cl.png new file mode 100644 index 00000000..0b85ae07 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cl.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cm.png new file mode 100644 index 00000000..69680ffc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cn.png new file mode 100644 index 00000000..fac1cb30 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/co.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/co.png new file mode 100644 index 00000000..b5d3d48a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/co.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cr.png new file mode 100644 index 00000000..e3f483f7 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cs.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cs.png new file mode 100644 index 00000000..b20a4a19 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cs.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cu.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cu.png new file mode 100644 index 00000000..711486c0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cu.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cv.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cv.png new file mode 100644 index 00000000..2427d3b2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cv.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cx.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cx.png new file mode 100644 index 00000000..fc75f79d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cx.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cy.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cy.png new file mode 100644 index 00000000..5b1ad6c0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cy.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cz.png new file mode 100644 index 00000000..6df46b34 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/cz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/de.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/de.png new file mode 100644 index 00000000..91072d69 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/de.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dj.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dj.png new file mode 100644 index 00000000..24dda05c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dj.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dk.png new file mode 100644 index 00000000..622cebd2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dm.png new file mode 100644 index 00000000..89ecece4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/do.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/do.png new file mode 100644 index 00000000..13ae2605 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/do.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dz.png new file mode 100644 index 00000000..ed06905c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/dz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ec.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ec.png new file mode 100644 index 00000000..3b5383ba Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ec.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ee.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ee.png new file mode 100644 index 00000000..0c82efb7 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ee.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/eg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/eg.png new file mode 100644 index 00000000..493d5c4e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/eg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/eh.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/eh.png new file mode 100644 index 00000000..7efd005e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/eh.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/england.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/england.png new file mode 100644 index 00000000..3a7311d5 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/england.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/er.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/er.png new file mode 100644 index 00000000..652c196f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/er.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/es.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/es.png new file mode 100644 index 00000000..6b3e52d8 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/es.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/et.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/et.png new file mode 100644 index 00000000..205ea66d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/et.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/europeanunion.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/europeanunion.png new file mode 100644 index 00000000..feee49df Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/europeanunion.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fam.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fam.png new file mode 100644 index 00000000..7d61658c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fam.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fi.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fi.png new file mode 100644 index 00000000..c5d98825 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fi.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fj.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fj.png new file mode 100644 index 00000000..56c0b0f5 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fj.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fk.png new file mode 100644 index 00000000..434c9664 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fm.png new file mode 100644 index 00000000..4615039c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fo.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fo.png new file mode 100644 index 00000000..cbceb809 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fo.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fr.png new file mode 100644 index 00000000..ede67387 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/fr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ga.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ga.png new file mode 100644 index 00000000..aacaa1f2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ga.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gb.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gb.png new file mode 100644 index 00000000..4576e0d6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gb.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gd.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gd.png new file mode 100644 index 00000000..2f847372 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gd.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ge.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ge.png new file mode 100644 index 00000000..8caf6e84 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ge.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gf.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gf.png new file mode 100644 index 00000000..ede67387 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gf.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gg.png new file mode 100644 index 00000000..70916076 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gh.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gh.png new file mode 100644 index 00000000..5a04cd4b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gh.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gi.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gi.png new file mode 100644 index 00000000..e76797f6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gi.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gl.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gl.png new file mode 100644 index 00000000..43102a8c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gl.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gm.png new file mode 100644 index 00000000..31ccb49e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gn.png new file mode 100644 index 00000000..3c341eec Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gp.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gp.png new file mode 100644 index 00000000..24a48e88 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gp.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gq.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gq.png new file mode 100644 index 00000000..89e595ef Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gq.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gr.png new file mode 100644 index 00000000..82b50b57 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gs.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gs.png new file mode 100644 index 00000000..af737aef Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gs.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gt.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gt.png new file mode 100644 index 00000000..fec6653a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gt.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gu.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gu.png new file mode 100644 index 00000000..668170fd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gu.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gw.png new file mode 100644 index 00000000..f7514c73 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gy.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gy.png new file mode 100644 index 00000000..e0979cb5 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/gy.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hk.png new file mode 100644 index 00000000..40bd5495 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hm.png new file mode 100644 index 00000000..9763ee3b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hn.png new file mode 100644 index 00000000..c20ad459 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hr.png new file mode 100644 index 00000000..b77266ef Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ht.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ht.png new file mode 100644 index 00000000..d8e284c2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ht.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hu.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hu.png new file mode 100644 index 00000000..33648a40 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/hu.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/id.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/id.png new file mode 100644 index 00000000..c6bc0faf Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/id.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ie.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ie.png new file mode 100644 index 00000000..31b1d550 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ie.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/il.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/il.png new file mode 100644 index 00000000..2ca772d0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/il.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/in.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/in.png new file mode 100644 index 00000000..01d691ba Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/in.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/io.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/io.png new file mode 100644 index 00000000..244706e6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/io.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/iq.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/iq.png new file mode 100644 index 00000000..3975518e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/iq.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ir.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ir.png new file mode 100644 index 00000000..96755068 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ir.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/is.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/is.png new file mode 100644 index 00000000..e1eb1768 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/is.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/it.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/it.png new file mode 100644 index 00000000..89692f74 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/it.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/je.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/je.png new file mode 100644 index 00000000..657b23d8 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/je.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jm.png new file mode 100644 index 00000000..dd6cbc1d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jo.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jo.png new file mode 100644 index 00000000..3482c831 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jo.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jp.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jp.png new file mode 100644 index 00000000..325fbad3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/jp.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ke.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ke.png new file mode 100644 index 00000000..3261f6f6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ke.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kg.png new file mode 100644 index 00000000..b934e232 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kh.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kh.png new file mode 100644 index 00000000..8ac53a48 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kh.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ki.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ki.png new file mode 100644 index 00000000..c1c9a2d6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ki.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/km.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/km.png new file mode 100644 index 00000000..bd98d786 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/km.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kn.png new file mode 100644 index 00000000..33cdaa55 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kp.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kp.png new file mode 100644 index 00000000..784030eb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kp.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kr.png new file mode 100644 index 00000000..7e370b82 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kw.png new file mode 100644 index 00000000..2742d890 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ky.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ky.png new file mode 100644 index 00000000..907fd204 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ky.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kz.png new file mode 100644 index 00000000..4cd72635 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/kz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/la.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/la.png new file mode 100644 index 00000000..834de2da Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/la.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lb.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lb.png new file mode 100644 index 00000000..5ecb9e8d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lb.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lc.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lc.png new file mode 100644 index 00000000..0585ed7e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lc.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/li.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/li.png new file mode 100644 index 00000000..2d62fa04 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/li.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lk.png new file mode 100644 index 00000000..019a29b3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lr.png new file mode 100644 index 00000000..89a5bc7e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ls.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ls.png new file mode 100644 index 00000000..164cf3b9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ls.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lt.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lt.png new file mode 100644 index 00000000..1fe23a17 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lt.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lu.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lu.png new file mode 100644 index 00000000..471be86a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lu.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lv.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lv.png new file mode 100644 index 00000000..a15fb26c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/lv.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ly.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ly.png new file mode 100644 index 00000000..445d8d69 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ly.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ma.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ma.png new file mode 100644 index 00000000..dbdac889 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ma.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mc.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mc.png new file mode 100644 index 00000000..1aa830f1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mc.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/md.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/md.png new file mode 100644 index 00000000..ac466761 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/md.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/me.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/me.png new file mode 100644 index 00000000..c4ab65c2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/me.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mg.png new file mode 100644 index 00000000..9dc51da4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mh.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mh.png new file mode 100644 index 00000000..2ad455c2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mh.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mk.png new file mode 100644 index 00000000..71eec74c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ml.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ml.png new file mode 100644 index 00000000..b5ef40bd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ml.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mm.png new file mode 100644 index 00000000..b471c1ef Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mn.png new file mode 100644 index 00000000..03cc5540 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mo.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mo.png new file mode 100644 index 00000000..0f8e289c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mo.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mp.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mp.png new file mode 100644 index 00000000..f66195ed Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mp.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mq.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mq.png new file mode 100644 index 00000000..3743546d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mq.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mr.png new file mode 100644 index 00000000..78be28a7 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ms.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ms.png new file mode 100644 index 00000000..ecda6cd3 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ms.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mt.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mt.png new file mode 100644 index 00000000..00af9487 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mt.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mu.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mu.png new file mode 100644 index 00000000..9fcd7256 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mu.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mv.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mv.png new file mode 100644 index 00000000..188325cb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mv.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mw.png new file mode 100644 index 00000000..1ee6485e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mx.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mx.png new file mode 100644 index 00000000..d1350447 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mx.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/my.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/my.png new file mode 100644 index 00000000..af86d26f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/my.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mz.png new file mode 100644 index 00000000..e0b82a5a Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/mz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/na.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/na.png new file mode 100644 index 00000000..3d96f414 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/na.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nc.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nc.png new file mode 100644 index 00000000..fc6437b0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nc.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ne.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ne.png new file mode 100644 index 00000000..e5c4ea74 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ne.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nf.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nf.png new file mode 100644 index 00000000..d672f28f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nf.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ng.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ng.png new file mode 100644 index 00000000..6dcc973e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ng.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ni.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ni.png new file mode 100644 index 00000000..7b3cdd31 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ni.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nl.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nl.png new file mode 100644 index 00000000..ad5243eb Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nl.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/no.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/no.png new file mode 100644 index 00000000..0860d269 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/no.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/np.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/np.png new file mode 100644 index 00000000..d331de38 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/np.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nr.png new file mode 100644 index 00000000..6a1ad4be Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nu.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nu.png new file mode 100644 index 00000000..3329808b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nu.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nz.png new file mode 100644 index 00000000..0a966f34 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/nz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/om.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/om.png new file mode 100644 index 00000000..35d5d16b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/om.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pa.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pa.png new file mode 100644 index 00000000..3397cf1d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pa.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pe.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pe.png new file mode 100644 index 00000000..62a04977 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pe.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pf.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pf.png new file mode 100644 index 00000000..4891c4e9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pf.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pg.png new file mode 100644 index 00000000..d447975c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ph.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ph.png new file mode 100644 index 00000000..b818a7fa Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ph.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pk.png new file mode 100644 index 00000000..efc93e84 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pl.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pl.png new file mode 100644 index 00000000..d413d010 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pl.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pm.png new file mode 100644 index 00000000..b7b6434e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pn.png new file mode 100644 index 00000000..42587a3f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pr.png new file mode 100644 index 00000000..9df1885b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ps.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ps.png new file mode 100644 index 00000000..f5f54776 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ps.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pt.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pt.png new file mode 100644 index 00000000..50ba8aa2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pt.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pw.png new file mode 100644 index 00000000..2832690b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/pw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/py.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/py.png new file mode 100644 index 00000000..6f205901 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/py.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/qa.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/qa.png new file mode 100644 index 00000000..ed4c621f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/qa.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/re.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/re.png new file mode 100644 index 00000000..ede67387 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/re.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ro.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ro.png new file mode 100644 index 00000000..ee4b9da0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ro.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/rs.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/rs.png new file mode 100644 index 00000000..f1d17963 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/rs.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ru.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ru.png new file mode 100644 index 00000000..8ab1e677 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ru.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/rw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/rw.png new file mode 100644 index 00000000..7cd51a9c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/rw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sa.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sa.png new file mode 100644 index 00000000..bff65423 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sa.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sb.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sb.png new file mode 100644 index 00000000..af651bd9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sb.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sc.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sc.png new file mode 100644 index 00000000..2ce78e76 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sc.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/scotland.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/scotland.png new file mode 100644 index 00000000..d87e7d6b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/scotland.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sd.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sd.png new file mode 100644 index 00000000..6d0a3c40 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sd.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/se.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/se.png new file mode 100644 index 00000000..2a74e78c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/se.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sg.png new file mode 100644 index 00000000..72f00dae Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sh.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sh.png new file mode 100644 index 00000000..c7d1a739 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sh.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/si.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/si.png new file mode 100644 index 00000000..ef41c0fc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/si.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sj.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sj.png new file mode 100644 index 00000000..0860d269 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sj.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sk.png new file mode 100644 index 00000000..22bab1c1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sl.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sl.png new file mode 100644 index 00000000..c59445bc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sl.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sm.png new file mode 100644 index 00000000..ae1886c9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sn.png new file mode 100644 index 00000000..1d58d609 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/so.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/so.png new file mode 100644 index 00000000..1cc36db1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/so.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sr.png new file mode 100644 index 00000000..e2d2c86d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/st.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/st.png new file mode 100644 index 00000000..319e7919 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/st.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sv.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sv.png new file mode 100644 index 00000000..eea4e5b2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sv.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sy.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sy.png new file mode 100644 index 00000000..f5ce30dc Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sy.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sz.png new file mode 100644 index 00000000..cb8b587d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/sz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tc.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tc.png new file mode 100644 index 00000000..4be883ad Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tc.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/td.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/td.png new file mode 100644 index 00000000..e91f146b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/td.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tf.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tf.png new file mode 100644 index 00000000..a9aba453 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tf.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tg.png new file mode 100644 index 00000000..72a51e9e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/th.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/th.png new file mode 100644 index 00000000..8a7f438c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/th.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tj.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tj.png new file mode 100644 index 00000000..617bf645 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tj.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tk.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tk.png new file mode 100644 index 00000000..c7e6c715 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tk.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tl.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tl.png new file mode 100644 index 00000000..09aad3e1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tl.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tm.png new file mode 100644 index 00000000..b6076f7d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tn.png new file mode 100644 index 00000000..cb62b2a9 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/to.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/to.png new file mode 100644 index 00000000..f89b8ba7 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/to.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tr.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tr.png new file mode 100644 index 00000000..d68b3958 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tr.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tt.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tt.png new file mode 100644 index 00000000..145f0ccd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tt.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tv.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tv.png new file mode 100644 index 00000000..79ae7689 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tv.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tw.png new file mode 100644 index 00000000..432b92c0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tz.png new file mode 100644 index 00000000..eaf2d379 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/tz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ua.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ua.png new file mode 100644 index 00000000..bf96f0e4 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ua.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ug.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ug.png new file mode 100644 index 00000000..d1d5749f Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ug.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/um.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/um.png new file mode 100644 index 00000000..43866706 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/um.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/us.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/us.png new file mode 100644 index 00000000..d0005f9e Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/us.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/uy.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/uy.png new file mode 100644 index 00000000..6730b961 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/uy.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/uz.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/uz.png new file mode 100644 index 00000000..8b6faf4c Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/uz.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/va.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/va.png new file mode 100644 index 00000000..ab31d79b Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/va.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vc.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vc.png new file mode 100644 index 00000000..1ed16412 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vc.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ve.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ve.png new file mode 100644 index 00000000..251d6015 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ve.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vg.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vg.png new file mode 100644 index 00000000..b2efb4df Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vg.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vi.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vi.png new file mode 100644 index 00000000..812028c8 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vi.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vn.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vn.png new file mode 100644 index 00000000..076e6c19 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vn.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vu.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vu.png new file mode 100644 index 00000000..114807c2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/vu.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/wales.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/wales.png new file mode 100644 index 00000000..1b32fae1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/wales.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/wf.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/wf.png new file mode 100644 index 00000000..1ad65a0d Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/wf.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ws.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ws.png new file mode 100644 index 00000000..d74670f6 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ws.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ye.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ye.png new file mode 100644 index 00000000..f1c52eb0 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/ye.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/yt.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/yt.png new file mode 100644 index 00000000..99d998b2 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/yt.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/za.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/za.png new file mode 100644 index 00000000..40cd37a1 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/za.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/zm.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/zm.png new file mode 100644 index 00000000..254e1d97 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/zm.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/zw.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/zw.png new file mode 100644 index 00000000..ab459e46 Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/png/zw.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.css b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.css new file mode 100644 index 00000000..4ebcb314 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.css @@ -0,0 +1,1499 @@ +.famfamfam-flags { + background: url( 'famfamfam-flags.png' ) no-repeat; + background-size: 224px 199px; +} + +.famfamfam-flags.me { + width: 16px; + height: 12px; + background-position: 0px 0px; +} + +.famfamfam-flags.ky { + width: 16px; + height: 11px; + background-position: -16px 0px; +} + +.famfamfam-flags.af { + width: 16px; + height: 11px; + background-position: 0px -12px; +} + +.famfamfam-flags.ag { + width: 16px; + height: 11px; + background-position: -16px -12px; +} + +.famfamfam-flags.ai { + width: 16px; + height: 11px; + background-position: -32px 0px; +} + +.famfamfam-flags.al { + width: 16px; + height: 11px; + background-position: -32px -11px; +} + +.famfamfam-flags.am { + width: 16px; + height: 11px; + background-position: 0px -23px; +} + +.famfamfam-flags.an { + width: 16px; + height: 11px; + background-position: -16px -23px; +} + +.famfamfam-flags.ao { + width: 16px; + height: 11px; + background-position: -32px -23px; +} + +.famfamfam-flags.ar { + width: 16px; + height: 11px; + background-position: 0px -34px; +} + +.famfamfam-flags.as { + width: 16px; + height: 11px; + background-position: -16px -34px; +} + +.famfamfam-flags.at { + width: 16px; + height: 11px; + background-position: -32px -34px; +} + +.famfamfam-flags.au { + width: 16px; + height: 11px; + background-position: -48px 0px; +} + +.famfamfam-flags.aw { + width: 16px; + height: 11px; + background-position: -48px -11px; +} + +.famfamfam-flags.ax { + width: 16px; + height: 11px; + background-position: -48px -22px; +} + +.famfamfam-flags.az { + width: 16px; + height: 11px; + background-position: -48px -33px; +} + +.famfamfam-flags.ba { + width: 16px; + height: 11px; + background-position: 0px -45px; +} + +.famfamfam-flags.bb { + width: 16px; + height: 11px; + background-position: -16px -45px; +} + +.famfamfam-flags.bd { + width: 16px; + height: 11px; + background-position: -32px -45px; +} + +.famfamfam-flags.be { + width: 16px; + height: 11px; + background-position: -48px -45px; +} + +.famfamfam-flags.bf { + width: 16px; + height: 11px; + background-position: -64px 0px; +} + +.famfamfam-flags.bg { + width: 16px; + height: 11px; + background-position: -64px -11px; +} + +.famfamfam-flags.bh { + width: 16px; + height: 11px; + background-position: -64px -22px; +} + +.famfamfam-flags.bi { + width: 16px; + height: 11px; + background-position: -64px -33px; +} + +.famfamfam-flags.bj { + width: 16px; + height: 11px; + background-position: -64px -44px; +} + +.famfamfam-flags.bm { + width: 16px; + height: 11px; + background-position: 0px -56px; +} + +.famfamfam-flags.bn { + width: 16px; + height: 11px; + background-position: -16px -56px; +} + +.famfamfam-flags.bo { + width: 16px; + height: 11px; + background-position: -32px -56px; +} + +.famfamfam-flags.br { + width: 16px; + height: 11px; + background-position: -48px -56px; +} + +.famfamfam-flags.bs { + width: 16px; + height: 11px; + background-position: -64px -56px; +} + +.famfamfam-flags.bt { + width: 16px; + height: 11px; + background-position: 0px -67px; +} + +.famfamfam-flags.bv { + width: 16px; + height: 11px; + background-position: -16px -67px; +} + +.famfamfam-flags.bw { + width: 16px; + height: 11px; + background-position: -32px -67px; +} + +.famfamfam-flags.by { + width: 16px; + height: 11px; + background-position: -48px -67px; +} + +.famfamfam-flags.bz { + width: 16px; + height: 11px; + background-position: -64px -67px; +} + +.famfamfam-flags.ca { + width: 16px; + height: 11px; + background-position: -80px 0px; +} + +.famfamfam-flags.catalonia { + width: 16px; + height: 11px; + background-position: -80px -11px; +} + +.famfamfam-flags.cc { + width: 16px; + height: 11px; + background-position: -80px -22px; +} + +.famfamfam-flags.cd { + width: 16px; + height: 11px; + background-position: -80px -33px; +} + +.famfamfam-flags.cf { + width: 16px; + height: 11px; + background-position: -80px -44px; +} + +.famfamfam-flags.cg { + width: 16px; + height: 11px; + background-position: -80px -55px; +} + +.famfamfam-flags.zm { + width: 16px; + height: 11px; + background-position: -80px -66px; +} + +.famfamfam-flags.ci { + width: 16px; + height: 11px; + background-position: 0px -78px; +} + +.famfamfam-flags.ck { + width: 16px; + height: 11px; + background-position: -16px -78px; +} + +.famfamfam-flags.cl { + width: 16px; + height: 11px; + background-position: -32px -78px; +} + +.famfamfam-flags.cm { + width: 16px; + height: 11px; + background-position: -48px -78px; +} + +.famfamfam-flags.cn { + width: 16px; + height: 11px; + background-position: -64px -78px; +} + +.famfamfam-flags.co { + width: 16px; + height: 11px; + background-position: -80px -78px; +} + +.famfamfam-flags.cr { + width: 16px; + height: 11px; + background-position: -96px 0px; +} + +.famfamfam-flags.cs { + width: 16px; + height: 11px; + background-position: -96px -11px; +} + +.famfamfam-flags.cu { + width: 16px; + height: 11px; + background-position: -96px -22px; +} + +.famfamfam-flags.cv { + width: 16px; + height: 11px; + background-position: -96px -33px; +} + +.famfamfam-flags.cx { + width: 16px; + height: 11px; + background-position: -96px -44px; +} + +.famfamfam-flags.cy { + width: 16px; + height: 11px; + background-position: -96px -55px; +} + +.famfamfam-flags.cz { + width: 16px; + height: 11px; + background-position: -96px -66px; +} + +.famfamfam-flags.de { + width: 16px; + height: 11px; + background-position: -96px -77px; +} + +.famfamfam-flags.dj { + width: 16px; + height: 11px; + background-position: 0px -89px; +} + +.famfamfam-flags.dk { + width: 16px; + height: 11px; + background-position: -16px -89px; +} + +.famfamfam-flags.dm { + width: 16px; + height: 11px; + background-position: -32px -89px; +} + +.famfamfam-flags.do { + width: 16px; + height: 11px; + background-position: -48px -89px; +} + +.famfamfam-flags.dz { + width: 16px; + height: 11px; + background-position: -64px -89px; +} + +.famfamfam-flags.ec { + width: 16px; + height: 11px; + background-position: -80px -89px; +} + +.famfamfam-flags.ee { + width: 16px; + height: 11px; + background-position: -96px -89px; +} + +.famfamfam-flags.eg { + width: 16px; + height: 11px; + background-position: 0px -100px; +} + +.famfamfam-flags.eh { + width: 16px; + height: 11px; + background-position: -16px -100px; +} + +.famfamfam-flags.england { + width: 16px; + height: 11px; + background-position: -32px -100px; +} + +.famfamfam-flags.er { + width: 16px; + height: 11px; + background-position: -48px -100px; +} + +.famfamfam-flags.es { + width: 16px; + height: 11px; + background-position: -64px -100px; +} + +.famfamfam-flags.et { + width: 16px; + height: 11px; + background-position: -80px -100px; +} + +.famfamfam-flags.europeanunion { + width: 16px; + height: 11px; + background-position: -96px -100px; +} + +.famfamfam-flags.fam { + width: 16px; + height: 11px; + background-position: -112px 0px; +} + +.famfamfam-flags.fi { + width: 16px; + height: 11px; + background-position: -112px -11px; +} + +.famfamfam-flags.fj { + width: 16px; + height: 11px; + background-position: -112px -22px; +} + +.famfamfam-flags.fk { + width: 16px; + height: 11px; + background-position: -112px -33px; +} + +.famfamfam-flags.fm { + width: 16px; + height: 11px; + background-position: -112px -44px; +} + +.famfamfam-flags.fo { + width: 16px; + height: 11px; + background-position: -112px -55px; +} + +.famfamfam-flags.gp, .famfamfam-flags.mf, .famfamfam-flags.re, .famfamfam-flags.yt, .famfamfam-flags.fr { + width: 16px; + height: 11px; + background-position: -112px -66px; +} + +.famfamfam-flags.ga { + width: 16px; + height: 11px; + background-position: -112px -77px; +} + +.famfamfam-flags.gb { + width: 16px; + height: 11px; + background-position: -112px -88px; +} + +.famfamfam-flags.gd { + width: 16px; + height: 11px; + background-position: -112px -99px; +} + +.famfamfam-flags.ge { + width: 16px; + height: 11px; + background-position: 0px -111px; +} + +.famfamfam-flags.gf { + width: 16px; + height: 11px; + background-position: -16px -111px; +} + +.famfamfam-flags.gg { + width: 16px; + height: 11px; + background-position: -32px -111px; +} + +.famfamfam-flags.gh { + width: 16px; + height: 11px; + background-position: -48px -111px; +} + +.famfamfam-flags.gi { + width: 16px; + height: 11px; + background-position: -64px -111px; +} + +.famfamfam-flags.gl { + width: 16px; + height: 11px; + background-position: -80px -111px; +} + +.famfamfam-flags.gm { + width: 16px; + height: 11px; + background-position: -96px -111px; +} + +.famfamfam-flags.gn { + width: 16px; + height: 11px; + background-position: -112px -111px; +} + +.famfamfam-flags.gp { + width: 16px; + height: 11px; + background-position: -128px 0px; +} + +.famfamfam-flags.gq { + width: 16px; + height: 11px; + background-position: -128px -11px; +} + +.famfamfam-flags.gr { + width: 16px; + height: 11px; + background-position: -128px -22px; +} + +.famfamfam-flags.gs { + width: 16px; + height: 11px; + background-position: -128px -33px; +} + +.famfamfam-flags.gt { + width: 16px; + height: 11px; + background-position: -128px -44px; +} + +.famfamfam-flags.gu { + width: 16px; + height: 11px; + background-position: -128px -55px; +} + +.famfamfam-flags.gw { + width: 16px; + height: 11px; + background-position: -128px -66px; +} + +.famfamfam-flags.gy { + width: 16px; + height: 11px; + background-position: -128px -77px; +} + +.famfamfam-flags.hk { + width: 16px; + height: 11px; + background-position: -128px -88px; +} + +.famfamfam-flags.hm { + width: 16px; + height: 11px; + background-position: -128px -99px; +} + +.famfamfam-flags.hn { + width: 16px; + height: 11px; + background-position: -128px -110px; +} + +.famfamfam-flags.hr { + width: 16px; + height: 11px; + background-position: 0px -122px; +} + +.famfamfam-flags.ht { + width: 16px; + height: 11px; + background-position: -16px -122px; +} + +.famfamfam-flags.hu { + width: 16px; + height: 11px; + background-position: -32px -122px; +} + +.famfamfam-flags.id { + width: 16px; + height: 11px; + background-position: -48px -122px; +} + +.famfamfam-flags.ie { + width: 16px; + height: 11px; + background-position: -64px -122px; +} + +.famfamfam-flags.il { + width: 16px; + height: 11px; + background-position: -80px -122px; +} + +.famfamfam-flags.in { + width: 16px; + height: 11px; + background-position: -96px -122px; +} + +.famfamfam-flags.io { + width: 16px; + height: 11px; + background-position: -112px -122px; +} + +.famfamfam-flags.iq { + width: 16px; + height: 11px; + background-position: -128px -122px; +} + +.famfamfam-flags.ir { + width: 16px; + height: 11px; + background-position: 0px -133px; +} + +.famfamfam-flags.is { + width: 16px; + height: 11px; + background-position: -16px -133px; +} + +.famfamfam-flags.it { + width: 16px; + height: 11px; + background-position: -32px -133px; +} + +.famfamfam-flags.je { + width: 16px; + height: 11px; + background-position: -48px -133px; +} + +.famfamfam-flags.jm { + width: 16px; + height: 11px; + background-position: -64px -133px; +} + +.famfamfam-flags.jo { + width: 16px; + height: 11px; + background-position: -80px -133px; +} + +.famfamfam-flags.jp { + width: 16px; + height: 11px; + background-position: -96px -133px; +} + +.famfamfam-flags.ke { + width: 16px; + height: 11px; + background-position: -112px -133px; +} + +.famfamfam-flags.kg { + width: 16px; + height: 11px; + background-position: -128px -133px; +} + +.famfamfam-flags.kh { + width: 16px; + height: 11px; + background-position: -144px 0px; +} + +.famfamfam-flags.ki { + width: 16px; + height: 11px; + background-position: -144px -11px; +} + +.famfamfam-flags.km { + width: 16px; + height: 11px; + background-position: -144px -22px; +} + +.famfamfam-flags.kn { + width: 16px; + height: 11px; + background-position: -144px -33px; +} + +.famfamfam-flags.kp { + width: 16px; + height: 11px; + background-position: -144px -44px; +} + +.famfamfam-flags.kr { + width: 16px; + height: 11px; + background-position: -144px -55px; +} + +.famfamfam-flags.kw { + width: 16px; + height: 11px; + background-position: -144px -66px; +} + +.famfamfam-flags.ae { + width: 16px; + height: 11px; + background-position: -144px -77px; +} + +.famfamfam-flags.kz { + width: 16px; + height: 11px; + background-position: -144px -88px; +} + +.famfamfam-flags.la { + width: 16px; + height: 11px; + background-position: -144px -99px; +} + +.famfamfam-flags.lb { + width: 16px; + height: 11px; + background-position: -144px -110px; +} + +.famfamfam-flags.lc { + width: 16px; + height: 11px; + background-position: -144px -121px; +} + +.famfamfam-flags.li { + width: 16px; + height: 11px; + background-position: -144px -132px; +} + +.famfamfam-flags.lk { + width: 16px; + height: 11px; + background-position: 0px -144px; +} + +.famfamfam-flags.lr { + width: 16px; + height: 11px; + background-position: -16px -144px; +} + +.famfamfam-flags.ls { + width: 16px; + height: 11px; + background-position: -32px -144px; +} + +.famfamfam-flags.lt { + width: 16px; + height: 11px; + background-position: -48px -144px; +} + +.famfamfam-flags.lu { + width: 16px; + height: 11px; + background-position: -64px -144px; +} + +.famfamfam-flags.lv { + width: 16px; + height: 11px; + background-position: -80px -144px; +} + +.famfamfam-flags.ly { + width: 16px; + height: 11px; + background-position: -96px -144px; +} + +.famfamfam-flags.ma { + width: 16px; + height: 11px; + background-position: -112px -144px; +} + +.famfamfam-flags.mc { + width: 16px; + height: 11px; + background-position: -128px -144px; +} + +.famfamfam-flags.md { + width: 16px; + height: 11px; + background-position: -144px -144px; +} + +.famfamfam-flags.ad { + width: 16px; + height: 11px; + background-position: -160px 0px; +} + +.famfamfam-flags.mg { + width: 16px; + height: 11px; + background-position: -160px -11px; +} + +.famfamfam-flags.mh { + width: 16px; + height: 11px; + background-position: -160px -22px; +} + +.famfamfam-flags.mk { + width: 16px; + height: 11px; + background-position: -160px -33px; +} + +.famfamfam-flags.ml { + width: 16px; + height: 11px; + background-position: -160px -44px; +} + +.famfamfam-flags.mm { + width: 16px; + height: 11px; + background-position: -160px -55px; +} + +.famfamfam-flags.mn { + width: 16px; + height: 11px; + background-position: -160px -66px; +} + +.famfamfam-flags.mo { + width: 16px; + height: 11px; + background-position: -160px -77px; +} + +.famfamfam-flags.mp { + width: 16px; + height: 11px; + background-position: -160px -88px; +} + +.famfamfam-flags.mq { + width: 16px; + height: 11px; + background-position: -160px -99px; +} + +.famfamfam-flags.mr { + width: 16px; + height: 11px; + background-position: -160px -110px; +} + +.famfamfam-flags.ms { + width: 16px; + height: 11px; + background-position: -160px -121px; +} + +.famfamfam-flags.mt { + width: 16px; + height: 11px; + background-position: -160px -132px; +} + +.famfamfam-flags.mu { + width: 16px; + height: 11px; + background-position: -160px -143px; +} + +.famfamfam-flags.mv { + width: 16px; + height: 11px; + background-position: 0px -155px; +} + +.famfamfam-flags.mw { + width: 16px; + height: 11px; + background-position: -16px -155px; +} + +.famfamfam-flags.mx { + width: 16px; + height: 11px; + background-position: -32px -155px; +} + +.famfamfam-flags.my { + width: 16px; + height: 11px; + background-position: -48px -155px; +} + +.famfamfam-flags.mz { + width: 16px; + height: 11px; + background-position: -64px -155px; +} + +.famfamfam-flags.na { + width: 16px; + height: 11px; + background-position: -80px -155px; +} + +.famfamfam-flags.nc { + width: 16px; + height: 11px; + background-position: -96px -155px; +} + +.famfamfam-flags.ne { + width: 16px; + height: 11px; + background-position: -112px -155px; +} + +.famfamfam-flags.nf { + width: 16px; + height: 11px; + background-position: -128px -155px; +} + +.famfamfam-flags.ng { + width: 16px; + height: 11px; + background-position: -144px -155px; +} + +.famfamfam-flags.ni { + width: 16px; + height: 11px; + background-position: -160px -155px; +} + +.famfamfam-flags.bq, .famfamfam-flags.nl { + width: 16px; + height: 11px; + background-position: -176px 0px; +} + +.famfamfam-flags.no { + width: 16px; + height: 11px; + background-position: -176px -11px; +} + +.famfamfam-flags.za { + width: 16px; + height: 11px; + background-position: -176px -22px; +} + +.famfamfam-flags.nr { + width: 16px; + height: 11px; + background-position: -176px -33px; +} + +.famfamfam-flags.nu { + width: 16px; + height: 11px; + background-position: -176px -44px; +} + +.famfamfam-flags.nz { + width: 16px; + height: 11px; + background-position: -176px -55px; +} + +.famfamfam-flags.om { + width: 16px; + height: 11px; + background-position: -176px -66px; +} + +.famfamfam-flags.pa { + width: 16px; + height: 11px; + background-position: -176px -77px; +} + +.famfamfam-flags.pe { + width: 16px; + height: 11px; + background-position: -176px -88px; +} + +.famfamfam-flags.pf { + width: 16px; + height: 11px; + background-position: -176px -99px; +} + +.famfamfam-flags.pg { + width: 16px; + height: 11px; + background-position: -176px -110px; +} + +.famfamfam-flags.ph { + width: 16px; + height: 11px; + background-position: -176px -121px; +} + +.famfamfam-flags.pk { + width: 16px; + height: 11px; + background-position: -176px -132px; +} + +.famfamfam-flags.pl { + width: 16px; + height: 11px; + background-position: -176px -143px; +} + +.famfamfam-flags.pm { + width: 16px; + height: 11px; + background-position: -176px -154px; +} + +.famfamfam-flags.pn { + width: 16px; + height: 11px; + background-position: 0px -166px; +} + +.famfamfam-flags.pr { + width: 16px; + height: 11px; + background-position: -16px -166px; +} + +.famfamfam-flags.ps { + width: 16px; + height: 11px; + background-position: -32px -166px; +} + +.famfamfam-flags.pt { + width: 16px; + height: 11px; + background-position: -48px -166px; +} + +.famfamfam-flags.pw { + width: 16px; + height: 11px; + background-position: -64px -166px; +} + +.famfamfam-flags.py { + width: 16px; + height: 11px; + background-position: -80px -166px; +} + +.famfamfam-flags.qa { + width: 16px; + height: 11px; + background-position: -96px -166px; +} + +.famfamfam-flags.re { + width: 16px; + height: 11px; + background-position: -112px -166px; +} + +.famfamfam-flags.ro { + width: 16px; + height: 11px; + background-position: -128px -166px; +} + +.famfamfam-flags.rs { + width: 16px; + height: 11px; + background-position: -144px -166px; +} + +.famfamfam-flags.ru { + width: 16px; + height: 11px; + background-position: -160px -166px; +} + +.famfamfam-flags.rw { + width: 16px; + height: 11px; + background-position: -176px -166px; +} + +.famfamfam-flags.sa { + width: 16px; + height: 11px; + background-position: 0px -177px; +} + +.famfamfam-flags.sb { + width: 16px; + height: 11px; + background-position: -16px -177px; +} + +.famfamfam-flags.sc { + width: 16px; + height: 11px; + background-position: -32px -177px; +} + +.famfamfam-flags.scotland { + width: 16px; + height: 11px; + background-position: -48px -177px; +} + +.famfamfam-flags.sd { + width: 16px; + height: 11px; + background-position: -64px -177px; +} + +.famfamfam-flags.se { + width: 16px; + height: 11px; + background-position: -80px -177px; +} + +.famfamfam-flags.sg { + width: 16px; + height: 11px; + background-position: -96px -177px; +} + +.famfamfam-flags.sh { + width: 16px; + height: 11px; + background-position: -112px -177px; +} + +.famfamfam-flags.si { + width: 16px; + height: 11px; + background-position: -128px -177px; +} + +.famfamfam-flags.sj { + width: 16px; + height: 11px; + background-position: -144px -177px; +} + +.famfamfam-flags.sk { + width: 16px; + height: 11px; + background-position: -160px -177px; +} + +.famfamfam-flags.sl { + width: 16px; + height: 11px; + background-position: -176px -177px; +} + +.famfamfam-flags.sm { + width: 16px; + height: 11px; + background-position: -192px 0px; +} + +.famfamfam-flags.sn { + width: 16px; + height: 11px; + background-position: -192px -11px; +} + +.famfamfam-flags.so { + width: 16px; + height: 11px; + background-position: -192px -22px; +} + +.famfamfam-flags.sr { + width: 16px; + height: 11px; + background-position: -192px -33px; +} + +.famfamfam-flags.st { + width: 16px; + height: 11px; + background-position: -192px -44px; +} + +.famfamfam-flags.sv { + width: 16px; + height: 11px; + background-position: -192px -55px; +} + +.famfamfam-flags.sy { + width: 16px; + height: 11px; + background-position: -192px -66px; +} + +.famfamfam-flags.sz { + width: 16px; + height: 11px; + background-position: -192px -77px; +} + +.famfamfam-flags.tc { + width: 16px; + height: 11px; + background-position: -192px -88px; +} + +.famfamfam-flags.td { + width: 16px; + height: 11px; + background-position: -192px -99px; +} + +.famfamfam-flags.tf { + width: 16px; + height: 11px; + background-position: -192px -110px; +} + +.famfamfam-flags.tg { + width: 16px; + height: 11px; + background-position: -192px -121px; +} + +.famfamfam-flags.th { + width: 16px; + height: 11px; + background-position: -192px -132px; +} + +.famfamfam-flags.tj { + width: 16px; + height: 11px; + background-position: -192px -143px; +} + +.famfamfam-flags.tk { + width: 16px; + height: 11px; + background-position: -192px -154px; +} + +.famfamfam-flags.tl { + width: 16px; + height: 11px; + background-position: -192px -165px; +} + +.famfamfam-flags.tm { + width: 16px; + height: 11px; + background-position: -192px -176px; +} + +.famfamfam-flags.tn { + width: 16px; + height: 11px; + background-position: 0px -188px; +} + +.famfamfam-flags.to { + width: 16px; + height: 11px; + background-position: -16px -188px; +} + +.famfamfam-flags.tr { + width: 16px; + height: 11px; + background-position: -32px -188px; +} + +.famfamfam-flags.tt { + width: 16px; + height: 11px; + background-position: -48px -188px; +} + +.famfamfam-flags.tv { + width: 16px; + height: 11px; + background-position: -64px -188px; +} + +.famfamfam-flags.tw { + width: 16px; + height: 11px; + background-position: -80px -188px; +} + +.famfamfam-flags.tz { + width: 16px; + height: 11px; + background-position: -96px -188px; +} + +.famfamfam-flags.ua { + width: 16px; + height: 11px; + background-position: -112px -188px; +} + +.famfamfam-flags.ug { + width: 16px; + height: 11px; + background-position: -128px -188px; +} + +.famfamfam-flags.um { + width: 16px; + height: 11px; + background-position: -144px -188px; +} + +.famfamfam-flags.us { + width: 16px; + height: 11px; + background-position: -160px -188px; +} + +.famfamfam-flags.uy { + width: 16px; + height: 11px; + background-position: -176px -188px; +} + +.famfamfam-flags.uz { + width: 16px; + height: 11px; + background-position: -192px -188px; +} + +.famfamfam-flags.va { + width: 16px; + height: 11px; + background-position: -208px 0px; +} + +.famfamfam-flags.vc { + width: 16px; + height: 11px; + background-position: -208px -11px; +} + +.famfamfam-flags.ve { + width: 16px; + height: 11px; + background-position: -208px -22px; +} + +.famfamfam-flags.vg { + width: 16px; + height: 11px; + background-position: -208px -33px; +} + +.famfamfam-flags.vi { + width: 16px; + height: 11px; + background-position: -208px -44px; +} + +.famfamfam-flags.vn { + width: 16px; + height: 11px; + background-position: -208px -55px; +} + +.famfamfam-flags.vu { + width: 16px; + height: 11px; + background-position: -208px -66px; +} + +.famfamfam-flags.wales { + width: 16px; + height: 11px; + background-position: -208px -77px; +} + +.famfamfam-flags.wf { + width: 16px; + height: 11px; + background-position: -208px -88px; +} + +.famfamfam-flags.ws { + width: 16px; + height: 11px; + background-position: -208px -99px; +} + +.famfamfam-flags.ye { + width: 16px; + height: 11px; + background-position: -208px -110px; +} + +.famfamfam-flags.yt { + width: 16px; + height: 11px; + background-position: -208px -121px; +} + +.famfamfam-flags.zw { + width: 16px; + height: 11px; + background-position: -208px -132px; +} + +.famfamfam-flags.ch { + width: 11px; + height: 11px; + background-position: -208px -143px; +} + +.famfamfam-flags.np { + width: 9px; + height: 11px; + background-position: -208px -154px; +} + diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.min.css b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.min.css new file mode 100644 index 00000000..23fce330 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.min.css @@ -0,0 +1 @@ +.famfamfam-flags{background:url(famfamfam-flags.png) no-repeat;background-size:224px 199px}.famfamfam-flags.me{width:16px;height:12px;background-position:0 0}.famfamfam-flags.ky{width:16px;height:11px;background-position:-16px 0}.famfamfam-flags.af{width:16px;height:11px;background-position:0 -12px}.famfamfam-flags.ag{width:16px;height:11px;background-position:-16px -12px}.famfamfam-flags.ai{width:16px;height:11px;background-position:-32px 0}.famfamfam-flags.al{width:16px;height:11px;background-position:-32px -11px}.famfamfam-flags.am{width:16px;height:11px;background-position:0 -23px}.famfamfam-flags.an{width:16px;height:11px;background-position:-16px -23px}.famfamfam-flags.ao{width:16px;height:11px;background-position:-32px -23px}.famfamfam-flags.ar{width:16px;height:11px;background-position:0 -34px}.famfamfam-flags.as{width:16px;height:11px;background-position:-16px -34px}.famfamfam-flags.at{width:16px;height:11px;background-position:-32px -34px}.famfamfam-flags.au{width:16px;height:11px;background-position:-48px 0}.famfamfam-flags.aw{width:16px;height:11px;background-position:-48px -11px}.famfamfam-flags.ax{width:16px;height:11px;background-position:-48px -22px}.famfamfam-flags.az{width:16px;height:11px;background-position:-48px -33px}.famfamfam-flags.ba{width:16px;height:11px;background-position:0 -45px}.famfamfam-flags.bb{width:16px;height:11px;background-position:-16px -45px}.famfamfam-flags.bd{width:16px;height:11px;background-position:-32px -45px}.famfamfam-flags.be{width:16px;height:11px;background-position:-48px -45px}.famfamfam-flags.bf{width:16px;height:11px;background-position:-64px 0}.famfamfam-flags.bg{width:16px;height:11px;background-position:-64px -11px}.famfamfam-flags.bh{width:16px;height:11px;background-position:-64px -22px}.famfamfam-flags.bi{width:16px;height:11px;background-position:-64px -33px}.famfamfam-flags.bj{width:16px;height:11px;background-position:-64px -44px}.famfamfam-flags.bm{width:16px;height:11px;background-position:0 -56px}.famfamfam-flags.bn{width:16px;height:11px;background-position:-16px -56px}.famfamfam-flags.bo{width:16px;height:11px;background-position:-32px -56px}.famfamfam-flags.br{width:16px;height:11px;background-position:-48px -56px}.famfamfam-flags.bs{width:16px;height:11px;background-position:-64px -56px}.famfamfam-flags.bt{width:16px;height:11px;background-position:0 -67px}.famfamfam-flags.bv{width:16px;height:11px;background-position:-16px -67px}.famfamfam-flags.bw{width:16px;height:11px;background-position:-32px -67px}.famfamfam-flags.by{width:16px;height:11px;background-position:-48px -67px}.famfamfam-flags.bz{width:16px;height:11px;background-position:-64px -67px}.famfamfam-flags.ca{width:16px;height:11px;background-position:-80px 0}.famfamfam-flags.catalonia{width:16px;height:11px;background-position:-80px -11px}.famfamfam-flags.cc{width:16px;height:11px;background-position:-80px -22px}.famfamfam-flags.cd{width:16px;height:11px;background-position:-80px -33px}.famfamfam-flags.cf{width:16px;height:11px;background-position:-80px -44px}.famfamfam-flags.cg{width:16px;height:11px;background-position:-80px -55px}.famfamfam-flags.zm{width:16px;height:11px;background-position:-80px -66px}.famfamfam-flags.ci{width:16px;height:11px;background-position:0 -78px}.famfamfam-flags.ck{width:16px;height:11px;background-position:-16px -78px}.famfamfam-flags.cl{width:16px;height:11px;background-position:-32px -78px}.famfamfam-flags.cm{width:16px;height:11px;background-position:-48px -78px}.famfamfam-flags.cn{width:16px;height:11px;background-position:-64px -78px}.famfamfam-flags.co{width:16px;height:11px;background-position:-80px -78px}.famfamfam-flags.cr{width:16px;height:11px;background-position:-96px 0}.famfamfam-flags.cs{width:16px;height:11px;background-position:-96px -11px}.famfamfam-flags.cu{width:16px;height:11px;background-position:-96px -22px}.famfamfam-flags.cv{width:16px;height:11px;background-position:-96px -33px}.famfamfam-flags.cx{width:16px;height:11px;background-position:-96px -44px}.famfamfam-flags.cy{width:16px;height:11px;background-position:-96px -55px}.famfamfam-flags.cz{width:16px;height:11px;background-position:-96px -66px}.famfamfam-flags.de{width:16px;height:11px;background-position:-96px -77px}.famfamfam-flags.dj{width:16px;height:11px;background-position:0 -89px}.famfamfam-flags.dk{width:16px;height:11px;background-position:-16px -89px}.famfamfam-flags.dm{width:16px;height:11px;background-position:-32px -89px}.famfamfam-flags.do{width:16px;height:11px;background-position:-48px -89px}.famfamfam-flags.dz{width:16px;height:11px;background-position:-64px -89px}.famfamfam-flags.ec{width:16px;height:11px;background-position:-80px -89px}.famfamfam-flags.ee{width:16px;height:11px;background-position:-96px -89px}.famfamfam-flags.eg{width:16px;height:11px;background-position:0 -100px}.famfamfam-flags.eh{width:16px;height:11px;background-position:-16px -100px}.famfamfam-flags.england{width:16px;height:11px;background-position:-32px -100px}.famfamfam-flags.er{width:16px;height:11px;background-position:-48px -100px}.famfamfam-flags.es{width:16px;height:11px;background-position:-64px -100px}.famfamfam-flags.et{width:16px;height:11px;background-position:-80px -100px}.famfamfam-flags.europeanunion{width:16px;height:11px;background-position:-96px -100px}.famfamfam-flags.fam{width:16px;height:11px;background-position:-112px 0}.famfamfam-flags.fi{width:16px;height:11px;background-position:-112px -11px}.famfamfam-flags.fj{width:16px;height:11px;background-position:-112px -22px}.famfamfam-flags.fk{width:16px;height:11px;background-position:-112px -33px}.famfamfam-flags.fm{width:16px;height:11px;background-position:-112px -44px}.famfamfam-flags.fo{width:16px;height:11px;background-position:-112px -55px}.famfamfam-flags.fr,.famfamfam-flags.gp,.famfamfam-flags.mf,.famfamfam-flags.re,.famfamfam-flags.yt{width:16px;height:11px;background-position:-112px -66px}.famfamfam-flags.ga{width:16px;height:11px;background-position:-112px -77px}.famfamfam-flags.gb{width:16px;height:11px;background-position:-112px -88px}.famfamfam-flags.gd{width:16px;height:11px;background-position:-112px -99px}.famfamfam-flags.ge{width:16px;height:11px;background-position:0 -111px}.famfamfam-flags.gf{width:16px;height:11px;background-position:-16px -111px}.famfamfam-flags.gg{width:16px;height:11px;background-position:-32px -111px}.famfamfam-flags.gh{width:16px;height:11px;background-position:-48px -111px}.famfamfam-flags.gi{width:16px;height:11px;background-position:-64px -111px}.famfamfam-flags.gl{width:16px;height:11px;background-position:-80px -111px}.famfamfam-flags.gm{width:16px;height:11px;background-position:-96px -111px}.famfamfam-flags.gn{width:16px;height:11px;background-position:-112px -111px}.famfamfam-flags.gp{width:16px;height:11px;background-position:-128px 0}.famfamfam-flags.gq{width:16px;height:11px;background-position:-128px -11px}.famfamfam-flags.gr{width:16px;height:11px;background-position:-128px -22px}.famfamfam-flags.gs{width:16px;height:11px;background-position:-128px -33px}.famfamfam-flags.gt{width:16px;height:11px;background-position:-128px -44px}.famfamfam-flags.gu{width:16px;height:11px;background-position:-128px -55px}.famfamfam-flags.gw{width:16px;height:11px;background-position:-128px -66px}.famfamfam-flags.gy{width:16px;height:11px;background-position:-128px -77px}.famfamfam-flags.hk{width:16px;height:11px;background-position:-128px -88px}.famfamfam-flags.hm{width:16px;height:11px;background-position:-128px -99px}.famfamfam-flags.hn{width:16px;height:11px;background-position:-128px -110px}.famfamfam-flags.hr{width:16px;height:11px;background-position:0 -122px}.famfamfam-flags.ht{width:16px;height:11px;background-position:-16px -122px}.famfamfam-flags.hu{width:16px;height:11px;background-position:-32px -122px}.famfamfam-flags.id{width:16px;height:11px;background-position:-48px -122px}.famfamfam-flags.ie{width:16px;height:11px;background-position:-64px -122px}.famfamfam-flags.il{width:16px;height:11px;background-position:-80px -122px}.famfamfam-flags.in{width:16px;height:11px;background-position:-96px -122px}.famfamfam-flags.io{width:16px;height:11px;background-position:-112px -122px}.famfamfam-flags.iq{width:16px;height:11px;background-position:-128px -122px}.famfamfam-flags.ir{width:16px;height:11px;background-position:0 -133px}.famfamfam-flags.is{width:16px;height:11px;background-position:-16px -133px}.famfamfam-flags.it{width:16px;height:11px;background-position:-32px -133px}.famfamfam-flags.je{width:16px;height:11px;background-position:-48px -133px}.famfamfam-flags.jm{width:16px;height:11px;background-position:-64px -133px}.famfamfam-flags.jo{width:16px;height:11px;background-position:-80px -133px}.famfamfam-flags.jp{width:16px;height:11px;background-position:-96px -133px}.famfamfam-flags.ke{width:16px;height:11px;background-position:-112px -133px}.famfamfam-flags.kg{width:16px;height:11px;background-position:-128px -133px}.famfamfam-flags.kh{width:16px;height:11px;background-position:-144px 0}.famfamfam-flags.ki{width:16px;height:11px;background-position:-144px -11px}.famfamfam-flags.km{width:16px;height:11px;background-position:-144px -22px}.famfamfam-flags.kn{width:16px;height:11px;background-position:-144px -33px}.famfamfam-flags.kp{width:16px;height:11px;background-position:-144px -44px}.famfamfam-flags.kr{width:16px;height:11px;background-position:-144px -55px}.famfamfam-flags.kw{width:16px;height:11px;background-position:-144px -66px}.famfamfam-flags.ae{width:16px;height:11px;background-position:-144px -77px}.famfamfam-flags.kz{width:16px;height:11px;background-position:-144px -88px}.famfamfam-flags.la{width:16px;height:11px;background-position:-144px -99px}.famfamfam-flags.lb{width:16px;height:11px;background-position:-144px -110px}.famfamfam-flags.lc{width:16px;height:11px;background-position:-144px -121px}.famfamfam-flags.li{width:16px;height:11px;background-position:-144px -132px}.famfamfam-flags.lk{width:16px;height:11px;background-position:0 -144px}.famfamfam-flags.lr{width:16px;height:11px;background-position:-16px -144px}.famfamfam-flags.ls{width:16px;height:11px;background-position:-32px -144px}.famfamfam-flags.lt{width:16px;height:11px;background-position:-48px -144px}.famfamfam-flags.lu{width:16px;height:11px;background-position:-64px -144px}.famfamfam-flags.lv{width:16px;height:11px;background-position:-80px -144px}.famfamfam-flags.ly{width:16px;height:11px;background-position:-96px -144px}.famfamfam-flags.ma{width:16px;height:11px;background-position:-112px -144px}.famfamfam-flags.mc{width:16px;height:11px;background-position:-128px -144px}.famfamfam-flags.md{width:16px;height:11px;background-position:-144px -144px}.famfamfam-flags.ad{width:16px;height:11px;background-position:-160px 0}.famfamfam-flags.mg{width:16px;height:11px;background-position:-160px -11px}.famfamfam-flags.mh{width:16px;height:11px;background-position:-160px -22px}.famfamfam-flags.mk{width:16px;height:11px;background-position:-160px -33px}.famfamfam-flags.ml{width:16px;height:11px;background-position:-160px -44px}.famfamfam-flags.mm{width:16px;height:11px;background-position:-160px -55px}.famfamfam-flags.mn{width:16px;height:11px;background-position:-160px -66px}.famfamfam-flags.mo{width:16px;height:11px;background-position:-160px -77px}.famfamfam-flags.mp{width:16px;height:11px;background-position:-160px -88px}.famfamfam-flags.mq{width:16px;height:11px;background-position:-160px -99px}.famfamfam-flags.mr{width:16px;height:11px;background-position:-160px -110px}.famfamfam-flags.ms{width:16px;height:11px;background-position:-160px -121px}.famfamfam-flags.mt{width:16px;height:11px;background-position:-160px -132px}.famfamfam-flags.mu{width:16px;height:11px;background-position:-160px -143px}.famfamfam-flags.mv{width:16px;height:11px;background-position:0 -155px}.famfamfam-flags.mw{width:16px;height:11px;background-position:-16px -155px}.famfamfam-flags.mx{width:16px;height:11px;background-position:-32px -155px}.famfamfam-flags.my{width:16px;height:11px;background-position:-48px -155px}.famfamfam-flags.mz{width:16px;height:11px;background-position:-64px -155px}.famfamfam-flags.na{width:16px;height:11px;background-position:-80px -155px}.famfamfam-flags.nc{width:16px;height:11px;background-position:-96px -155px}.famfamfam-flags.ne{width:16px;height:11px;background-position:-112px -155px}.famfamfam-flags.nf{width:16px;height:11px;background-position:-128px -155px}.famfamfam-flags.ng{width:16px;height:11px;background-position:-144px -155px}.famfamfam-flags.ni{width:16px;height:11px;background-position:-160px -155px}.famfamfam-flags.bq,.famfamfam-flags.nl{width:16px;height:11px;background-position:-176px 0}.famfamfam-flags.no{width:16px;height:11px;background-position:-176px -11px}.famfamfam-flags.za{width:16px;height:11px;background-position:-176px -22px}.famfamfam-flags.nr{width:16px;height:11px;background-position:-176px -33px}.famfamfam-flags.nu{width:16px;height:11px;background-position:-176px -44px}.famfamfam-flags.nz{width:16px;height:11px;background-position:-176px -55px}.famfamfam-flags.om{width:16px;height:11px;background-position:-176px -66px}.famfamfam-flags.pa{width:16px;height:11px;background-position:-176px -77px}.famfamfam-flags.pe{width:16px;height:11px;background-position:-176px -88px}.famfamfam-flags.pf{width:16px;height:11px;background-position:-176px -99px}.famfamfam-flags.pg{width:16px;height:11px;background-position:-176px -110px}.famfamfam-flags.ph{width:16px;height:11px;background-position:-176px -121px}.famfamfam-flags.pk{width:16px;height:11px;background-position:-176px -132px}.famfamfam-flags.pl{width:16px;height:11px;background-position:-176px -143px}.famfamfam-flags.pm{width:16px;height:11px;background-position:-176px -154px}.famfamfam-flags.pn{width:16px;height:11px;background-position:0 -166px}.famfamfam-flags.pr{width:16px;height:11px;background-position:-16px -166px}.famfamfam-flags.ps{width:16px;height:11px;background-position:-32px -166px}.famfamfam-flags.pt{width:16px;height:11px;background-position:-48px -166px}.famfamfam-flags.pw{width:16px;height:11px;background-position:-64px -166px}.famfamfam-flags.py{width:16px;height:11px;background-position:-80px -166px}.famfamfam-flags.qa{width:16px;height:11px;background-position:-96px -166px}.famfamfam-flags.re{width:16px;height:11px;background-position:-112px -166px}.famfamfam-flags.ro{width:16px;height:11px;background-position:-128px -166px}.famfamfam-flags.rs{width:16px;height:11px;background-position:-144px -166px}.famfamfam-flags.ru{width:16px;height:11px;background-position:-160px -166px}.famfamfam-flags.rw{width:16px;height:11px;background-position:-176px -166px}.famfamfam-flags.sa{width:16px;height:11px;background-position:0 -177px}.famfamfam-flags.sb{width:16px;height:11px;background-position:-16px -177px}.famfamfam-flags.sc{width:16px;height:11px;background-position:-32px -177px}.famfamfam-flags.scotland{width:16px;height:11px;background-position:-48px -177px}.famfamfam-flags.sd{width:16px;height:11px;background-position:-64px -177px}.famfamfam-flags.se{width:16px;height:11px;background-position:-80px -177px}.famfamfam-flags.sg{width:16px;height:11px;background-position:-96px -177px}.famfamfam-flags.sh{width:16px;height:11px;background-position:-112px -177px}.famfamfam-flags.si{width:16px;height:11px;background-position:-128px -177px}.famfamfam-flags.sj{width:16px;height:11px;background-position:-144px -177px}.famfamfam-flags.sk{width:16px;height:11px;background-position:-160px -177px}.famfamfam-flags.sl{width:16px;height:11px;background-position:-176px -177px}.famfamfam-flags.sm{width:16px;height:11px;background-position:-192px 0}.famfamfam-flags.sn{width:16px;height:11px;background-position:-192px -11px}.famfamfam-flags.so{width:16px;height:11px;background-position:-192px -22px}.famfamfam-flags.sr{width:16px;height:11px;background-position:-192px -33px}.famfamfam-flags.st{width:16px;height:11px;background-position:-192px -44px}.famfamfam-flags.sv{width:16px;height:11px;background-position:-192px -55px}.famfamfam-flags.sy{width:16px;height:11px;background-position:-192px -66px}.famfamfam-flags.sz{width:16px;height:11px;background-position:-192px -77px}.famfamfam-flags.tc{width:16px;height:11px;background-position:-192px -88px}.famfamfam-flags.td{width:16px;height:11px;background-position:-192px -99px}.famfamfam-flags.tf{width:16px;height:11px;background-position:-192px -110px}.famfamfam-flags.tg{width:16px;height:11px;background-position:-192px -121px}.famfamfam-flags.th{width:16px;height:11px;background-position:-192px -132px}.famfamfam-flags.tj{width:16px;height:11px;background-position:-192px -143px}.famfamfam-flags.tk{width:16px;height:11px;background-position:-192px -154px}.famfamfam-flags.tl{width:16px;height:11px;background-position:-192px -165px}.famfamfam-flags.tm{width:16px;height:11px;background-position:-192px -176px}.famfamfam-flags.tn{width:16px;height:11px;background-position:0 -188px}.famfamfam-flags.to{width:16px;height:11px;background-position:-16px -188px}.famfamfam-flags.tr{width:16px;height:11px;background-position:-32px -188px}.famfamfam-flags.tt{width:16px;height:11px;background-position:-48px -188px}.famfamfam-flags.tv{width:16px;height:11px;background-position:-64px -188px}.famfamfam-flags.tw{width:16px;height:11px;background-position:-80px -188px}.famfamfam-flags.tz{width:16px;height:11px;background-position:-96px -188px}.famfamfam-flags.ua{width:16px;height:11px;background-position:-112px -188px}.famfamfam-flags.ug{width:16px;height:11px;background-position:-128px -188px}.famfamfam-flags.um{width:16px;height:11px;background-position:-144px -188px}.famfamfam-flags.us{width:16px;height:11px;background-position:-160px -188px}.famfamfam-flags.uy{width:16px;height:11px;background-position:-176px -188px}.famfamfam-flags.uz{width:16px;height:11px;background-position:-192px -188px}.famfamfam-flags.va{width:16px;height:11px;background-position:-208px 0}.famfamfam-flags.vc{width:16px;height:11px;background-position:-208px -11px}.famfamfam-flags.ve{width:16px;height:11px;background-position:-208px -22px}.famfamfam-flags.vg{width:16px;height:11px;background-position:-208px -33px}.famfamfam-flags.vi{width:16px;height:11px;background-position:-208px -44px}.famfamfam-flags.vn{width:16px;height:11px;background-position:-208px -55px}.famfamfam-flags.vu{width:16px;height:11px;background-position:-208px -66px}.famfamfam-flags.wales{width:16px;height:11px;background-position:-208px -77px}.famfamfam-flags.wf{width:16px;height:11px;background-position:-208px -88px}.famfamfam-flags.ws{width:16px;height:11px;background-position:-208px -99px}.famfamfam-flags.ye{width:16px;height:11px;background-position:-208px -110px}.famfamfam-flags.yt{width:16px;height:11px;background-position:-208px -121px}.famfamfam-flags.zw{width:16px;height:11px;background-position:-208px -132px}.famfamfam-flags.ch{width:11px;height:11px;background-position:-208px -143px}.famfamfam-flags.np{width:9px;height:11px;background-position:-208px -154px} \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.png b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.png new file mode 100644 index 00000000..c820e3bd Binary files /dev/null and b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/famfamfam-flags/dist/sprite/famfamfam-flags.png differ diff --git a/src/SplashPage.Web.Mvc/wwwroot/libs-ext/spin/jquery.spin.js b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/spin/jquery.spin.js new file mode 100644 index 00000000..16050bc0 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/libs-ext/spin/jquery.spin.js @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2011-2014 Felix Gnass + * Licensed under the MIT license + * http://spin.js.org/ + */ + +/* + +Basic Usage: +============ + +$('#el').spin() // Creates a default Spinner using the text color of #el. +$('#el').spin({ ... }) // Creates a Spinner using the provided options. + +$('#el').spin(false) // Stops and removes the spinner. + +Using Presets: +============== + +$('#el').spin('small') // Creates a 'small' Spinner using the text color of #el. +$('#el').spin('large', '#fff') // Creates a 'large' white Spinner. + +Adding a custom preset: +======================= + +$.fn.spin.presets.flower = { + lines: 9 +, length: 10 +, width: 20 +, radius: 0 +} + +$('#el').spin('flower', 'red') + +*/ + +;(function(factory) { + + if (typeof exports == 'object') { + // CommonJS + factory(require('jquery'), require('spin.js')) + } else if (typeof define == 'function' && define.amd) { + // AMD, register as anonymous module + define(['jquery', 'spin'], factory) + } else { + // Browser globals + if (!window.Spinner) throw new Error('Spin.js not present') + factory(window.jQuery, window.Spinner) + } + +}(function($, Spinner) { + + $.fn.spin = function(opts, color) { + + return this.each(function() { + var $this = $(this) + , data = $this.data() + + if (data.spinner) { + data.spinner.stop() + delete data.spinner + } + if (opts !== false) { + opts = $.extend( + { color: color || $this.css('color') } + , $.fn.spin.presets[opts] || opts + ) + data.spinner = new Spinner(opts).spin(this) + } + }) + } + + $.fn.spin.presets = { + tiny: { lines: 8, length: 2, width: 2, radius: 3 } + , small: { lines: 8, length: 4, width: 3, radius: 5 } + , large: { lines: 10, length: 8, width: 4, radius: 8 } + } + +})); diff --git a/src/SplashPage.Web.Mvc/wwwroot/scss/_custom.scss b/src/SplashPage.Web.Mvc/wwwroot/scss/_custom.scss new file mode 100644 index 00000000..4a7a3572 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/scss/_custom.scss @@ -0,0 +1,27 @@ +/* prevent the drop down icon going onto a new line for the top bar language link */ +.top-bar-language-nav-link { + min-width: 65px; +} + +/* bootstrap model showing two scroll bars */ +html { + overflow: visible; +} + +/* main sidebar not under model */ +.modal { + z-index: 1110; +} + +.form-group.required .col-form-label:after { + color: #d00; + content: "*"; + position: absolute; + margin-left: 3px; +} + +.nav-user-menu .user-image { + width: 20px; + margin-right: 4px; + margin-top: -4px; +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/scss/style.scss b/src/SplashPage.Web.Mvc/wwwroot/scss/style.scss new file mode 100644 index 00000000..3459a93e --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/scss/style.scss @@ -0,0 +1 @@ +@import "custom"; diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Error403.css b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Error403.css new file mode 100644 index 00000000..622bcc4e --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Error403.css @@ -0,0 +1,7 @@ +.login-box { + width: inherit; +} + +.forbidden-box { + max-width: 350px; +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Error403.scss b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Error403.scss new file mode 100644 index 00000000..cfe7c738 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Error403.scss @@ -0,0 +1,7 @@ +.login-box { + width: inherit; +} + +.forbidden-box { + max-width: 350px; +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Login.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Login.js new file mode 100644 index 00000000..b2f9e8ae --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Login.js @@ -0,0 +1,23 @@ +(function () { + $('#ReturnUrlHash').val(location.hash); + + var _$form = $('#LoginForm'); + + _$form.submit(function (e) { + e.preventDefault(); + + if (!_$form.valid()) { + return; + } + + abp.ui.setBusy( + $('body'), + + abp.ajax({ + contentType: 'application/x-www-form-urlencoded', + url: _$form.attr('action'), + data: _$form.serialize() + }) + ); + }); +})(); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Register.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Register.js new file mode 100644 index 00000000..4db3f8ad --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/Register.js @@ -0,0 +1,21 @@ +(function () { + var _$form = $('#RegisterForm'); + + $.validator.addMethod("customUsername", function (value, element) { + if (value === _$form.find('input[name="EmailAddress"]').val()) { + return true; + } + + //Username can not be an email address (except the email address entered) + return !$.validator.methods.email.apply(this, arguments); + }, abp.localization.localize("RegisterFormUserNameInvalidMessage", "SplashPage")); + + _$form.validate({ + rules: { + UserName: { + required: true, + customUsername: true + } + } + }); +})(); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/_Layout.css b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/_Layout.css new file mode 100644 index 00000000..4d097878 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/_Layout.css @@ -0,0 +1,10 @@ +.form-group.required .col-form-label:after { + color: #d00; + content: "*"; + position: absolute; + margin-left: 3px; } + +.nav-user-menu .user-image { + width: 20px; + margin-right: 4px; + margin-top: -4px; } diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/_Layout.scss b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/_Layout.scss new file mode 100644 index 00000000..bc421be2 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Account/_Layout.scss @@ -0,0 +1,12 @@ +.form-group.required .col-form-label:after { + color: #d00; + content: "*"; + position: absolute; + margin-left: 3px; +} + +.nav-user-menu .user-image { + width: 20px; + margin-right: 4px; + margin-top: -4px; +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Home/Index.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Home/Index.js new file mode 100644 index 00000000..4938287a --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Home/Index.js @@ -0,0 +1,95 @@ +$(function () { + + 'use strict'; + + /* ChartJS + * ------- + * Here we will create a few charts using ChartJS + */ + + //----------------------- + //- MONTHLY SALES CHART - + //----------------------- + + // Get context with jQuery - using jQuery's .get() method. + var salesChartCanvas = $('#salesChart').get(0).getContext('2d'); + // This will get the first returned node in the jQuery collection. + + var salesChartData = { + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + datasets: [ + { + label: 'Electronics', + fill: '#dee2e6', + borderColor: '#ced4da', + pointBackgroundColor: '#ced4da', + pointBorderColor: '#c1c7d1', + pointHoverBackgroundColor: '#fff', + pointHoverBorderColor: 'rgb(220,220,220)', + spanGaps: true, + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: 'Digital Goods', + fill: 'rgba(0, 123, 255, 0.9)', + borderColor: 'rgba(0, 123, 255, 1)', + pointBackgroundColor: '#3b8bba', + pointBorderColor: 'rgba(0, 123, 255, 1)', + pointHoverBackgroundColor: '#fff', + pointHoverBorderColor: 'rgba(0, 123, 255, 1)', + spanGaps: true, + data: [28, 48, 40, 19, 86, 27, 90] + } + ] + }; + + var salesChartOptions = { + //Boolean - If we should show the scale at all + showScale: true, + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: false, + //String - Colour of the grid lines + scaleGridLineColor: 'rgba(0,0,0,.05)', + //Number - Width of the grid lines + scaleGridLineWidth: 1, + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + //Boolean - Whether the line is curved between points + bezierCurve: true, + //Number - Tension of the bezier curve between points + bezierCurveTension: 0.3, + //Boolean - Whether to show a dot for each point + pointDot: false, + //Number - Radius of each point dot in pixels + pointDotRadius: 4, + //Number - Pixel width of point dot stroke + pointDotStrokeWidth: 1, + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius: 20, + //Boolean - Whether to show a stroke for datasets + datasetStroke: true, + //Number - Pixel width of dataset stroke + datasetStrokeWidth: 2, + //Boolean - Whether to fill the dataset with a color + datasetFill: true, + //String - A legend template + legendTemplate: '
      <% for (var i=0; i
    • <%=datasets[i].label%>
    • <%}%>
    ', + //Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: false, + //Boolean - whether to make the chart responsive to window resizing + responsive: true + }; + + //Create the line chart + var salesChart = new Chart(salesChartCanvas, { + type: 'line', + data: salesChartData, + options: salesChartOptions + }); + + //--------------------------- + //- END MONTHLY SALES CHART - + //--------------------------- +}); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Roles/Index.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Roles/Index.js new file mode 100644 index 00000000..349bc98e --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Roles/Index.js @@ -0,0 +1,158 @@ +(function ($) { + var _roleService = abp.services.app.role, + l = abp.localization.getSource('SplashPage'), + _$modal = $('#RoleCreateModal'), + _$form = _$modal.find('form'), + _$table = $('#RolesTable'); + + var _$rolesTable = _$table.DataTable({ + paging: true, + serverSide: true, + processing: true, + listAction: { + ajaxFunction: _roleService.getAll, + inputFilter: function () { + return $('#RolesSearchForm').serializeFormToObject(true); + } + }, + buttons: [ + { + name: 'refresh', + text: '', + action: () => _$rolesTable.draw(false) + } + ], + responsive: { + details: { + type: 'column' + } + }, + columnDefs: [ + { + targets: 0, + className: 'control', + defaultContent: '', + orderable: false, + }, + { + targets: 1, + data: 'name', + }, + { + targets: 2, + data: 'displayName', + }, + { + targets: 3, + data: null, + orderable: false, + autoWidth: false, + defaultContent: '', + render: (data, type, row, meta) => { + return [ + ` ', + ` ', + ].join(''); + } + } + ] + }); + + _$form.find('.save-button').on('click', (e) => { + e.preventDefault(); + + if (!_$form.valid()) { + return; + } + + var role = _$form.serializeFormToObject(); + role.grantedPermissions = []; + var _$permissionCheckboxes = _$form[0].querySelectorAll("input[name='permission']:checked"); + if (_$permissionCheckboxes) { + for (var permissionIndex = 0; permissionIndex < _$permissionCheckboxes.length; permissionIndex++) { + var _$permissionCheckbox = $(_$permissionCheckboxes[permissionIndex]); + role.grantedPermissions.push(_$permissionCheckbox.val()); + } + } + + abp.ui.setBusy(_$modal); + _roleService + .create(role) + .done(function () { + _$modal.modal('hide'); + _$form[0].reset(); + abp.notify.info(l('SavedSuccessfully')); + _$rolesTable.ajax.reload(); + }) + .always(function () { + abp.ui.clearBusy(_$modal); + }); + }); + + $(document).on('click', '.delete-role', function () { + var roleId = $(this).attr("data-role-id"); + var roleName = $(this).attr('data-role-name'); + + deleteRole(roleId, roleName); + }); + + $(document).on('click', '.edit-role', function (e) { + var roleId = $(this).attr("data-role-id"); + + e.preventDefault(); + abp.ajax({ + url: abp.appPath + 'Roles/EditModal?roleId=' + roleId, + type: 'POST', + dataType: 'html', + success: function (content) { + $('#RoleEditModal div.modal-content').html(content); + }, + error: function (e) { + } + }) + }); + + abp.event.on('role.edited', (data) => { + _$rolesTable.ajax.reload(); + }); + + function deleteRole(roleId, roleName) { + abp.message.confirm( + abp.utils.formatString( + l('AreYouSureWantToDelete'), + roleName), + null, + (isConfirmed) => { + if (isConfirmed) { + _roleService.delete({ + id: roleId + }).done(() => { + abp.notify.info(l('SuccessfullyDeleted')); + _$rolesTable.ajax.reload(); + }); + } + } + ); + } + + _$modal.on('shown.bs.modal', () => { + _$modal.find('input:not([type=hidden]):first').focus(); + }).on('hidden.bs.modal', () => { + _$form.clearForm(); + }); + + $('.btn-search').on('click', (e) => { + _$rolesTable.ajax.reload(); + }); + + $('.txt-search').on('keypress', (e) => { + if (e.which == 13) { + _$rolesTable.ajax.reload(); + return false; + } + }); +})(jQuery); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Roles/_EditModal.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Roles/_EditModal.js new file mode 100644 index 00000000..90be91da --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Roles/_EditModal.js @@ -0,0 +1,47 @@ +(function ($) { + var _roleService = abp.services.app.role, + l = abp.localization.getSource('SplashPage'), + _$modal = $('#RoleEditModal'), + _$form = _$modal.find('form'); + + function save() { + if (!_$form.valid()) { + return; + } + + var role = _$form.serializeFormToObject(); + role.grantedPermissions = []; + var _$permissionCheckboxes = _$form[0].querySelectorAll("input[name='permission']:checked"); + if (_$permissionCheckboxes) { + for (var permissionIndex = 0; permissionIndex < _$permissionCheckboxes.length; permissionIndex++) { + var _$permissionCheckbox = $(_$permissionCheckboxes[permissionIndex]); + role.grantedPermissions.push(_$permissionCheckbox.val()); + } + } + + abp.ui.setBusy(_$form); + _roleService.update(role).done(function () { + _$modal.modal('hide'); + abp.notify.info(l('SavedSuccessfully')); + abp.event.trigger('role.edited', role); + }).always(function () { + abp.ui.clearBusy(_$form); + }); + } + + _$form.closest('div.modal-content').find(".save-button").click(function (e) { + e.preventDefault(); + save(); + }); + + _$form.find('input').on('keypress', function (e) { + if (e.which === 13) { + e.preventDefault(); + save(); + } + }); + + _$modal.on('shown.bs.modal', function () { + _$form.find('input[type=text]:first').focus(); + }); +})(jQuery); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/Components/TenantChange/Default.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/Components/TenantChange/Default.js new file mode 100644 index 00000000..78a70085 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/Components/TenantChange/Default.js @@ -0,0 +1,15 @@ +(function () { + $('.tenant-change-component a') + .click(function (e) { + e.preventDefault(); + abp.ajax({ + url: abp.appPath + 'Account/TenantChangeModal', + type: 'POST', + dataType: 'html', + success: function (content) { + $('#TenantChangeModal div.modal-content').html(content); + }, + error: function (e) { } + }); + }); +})(); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/Components/TenantChange/_ChangeModal.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/Components/TenantChange/_ChangeModal.js new file mode 100644 index 00000000..642bbced --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/Components/TenantChange/_ChangeModal.js @@ -0,0 +1,54 @@ +(function ($) { + var _accountService = abp.services.app.account; + var _$form = $('form[name=TenantChangeForm]'); + + function switchToSelectedTenant () { + var tenancyName = _$form.find('input[name=TenancyName]').val(); + + if (!tenancyName) { + abp.multiTenancy.setTenantIdCookie(null); + location.reload(); + return; + } + + _accountService.isTenantAvailable({ + tenancyName: tenancyName + }).done(function (result) { + switch (result.state) { + case 1: //Available + abp.multiTenancy.setTenantIdCookie(result.tenantId); + //_modalManager.close(); + location.reload(); + return; + case 2: //InActive + abp.message.warn(abp.utils.formatString(abp.localization + .localize("TenantIsNotActive", "SplashPage"), + tenancyName)); + break; + case 3: //NotFound + abp.message.warn(abp.utils.formatString(abp.localization + .localize("ThereIsNoTenantDefinedWithName{0}", "SplashPage"), + tenancyName)); + break; + } + }); + } + + //Handle save button click + _$form.closest('div.modal-content').find(".save-button").click(function (e) { + e.preventDefault(); + switchToSelectedTenant(); + }); + + //Handle enter key + _$form.find('input').on('keypress', function (e) { + if (e.which === 13) { + e.preventDefault(); + switchToSelectedTenant(); + } + }); + + $('#TenantChangeModal').on('shown.bs.modal', function () { + _$form.find('input[type=text]:first').focus(); + }); +})(jQuery); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/_Layout.css b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/_Layout.css new file mode 100644 index 00000000..c8a3ca64 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/_Layout.css @@ -0,0 +1,27 @@ +.form-group.required .col-form-label:after { + color: #d00; + content: "*"; + position: absolute; + margin-left: 3px; +} + +.nav-user-menu .user-image { + width: 20px; + margin-right: 4px; + margin-top: -4px; +} + +.dataTables_wrapper * { + font-size: 14px !important; +} + +.dataTables_wrapper table th { + padding: 8px; + vertical-align: middle; + border-top-width: 0 !important; +} + +.dataTables_wrapper table td { + padding: 8px; + vertical-align: middle; +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/_Layout.scss b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/_Layout.scss new file mode 100644 index 00000000..bc421be2 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Shared/_Layout.scss @@ -0,0 +1,12 @@ +.form-group.required .col-form-label:after { + color: #d00; + content: "*"; + position: absolute; + margin-left: 3px; +} + +.nav-user-menu .user-image { + width: 20px; + margin-right: 4px; + margin-top: -4px; +} diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Tenants/Index.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Tenants/Index.js new file mode 100644 index 00000000..799f57a2 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Tenants/Index.js @@ -0,0 +1,163 @@ +(function ($) { + var _tenantService = abp.services.app.tenant, + l = abp.localization.getSource('SplashPage'), + _$modal = $('#TenantCreateModal'), + _$form = _$modal.find('form'), + _$table = $('#TenantsTable'); + + var _$tenantsTable = _$table.DataTable({ + paging: true, + serverSide: true, + processing: true, + listAction: { + ajaxFunction: _tenantService.getAll, + inputFilter: function () { + return $('#TenantsSearchForm').serializeFormToObject(true); + } + }, + buttons: [ + { + name: 'refresh', + text: '', + action: () => _$tenantsTable.draw(false) + } + ], + responsive: { + details: { + type: 'column' + } + }, + columnDefs: [ + { + targets: 0, + className: 'control', + defaultContent: '', + }, + { + targets: 1, + data: 'tenancyName', + }, + { + targets: 2, + data: 'name', + }, + { + targets: 3, + data: 'isActive', + orderable: false, + render: data => `` + }, + { + targets: 4, + data: null, + orderable: false, + autoWidth: false, + defaultContent: '', + render: (data, type, row, meta) => { + return [ + ` ', + ` ' + ].join(''); + } + } + ] + }); + _$form.find('.save-button').click(function (e) { + e.preventDefault(); + + if (!_$form.valid()) { + return; + } + + var tenant = _$form.serializeFormToObject(); + + abp.ui.setBusy(_$modal); + + _tenantService + .create(tenant) + .done(function () { + _$modal.modal('hide'); + _$form[0].reset(); + abp.notify.info(l('SavedSuccessfully')); + _$tenantsTable.ajax.reload(); + }) + .always(function () { + abp.ui.clearBusy(_$modal); + }); + }); + + $(document).on('click', '.delete-tenant', function () { + var tenantId = $(this).attr('data-tenant-id'); + var tenancyName = $(this).attr('data-tenancy-name'); + + deleteTenant(tenantId, tenancyName); + }); + + $(document).on('click', '.edit-tenant', function (e) { + var tenantId = $(this).attr('data-tenant-id'); + + abp.ajax({ + url: abp.appPath + 'Tenants/EditModal?tenantId=' + tenantId, + type: 'POST', + dataType: 'html', + success: function (content) { + $('#TenantEditModal div.modal-content').html(content); + }, + error: function (e) { + } + }); + }); + + abp.event.on('tenant.edited', (data) => { + _$tenantsTable.ajax.reload(); + }); + + function deleteTenant(tenantId, tenancyName) { + abp.message.confirm( + abp.utils.formatString( + l('AreYouSureWantToDelete'), + tenancyName + ), + null, + (isConfirmed) => { + if (isConfirmed) { + _tenantService + .delete({ + id: tenantId + }) + .done(() => { + abp.notify.info(l('SuccessfullyDeleted')); + _$tenantsTable.ajax.reload(); + }); + } + } + ); + } + + _$modal.on('shown.bs.modal', () => { + _$modal.find('input:not([type=hidden]):first').focus(); + }).on('hidden.bs.modal', () => { + _$form.clearForm(); + }); + + $('.btn-search').on('click', (e) => { + _$tenantsTable.ajax.reload(); + }); + + $('.btn-clear').on('click', (e) => { + $('input[name=Keyword]').val(''); + $('input[name=IsActive][value=""]').prop('checked', true); + _$tenantsTable.ajax.reload(); + }); + + $('.txt-search').on('keypress', (e) => { + if (e.which == 13) { + _$tenantsTable.ajax.reload(); + return false; + } + }); +})(jQuery); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Tenants/_EditModal.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Tenants/_EditModal.js new file mode 100644 index 00000000..22a3cf4c --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Tenants/_EditModal.js @@ -0,0 +1,39 @@ +(function ($) { + var _tenantService = abp.services.app.tenant, + l = abp.localization.getSource('SplashPage'), + _$modal = $('#TenantEditModal'), + _$form = _$modal.find('form'); + + function save() { + if (!_$form.valid()) { + return; + } + + var tenant = _$form.serializeFormToObject(); + + abp.ui.setBusy(_$form); + _tenantService.update(tenant).done(function () { + _$modal.modal('hide'); + abp.notify.info(l('SavedSuccessfully')); + abp.event.trigger('tenant.edited', tenant); + }).always(function () { + abp.ui.clearBusy(_$form); + }); + } + + _$form.closest('div.modal-content').find(".save-button").click(function (e) { + e.preventDefault(); + save(); + }); + + _$form.find('input').on('keypress', function (e) { + if (e.which === 13) { + e.preventDefault(); + save(); + } + }); + + _$modal.on('shown.bs.modal', function () { + _$form.find('input[type=text]:first').focus(); + }); +})(jQuery); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/ChangePassword.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/ChangePassword.js new file mode 100644 index 00000000..9a437391 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/ChangePassword.js @@ -0,0 +1,54 @@ +(function ($) { + var _userService = abp.services.app.user, + l = abp.localization.getSource('SplashPage'), + _$form = $('#ChangePassword'); + + $.validator.addMethod("regex", function (value, element, regexpr) { + return regexpr.test(value); + }, l("PasswordsMustBeAtLeast8CharactersContainLowercaseUppercaseNumber")); + + _$form.validate({ + rules: { + NewPassword: { + regex: /(?=^.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)[0-9a-zA-Z!@#$%^&*()]*$/ + }, + ConfirmNewPassword: { + equalTo: "#NewPassword" + } + }, + messages: { + ConfirmNewPassword: { + equalTo: l("PasswordsDoNotMatch") + } + } + }); + + function save() { + if (!_$form.valid()) { + return; + } + + var changePasswordDto = _$form.serializeFormToObject(); + + abp.ui.setBusy(_$form); + var skipClearBusy = false; + _userService.changePassword(changePasswordDto).done(success => { + if (success) { + skipClearBusy = true; + abp.notify.info(l('SavedSuccessfully')); + setTimeout(() => { + window.location.href = "/"; + }, 1200); + } + }).always(function () { + if (!skipClearBusy) { + abp.ui.clearBusy(_$form); + } + }); + } + + _$form.submit(function (e) { + e.preventDefault(); + save(); + }); +})(jQuery); \ No newline at end of file diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/Index.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/Index.js new file mode 100644 index 00000000..510211b4 --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/Index.js @@ -0,0 +1,179 @@ +(function ($) { + var _userService = abp.services.app.user, + l = abp.localization.getSource('SplashPage'), + _$modal = $('#UserCreateModal'), + _$form = _$modal.find('form'), + _$table = $('#UsersTable'); + + var _$usersTable = _$table.DataTable({ + paging: true, + serverSide: true, + processing: true, + listAction: { + ajaxFunction: _userService.getAll, + inputFilter: function () { + return $('#UsersSearchForm').serializeFormToObject(true); + } + }, + buttons: [ + { + name: 'refresh', + text: '', + action: () => _$usersTable.draw(false) + } + ], + responsive: { + details: { + type: 'column' + } + }, + columnDefs: [ + { + targets: 0, + className: 'control', + defaultContent: '', + orderable: false, + }, + { + targets: 1, + data: 'userName', + }, + { + targets: 2, + data: 'fullName', + orderable: false, + }, + { + targets: 3, + data: 'emailAddress', + }, + { + targets: 4, + data: 'isActive', + orderable: false, + render: data => `` + }, + { + targets: 5, + data: null, + orderable: false, + autoWidth: false, + defaultContent: '', + render: (data, type, row, meta) => { + return [ + ` ', + ` ' + ].join(''); + } + } + ] + }); + + _$form.validate({ + rules: { + Password: "required", + ConfirmPassword: { + equalTo: "#Password" + } + } + }); + + _$form.find('.save-button').on('click', (e) => { + e.preventDefault(); + + if (!_$form.valid()) { + return; + } + + var user = _$form.serializeFormToObject(); + user.roleNames = []; + var _$roleCheckboxes = _$form[0].querySelectorAll("input[name='role']:checked"); + if (_$roleCheckboxes) { + for (var roleIndex = 0; roleIndex < _$roleCheckboxes.length; roleIndex++) { + var _$roleCheckbox = $(_$roleCheckboxes[roleIndex]); + user.roleNames.push(_$roleCheckbox.val()); + } + } + + abp.ui.setBusy(_$modal); + _userService.create(user).done(function () { + _$modal.modal('hide'); + _$form[0].reset(); + abp.notify.info(l('SavedSuccessfully')); + _$usersTable.ajax.reload(); + }).always(function () { + abp.ui.clearBusy(_$modal); + }); + }); + + $(document).on('click', '.delete-user', function () { + var userId = $(this).attr("data-user-id"); + var userName = $(this).attr('data-user-name'); + + deleteUser(userId, userName); + }); + + function deleteUser(userId, userName) { + abp.message.confirm( + abp.utils.formatString( + l('AreYouSureWantToDelete'), + userName), + null, + (isConfirmed) => { + if (isConfirmed) { + _userService.delete({ + id: userId + }).done(() => { + abp.notify.info(l('SuccessfullyDeleted')); + _$usersTable.ajax.reload(); + }); + } + } + ); + } + + $(document).on('click', '.edit-user', function (e) { + var userId = $(this).attr("data-user-id"); + + e.preventDefault(); + abp.ajax({ + url: abp.appPath + 'Users/EditModal?userId=' + userId, + type: 'POST', + dataType: 'html', + success: function (content) { + $('#UserEditModal div.modal-content').html(content); + }, + error: function (e) { + } + }); + }); + + $(document).on('click', 'a[data-target="#UserCreateModal"]', (e) => { + $('.nav-tabs a[href="#user-details"]').tab('show') + }); + + abp.event.on('user.edited', (data) => { + _$usersTable.ajax.reload(); + }); + + _$modal.on('shown.bs.modal', () => { + _$modal.find('input:not([type=hidden]):first').focus(); + }).on('hidden.bs.modal', () => { + _$form.clearForm(); + }); + + $('.btn-search').on('click', (e) => { + _$usersTable.ajax.reload(); + }); + + $('.txt-search').on('keypress', (e) => { + if (e.which == 13) { + _$usersTable.ajax.reload(); + return false; + } + }); +})(jQuery); diff --git a/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/_EditModal.js b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/_EditModal.js new file mode 100644 index 00000000..ca2b4fac --- /dev/null +++ b/src/SplashPage.Web.Mvc/wwwroot/view-resources/Views/Users/_EditModal.js @@ -0,0 +1,47 @@ +(function ($) { + var _userService = abp.services.app.user, + l = abp.localization.getSource('SplashPage'), + _$modal = $('#UserEditModal'), + _$form = _$modal.find('form'); + + function save() { + if (!_$form.valid()) { + return; + } + + var user = _$form.serializeFormToObject(); + user.roleNames = []; + var _$roleCheckboxes = _$form[0].querySelectorAll("input[name='role']:checked"); + if (_$roleCheckboxes) { + for (var roleIndex = 0; roleIndex < _$roleCheckboxes.length; roleIndex++) { + var _$roleCheckbox = $(_$roleCheckboxes[roleIndex]); + user.roleNames.push(_$roleCheckbox.val()); + } + } + + abp.ui.setBusy(_$form); + _userService.update(user).done(function () { + _$modal.modal('hide'); + abp.notify.info(l('SavedSuccessfully')); + abp.event.trigger('user.edited', user); + }).always(function () { + abp.ui.clearBusy(_$form); + }); + } + + _$form.closest('div.modal-content').find(".save-button").click(function (e) { + e.preventDefault(); + save(); + }); + + _$form.find('input').on('keypress', function (e) { + if (e.which === 13) { + e.preventDefault(); + save(); + } + }); + + _$modal.on('shown.bs.modal', function () { + _$form.find('input[type=text]:first').focus(); + }); +})(jQuery); diff --git a/test/SplashPage.Tests/DependencyInjection/ServiceCollectionRegistrar.cs b/test/SplashPage.Tests/DependencyInjection/ServiceCollectionRegistrar.cs new file mode 100644 index 00000000..3f44a2ee --- /dev/null +++ b/test/SplashPage.Tests/DependencyInjection/ServiceCollectionRegistrar.cs @@ -0,0 +1,34 @@ +using Abp.Dependency; +using SplashPage.EntityFrameworkCore; +using SplashPage.Identity; +using Castle.MicroKernel.Registration; +using Castle.Windsor.MsDependencyInjection; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using System; + +namespace SplashPage.Tests.DependencyInjection; + +public static class ServiceCollectionRegistrar +{ + public static void Register(IIocManager iocManager) + { + var services = new ServiceCollection(); + + IdentityRegistrar.Register(services); + + services.AddEntityFrameworkInMemoryDatabase(); + + var serviceProvider = WindsorRegistrationHelper.CreateServiceProvider(iocManager.IocContainer, services); + + var builder = new DbContextOptionsBuilder(); + builder.UseInMemoryDatabase(Guid.NewGuid().ToString()).UseInternalServiceProvider(serviceProvider); + + iocManager.IocContainer.Register( + Component + .For>() + .Instance(builder.Options) + .LifestyleSingleton() + ); + } +} diff --git a/test/SplashPage.Tests/MultiTenantFactAttribute.cs b/test/SplashPage.Tests/MultiTenantFactAttribute.cs new file mode 100644 index 00000000..c73789c8 --- /dev/null +++ b/test/SplashPage.Tests/MultiTenantFactAttribute.cs @@ -0,0 +1,14 @@ +using Xunit; + +namespace SplashPage.Tests; + +public sealed class MultiTenantFactAttribute : FactAttribute +{ + public MultiTenantFactAttribute() + { + if (!SplashPageConsts.MultiTenancyEnabled) + { + Skip = "MultiTenancy is disabled."; + } + } +} diff --git a/test/SplashPage.Tests/Properties/AssemblyInfo.cs b/test/SplashPage.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ac84b54b --- /dev/null +++ b/test/SplashPage.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SplashPage.Tests")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0d4c5d00-c144-4213-a007-4b8944113ab1")] diff --git a/test/SplashPage.Tests/Sessions/SessionAppService_Tests.cs b/test/SplashPage.Tests/Sessions/SessionAppService_Tests.cs new file mode 100644 index 00000000..4292029c --- /dev/null +++ b/test/SplashPage.Tests/Sessions/SessionAppService_Tests.cs @@ -0,0 +1,51 @@ +using SplashPage.Sessions; +using Shouldly; +using System.Threading.Tasks; +using Xunit; + +namespace SplashPage.Tests.Sessions; + +public class SessionAppService_Tests : SplashPageTestBase +{ + private readonly ISessionAppService _sessionAppService; + + public SessionAppService_Tests() + { + _sessionAppService = Resolve(); + } + + [MultiTenantFact] + public async Task Should_Get_Current_User_When_Logged_In_As_Host() + { + // Arrange + LoginAsHostAdmin(); + + // Act + var output = await _sessionAppService.GetCurrentLoginInformations(); + + // Assert + var currentUser = await GetCurrentUserAsync(); + output.User.ShouldNotBe(null); + output.User.Name.ShouldBe(currentUser.Name); + output.User.Surname.ShouldBe(currentUser.Surname); + + output.Tenant.ShouldBe(null); + } + + [Fact] + public async Task Should_Get_Current_User_And_Tenant_When_Logged_In_As_Tenant() + { + // Act + var output = await _sessionAppService.GetCurrentLoginInformations(); + + // Assert + var currentUser = await GetCurrentUserAsync(); + var currentTenant = await GetCurrentTenantAsync(); + + output.User.ShouldNotBe(null); + output.User.Name.ShouldBe(currentUser.Name); + + output.Tenant.ShouldNotBe(null); + output.Tenant.Name.ShouldBe(currentTenant.Name); + } +} diff --git a/test/SplashPage.Tests/SplashPage.Tests.csproj b/test/SplashPage.Tests/SplashPage.Tests.csproj new file mode 100644 index 00000000..28933dc3 --- /dev/null +++ b/test/SplashPage.Tests/SplashPage.Tests.csproj @@ -0,0 +1,39 @@ + + + 1.0.0.0 + net9.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + SplashPage.Tests + SplashPage.Tests + true + false + false + false + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + Always + + + + + + \ No newline at end of file diff --git a/test/SplashPage.Tests/SplashPageTestBase.cs b/test/SplashPage.Tests/SplashPageTestBase.cs new file mode 100644 index 00000000..75501159 --- /dev/null +++ b/test/SplashPage.Tests/SplashPageTestBase.cs @@ -0,0 +1,209 @@ +using Abp; +using Abp.Authorization.Users; +using Abp.Events.Bus; +using Abp.Events.Bus.Entities; +using Abp.MultiTenancy; +using Abp.Runtime.Session; +using Abp.TestBase; +using SplashPage.Authorization.Users; +using SplashPage.EntityFrameworkCore; +using SplashPage.EntityFrameworkCore.Seed.Host; +using SplashPage.EntityFrameworkCore.Seed.Tenants; +using SplashPage.MultiTenancy; +using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace SplashPage.Tests; + +public abstract class SplashPageTestBase : AbpIntegratedTestBase +{ + protected SplashPageTestBase() + { + void NormalizeDbContext(SplashPageDbContext context) + { + context.EntityChangeEventHelper = NullEntityChangeEventHelper.Instance; + context.EventBus = NullEventBus.Instance; + context.SuppressAutoSetTenantId = true; + } + + // Seed initial data for host + AbpSession.TenantId = null; + UsingDbContext(context => + { + NormalizeDbContext(context); + new InitialHostDbBuilder(context).Create(); + new DefaultTenantBuilder(context).Create(); + }); + + // Seed initial data for default tenant + AbpSession.TenantId = 1; + UsingDbContext(context => + { + NormalizeDbContext(context); + new TenantRoleAndUserBuilder(context, 1).Create(); + }); + + LoginAsDefaultTenantAdmin(); + } + + #region UsingDbContext + + protected IDisposable UsingTenantId(int? tenantId) + { + var previousTenantId = AbpSession.TenantId; + AbpSession.TenantId = tenantId; + return new DisposeAction(() => AbpSession.TenantId = previousTenantId); + } + + protected void UsingDbContext(Action action) + { + UsingDbContext(AbpSession.TenantId, action); + } + + protected Task UsingDbContextAsync(Func action) + { + return UsingDbContextAsync(AbpSession.TenantId, action); + } + + protected T UsingDbContext(Func func) + { + return UsingDbContext(AbpSession.TenantId, func); + } + + protected Task UsingDbContextAsync(Func> func) + { + return UsingDbContextAsync(AbpSession.TenantId, func); + } + + protected void UsingDbContext(int? tenantId, Action action) + { + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + action(context); + context.SaveChanges(); + } + } + } + + protected async Task UsingDbContextAsync(int? tenantId, Func action) + { + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + await action(context); + await context.SaveChangesAsync(); + } + } + } + + protected T UsingDbContext(int? tenantId, Func func) + { + T result; + + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + result = func(context); + context.SaveChanges(); + } + } + + return result; + } + + protected async Task UsingDbContextAsync(int? tenantId, Func> func) + { + T result; + + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + result = await func(context); + await context.SaveChangesAsync(); + } + } + + return result; + } + + #endregion + + #region Login + + protected void LoginAsHostAdmin() + { + LoginAsHost(AbpUserBase.AdminUserName); + } + + protected void LoginAsDefaultTenantAdmin() + { + LoginAsTenant(AbpTenantBase.DefaultTenantName, AbpUserBase.AdminUserName); + } + + protected void LoginAsHost(string userName) + { + AbpSession.TenantId = null; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for host."); + } + + AbpSession.UserId = user.Id; + } + + protected void LoginAsTenant(string tenancyName, string userName) + { + var tenant = UsingDbContext(context => context.Tenants.FirstOrDefault(t => t.TenancyName == tenancyName)); + if (tenant == null) + { + throw new Exception("There is no tenant: " + tenancyName); + } + + AbpSession.TenantId = tenant.Id; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for tenant: " + tenancyName); + } + + AbpSession.UserId = user.Id; + } + + #endregion + + /// + /// Gets current user if is not null. + /// Throws exception if it's null. + /// + protected async Task GetCurrentUserAsync() + { + var userId = AbpSession.GetUserId(); + return await UsingDbContext(context => context.Users.SingleAsync(u => u.Id == userId)); + } + + /// + /// Gets current tenant if is not null. + /// Throws exception if there is no current tenant. + /// + protected async Task GetCurrentTenantAsync() + { + var tenantId = AbpSession.GetTenantId(); + return await UsingDbContext(context => context.Tenants.SingleAsync(t => t.Id == tenantId)); + } +} diff --git a/test/SplashPage.Tests/SplashPageTestModule.cs b/test/SplashPage.Tests/SplashPageTestModule.cs new file mode 100644 index 00000000..d26f0c63 --- /dev/null +++ b/test/SplashPage.Tests/SplashPageTestModule.cs @@ -0,0 +1,61 @@ +using Abp.AutoMapper; +using Abp.Configuration.Startup; +using Abp.Dependency; +using Abp.Modules; +using Abp.Net.Mail; +using Abp.TestBase; +using Abp.Zero.Configuration; +using Abp.Zero.EntityFrameworkCore; +using SplashPage.EntityFrameworkCore; +using SplashPage.Tests.DependencyInjection; +using Castle.MicroKernel.Registration; +using NSubstitute; +using System; + +namespace SplashPage.Tests; + +[DependsOn( + typeof(SplashPageApplicationModule), + typeof(SplashPageEntityFrameworkModule), + typeof(AbpTestBaseModule) + )] +public class SplashPageTestModule : AbpModule +{ + public SplashPageTestModule(SplashPageEntityFrameworkModule abpProjectNameEntityFrameworkModule) + { + abpProjectNameEntityFrameworkModule.SkipDbContextRegistration = true; + abpProjectNameEntityFrameworkModule.SkipDbSeed = true; + } + + public override void PreInitialize() + { + Configuration.UnitOfWork.Timeout = TimeSpan.FromMinutes(30); + Configuration.UnitOfWork.IsTransactional = false; + + // Disable static mapper usage since it breaks unit tests (see https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2052) + Configuration.Modules.AbpAutoMapper().UseStaticMapper = false; + + Configuration.BackgroundJobs.IsJobExecutionEnabled = false; + + // Use database for language management + Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization(); + + RegisterFakeService>(); + + Configuration.ReplaceService(DependencyLifeStyle.Transient); + } + + public override void Initialize() + { + ServiceCollectionRegistrar.Register(IocManager); + } + + private void RegisterFakeService() where TService : class + { + IocManager.IocContainer.Register( + Component.For() + .UsingFactoryMethod(() => Substitute.For()) + .LifestyleSingleton() + ); + } +} diff --git a/test/SplashPage.Tests/Users/UserAppService_Tests.cs b/test/SplashPage.Tests/Users/UserAppService_Tests.cs new file mode 100644 index 00000000..17a00ef3 --- /dev/null +++ b/test/SplashPage.Tests/Users/UserAppService_Tests.cs @@ -0,0 +1,50 @@ +using SplashPage.Users; +using SplashPage.Users.Dto; +using Microsoft.EntityFrameworkCore; +using Shouldly; +using System.Threading.Tasks; +using Xunit; + +namespace SplashPage.Tests.Users; + +public class UserAppService_Tests : SplashPageTestBase +{ + private readonly IUserAppService _userAppService; + + public UserAppService_Tests() + { + _userAppService = Resolve(); + } + + [Fact] + public async Task GetUsers_Test() + { + // Act + var output = await _userAppService.GetAllAsync(new PagedUserResultRequestDto { MaxResultCount = 20, SkipCount = 0 }); + + // Assert + output.Items.Count.ShouldBeGreaterThan(0); + } + + [Fact] + public async Task CreateUser_Test() + { + // Act + await _userAppService.CreateAsync( + new CreateUserDto + { + EmailAddress = "john@volosoft.com", + IsActive = true, + Name = "John", + Surname = "Nash", + Password = "123qwe", + UserName = "john.nash" + }); + + await UsingDbContextAsync(async context => + { + var johnNashUser = await context.Users.FirstOrDefaultAsync(u => u.UserName == "john.nash"); + johnNashUser.ShouldNotBeNull(); + }); + } +} diff --git a/test/SplashPage.Web.Tests/Controllers/HomeController_Tests.cs b/test/SplashPage.Web.Tests/Controllers/HomeController_Tests.cs new file mode 100644 index 00000000..18bcc825 --- /dev/null +++ b/test/SplashPage.Web.Tests/Controllers/HomeController_Tests.cs @@ -0,0 +1,28 @@ +using SplashPage.Models.TokenAuth; +using SplashPage.Web.Controllers; +using Shouldly; +using System.Threading.Tasks; +using Xunit; + +namespace SplashPage.Web.Tests.Controllers; + +public class HomeController_Tests : SplashPageWebTestBase +{ + [Fact] + public async Task Index_Test() + { + await AuthenticateAsync(null, new AuthenticateModel + { + UserNameOrEmailAddress = "admin", + Password = "123qwe" + }); + + //Act + var response = await GetResponseAsStringAsync( + GetUrl(nameof(HomeController.Index)) + ); + + //Assert + response.ShouldNotBeNullOrEmpty(); + } +} \ No newline at end of file diff --git a/test/SplashPage.Web.Tests/SplashPage.Web.Tests.csproj b/test/SplashPage.Web.Tests/SplashPage.Web.Tests.csproj new file mode 100644 index 00000000..8b325ce7 --- /dev/null +++ b/test/SplashPage.Web.Tests/SplashPage.Web.Tests.csproj @@ -0,0 +1,30 @@ + + + 1.0.0.0 + net9.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + SplashPage.Web.Tests + SplashPage.Web.Tests + true + false + false + false + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + \ No newline at end of file diff --git a/test/SplashPage.Web.Tests/SplashPageWebTestBase.cs b/test/SplashPage.Web.Tests/SplashPageWebTestBase.cs new file mode 100644 index 00000000..fbc5101f --- /dev/null +++ b/test/SplashPage.Web.Tests/SplashPageWebTestBase.cs @@ -0,0 +1,214 @@ +using Abp.AspNetCore.TestBase; +using Abp.Authorization.Users; +using Abp.Extensions; +using Abp.Json; +using Abp.MultiTenancy; +using Abp.Web.Models; +using SplashPage.EntityFrameworkCore; +using SplashPage.Models.TokenAuth; +using SplashPage.Web.Startup; +using AngleSharp.Html.Dom; +using AngleSharp.Html.Parser; +using Microsoft.AspNetCore.Hosting; +using Shouldly; +using System; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; + +namespace SplashPage.Web.Tests; + +public abstract class SplashPageWebTestBase : AbpAspNetCoreIntegratedTestBase +{ + protected static readonly Lazy ContentRootFolder; + + static SplashPageWebTestBase() + { + ContentRootFolder = new Lazy(WebContentDirectoryFinder.CalculateContentRootFolder, true); + } + + protected override IWebHostBuilder CreateWebHostBuilder() + { + return base + .CreateWebHostBuilder() + .UseContentRoot(ContentRootFolder.Value) + .UseSetting(WebHostDefaults.ApplicationKey, typeof(SplashPageWebMvcModule).Assembly.FullName); + } + + #region Get response + + protected async Task GetResponseAsObjectAsync(string url, + HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + var strResponse = await GetResponseAsStringAsync(url, expectedStatusCode); + return JsonSerializer.Deserialize(strResponse, new JsonSerializerOptions() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }); + } + + protected async Task GetResponseAsStringAsync(string url, + HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + var response = await GetResponseAsync(url, expectedStatusCode); + return await response.Content.ReadAsStringAsync(); + } + + protected async Task GetResponseAsync(string url, + HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + var response = await Client.GetAsync(url); + response.StatusCode.ShouldBe(expectedStatusCode); + return response; + } + + #endregion + + #region Authenticate + + /// + /// /api/TokenAuth/Authenticate + /// TokenAuthController + /// + /// + /// + /// + protected async Task AuthenticateAsync(string tenancyName, AuthenticateModel input) + { + if (tenancyName.IsNullOrWhiteSpace()) + { + var tenant = UsingDbContext(context => context.Tenants.FirstOrDefault(t => t.TenancyName == tenancyName)); + if (tenant != null) + { + AbpSession.TenantId = tenant.Id; + Client.DefaultRequestHeaders.Add("Abp-TenantId", tenant.Id.ToString()); //Set TenantId + } + } + + var response = await Client.PostAsync("/api/TokenAuth/Authenticate", + new StringContent(input.ToJsonString(), Encoding.UTF8, "application/json")); + response.StatusCode.ShouldBe(HttpStatusCode.OK); + var result = JsonSerializer.Deserialize>(await response.Content.ReadAsStringAsync(), new JsonSerializerOptions() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }); + Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.Result.AccessToken); + + AbpSession.UserId = result.Result.UserId; + } + + #endregion + + #region Login + + protected void LoginAsHostAdmin() + { + LoginAsHost(AbpUserBase.AdminUserName); + } + + protected void LoginAsDefaultTenantAdmin() + { + LoginAsTenant(AbpTenantBase.DefaultTenantName, AbpUserBase.AdminUserName); + } + + protected void LoginAsHost(string userName) + { + AbpSession.TenantId = null; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for host."); + } + + AbpSession.UserId = user.Id; + } + + protected void LoginAsTenant(string tenancyName, string userName) + { + var tenant = UsingDbContext(context => context.Tenants.FirstOrDefault(t => t.TenancyName == tenancyName)); + if (tenant == null) + { + throw new Exception("There is no tenant: " + tenancyName); + } + + AbpSession.TenantId = tenant.Id; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for tenant: " + tenancyName); + } + + AbpSession.UserId = user.Id; + } + + #endregion + + #region UsingDbContext + + protected void UsingDbContext(Action action) + { + using (var context = IocManager.Resolve()) + { + action(context); + context.SaveChanges(); + } + } + + protected T UsingDbContext(Func func) + { + T result; + + using (var context = IocManager.Resolve()) + { + result = func(context); + context.SaveChanges(); + } + + return result; + } + + protected async Task UsingDbContextAsync(Func action) + { + using (var context = IocManager.Resolve()) + { + await action(context); + await context.SaveChangesAsync(true); + } + } + + protected async Task UsingDbContextAsync(Func> func) + { + T result; + + using (var context = IocManager.Resolve()) + { + result = await func(context); + await context.SaveChangesAsync(true); + } + + return result; + } + + #endregion + + #region ParseHtml + + protected IHtmlDocument ParseHtml(string htmlString) + { + return new HtmlParser().ParseDocument(htmlString); + } + + #endregion +} diff --git a/test/SplashPage.Web.Tests/SplashPageWebTestModule.cs b/test/SplashPage.Web.Tests/SplashPageWebTestModule.cs new file mode 100644 index 00000000..3dc54471 --- /dev/null +++ b/test/SplashPage.Web.Tests/SplashPageWebTestModule.cs @@ -0,0 +1,37 @@ +using Abp.AspNetCore; +using Abp.AspNetCore.TestBase; +using Abp.Modules; +using Abp.Reflection.Extensions; +using SplashPage.EntityFrameworkCore; +using SplashPage.Web.Startup; +using Microsoft.AspNetCore.Mvc.ApplicationParts; + +namespace SplashPage.Web.Tests; + +[DependsOn( + typeof(SplashPageWebMvcModule), + typeof(AbpAspNetCoreTestBaseModule) +)] +public class SplashPageWebTestModule : AbpModule +{ + public SplashPageWebTestModule(SplashPageEntityFrameworkModule abpProjectNameEntityFrameworkModule) + { + abpProjectNameEntityFrameworkModule.SkipDbContextRegistration = true; + } + + public override void PreInitialize() + { + Configuration.UnitOfWork.IsTransactional = false; //EF Core InMemory DB does not support transactions. + } + + public override void Initialize() + { + IocManager.RegisterAssemblyByConvention(typeof(SplashPageWebTestModule).GetAssembly()); + } + + public override void PostInitialize() + { + IocManager.Resolve() + .AddApplicationPartsIfNotAddedBefore(typeof(SplashPageWebMvcModule).Assembly); + } +} \ No newline at end of file diff --git a/test/SplashPage.Web.Tests/Startup.cs b/test/SplashPage.Web.Tests/Startup.cs new file mode 100644 index 00000000..e84e2911 --- /dev/null +++ b/test/SplashPage.Web.Tests/Startup.cs @@ -0,0 +1,85 @@ +using Abp.AspNetCore; +using Abp.AspNetCore.TestBase; +using Abp.Dependency; +using SplashPage.Authentication.JwtBearer; +using SplashPage.Configuration; +using SplashPage.EntityFrameworkCore; +using SplashPage.Identity; +using SplashPage.Web.Resources; +using SplashPage.Web.Startup; +using Castle.MicroKernel.Registration; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; + +namespace SplashPage.Web.Tests; + +public class Startup +{ + private readonly IConfigurationRoot _appConfiguration; + + public Startup(IWebHostEnvironment env) + { + _appConfiguration = env.GetAppConfiguration(); + } + + public IServiceProvider ConfigureServices(IServiceCollection services) + { + services.AddEntityFrameworkInMemoryDatabase(); + + services.AddMvc(); + + IdentityRegistrar.Register(services); + AuthConfigurer.Configure(services, _appConfiguration); + + services.AddScoped(); + + //Configure Abp and Dependency Injection + return services.AddAbp(options => + { + options.SetupTest(); + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) + { + UseInMemoryDb(app.ApplicationServices); + + app.UseAbp(); //Initializes ABP framework. + + app.UseExceptionHandler("/Error"); + + app.UseStaticFiles(); + app.UseRouting(); + + app.UseAuthentication(); + + app.UseJwtTokenMiddleware(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); + }); + } + + private void UseInMemoryDb(IServiceProvider serviceProvider) + { + var builder = new DbContextOptionsBuilder(); + builder.UseInMemoryDatabase(Guid.NewGuid().ToString()).UseInternalServiceProvider(serviceProvider); + var options = builder.Options; + + var iocManager = serviceProvider.GetRequiredService(); + iocManager.IocContainer + .Register( + Component.For>() + .Instance(options) + .LifestyleSingleton() + ); + } +} \ No newline at end of file