diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2022-06-01 21:13:43 +0200 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2022-06-01 21:13:43 +0200 |
| commit | 9383a2fb09ffb60cfe63683106945bd688affa59 (patch) | |
| tree | 65b3f4b48841583e355887db5de5a16e7005fc87 /src | |
| download | vinjesvingenhandel.no-9383a2fb09ffb60cfe63683106945bd688affa59.tar.xz vinjesvingenhandel.no-9383a2fb09ffb60cfe63683106945bd688affa59.zip | |
feat: Initial commit after clean slate
Diffstat (limited to 'src')
162 files changed, 25396 insertions, 0 deletions
diff --git a/src/BackgroundServices/AssetsCleanupBackgroundService.cs b/src/BackgroundServices/AssetsCleanupBackgroundService.cs new file mode 100644 index 0000000..effb5d7 --- /dev/null +++ b/src/BackgroundServices/AssetsCleanupBackgroundService.cs @@ -0,0 +1,61 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using VSH.Services; + +namespace VSH.BackgroundServices; + +/// <summary> +/// This service is not really necessary, but it is nice to have for future reference. +/// The job that this service is doing, could maybe become an http endpoint? +/// </summary> +public class AssetsCleanupBackgroundService : BackgroundService +{ + private readonly IServiceProvider _serviceProvider; + private readonly ILogger<AssetsCleanupBackgroundService> _logger; + + private static TimeSpan CleanupInterval => TimeSpan.FromSeconds(10); + + public AssetsCleanupBackgroundService( + IServiceProvider serviceProvider, + ILogger<AssetsCleanupBackgroundService> logger + ) { + _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); + _logger = logger; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) { + await StartInternalAsync(stoppingToken); + } + + private async Task StartInternalAsync(CancellationToken cancellationToken) { + while (true) { + if (cancellationToken.IsCancellationRequested) { + _logger.LogDebug("CancellationRequested... Exiting"); + break; + } + + try { + await Task.Delay(CleanupInterval, cancellationToken); + } catch (TaskCanceledException) { + _logger.LogDebug("TaskCanceledException... Exiting"); + break; + } catch (Exception ex) { + _logger.LogError($"Task.Delay exception: {ex.Message}. Exiting."); + break; + } + + if (cancellationToken.IsCancellationRequested) { + _logger.LogDebug("CancellationRequested... Exiting"); + break; + } + + using var serviceProvider = _serviceProvider.CreateScope(); + var assetsService = serviceProvider.ServiceProvider.GetRequiredService<AssetsService>(); + await assetsService.RemoveUnusedProductImages(); + } + } +} diff --git a/src/BackgroundServices/StartupTasksBackgroundService.cs b/src/BackgroundServices/StartupTasksBackgroundService.cs new file mode 100644 index 0000000..8aebee9 --- /dev/null +++ b/src/BackgroundServices/StartupTasksBackgroundService.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using VSH.Data.Static; + +namespace VSH.BackgroundServices; + +public class StartupTasksBackgroundService : BackgroundService +{ + private readonly ILogger<StartupTasksBackgroundService> _logger; + + private static IEnumerable<string> PathsToEnsureCreated => new List<string> { + AppPaths.ProductImages.HostPath, + AppPaths.DocumentImages.HostPath, + }; + + public StartupTasksBackgroundService(ILogger<StartupTasksBackgroundService> logger) { + _logger = logger; + } + + protected override Task ExecuteAsync(CancellationToken stoppingToken) { + EnsureCreated(); + return Task.CompletedTask; + } + + private void EnsureCreated() { + foreach (var path in PathsToEnsureCreated) { + Directory.CreateDirectory(path); + _logger.LogInformation("EnsuredCreated: " + path); + } + } +}
\ No newline at end of file diff --git a/src/BackgroundServices/VippsOrderStatusCheckerBackgroundService.cs b/src/BackgroundServices/VippsOrderStatusCheckerBackgroundService.cs new file mode 100644 index 0000000..73804d2 --- /dev/null +++ b/src/BackgroundServices/VippsOrderStatusCheckerBackgroundService.cs @@ -0,0 +1,59 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using IOL.VippsEcommerce; +using IOL.VippsEcommerce.Models.Api; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using VSH.Data; +using VSH.Data.Enums; + +namespace VSH.BackgroundServices; + +public class VippsOrderStatusCheckerBackgroundService : BackgroundService +{ + private readonly ILogger<VippsOrderStatusCheckerBackgroundService> _logger; + + public VippsOrderStatusCheckerBackgroundService( + IServiceProvider services, + ILogger<VippsOrderStatusCheckerBackgroundService> logger + ) { + Services = services; + _logger = logger; + } + + public IServiceProvider Services { get; } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) { + using var scope = Services.CreateScope(); + var context = + scope.ServiceProvider + .GetRequiredService<MainDbContext>(); + var vipps = + scope.ServiceProvider + .GetService<VippsEcommerceService>(); + + if (vipps == default) { + return; + } + + foreach (var order in context.Orders.Where(c => c.Created < DateTime.UtcNow.AddDays(1) + && c.Status == OrderStatus.AWAITING_VIPPS)) { + try { + var vippsResponse = await vipps.GetPaymentDetailsAsync(order.OrderReference, stoppingToken); + order.VippsTransactionId = vippsResponse.TransactionLogHistory.LastOrDefault()?.TransactionId; + } catch (Exception e) { + if (e is VippsRequestException vippsRequestException) { + Console.WriteLine(vippsRequestException); + } + + Console.WriteLine(e); + } + + await context.SaveChangesAsync(stoppingToken); + _logger.LogInformation("Got payment details from vipps for order with id: " + order.Id); + } + } +}
\ No newline at end of file diff --git a/src/Controllers/AccountController.cs b/src/Controllers/AccountController.cs new file mode 100644 index 0000000..ab80b78 --- /dev/null +++ b/src/Controllers/AccountController.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; +using VSH.Data; +using VSH.Data.Payloads; +using VSH.Data.Results; +using IOL.Helpers; +using VSH.Data.Database; + +namespace VSH.Controllers; + +public class AccountController : MainControllerBase +{ + private readonly IAuthenticationService _authentication; + private readonly MainDbContext _context; + private readonly IStringLocalizer<SharedControllerResources> _localizer; + + public AccountController( + MainDbContext context, + IStringLocalizer<SharedControllerResources> localizer, + IAuthenticationService authentication + ) { + _context = context; + _localizer = localizer; + _authentication = authentication; + } + + [ValidateAntiForgeryToken] + [HttpPost("login")] + public ActionResult Login(LoginPayload payload) { + if (!ModelState.IsValid) + BadRequest(ModelState); + var user = _context.Users.SingleOrDefault(u => u.Username == payload.Username); + if (user == default || !user.VerifyPassword(payload.Password)) + return BadRequest(new ErrorResult(_localizer["Ugyldig brukernavn eller passord"])); + + var claims = new List<Claim> { + new(ClaimTypes.NameIdentifier, user.Id.ToString()), + new(ClaimTypes.Name, user.Username), + }; + var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); + var principal = new ClaimsPrincipal(identity); + var authenticationProperties = new AuthenticationProperties { + AllowRefresh = true, + IssuedUtc = DateTimeOffset.UtcNow, + }; + + if (payload.Persist) { + authenticationProperties.ExpiresUtc = DateTimeOffset.UtcNow.AddMonths(6); + authenticationProperties.IsPersistent = true; + } + + HttpContext.SignInAsync(principal, authenticationProperties); + return Ok(); + } + + [Authorize] + [HttpPost("update-password")] + public ActionResult UpdatePassword(UpdatePasswordPayload payload) { + if (payload.NewPassword.IsNullOrWhiteSpace()) { + return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"], + _localizer["Nytt passord er påkrevd"])); + } + + if (payload.NewPassword.Length < 6) { + return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"], + _localizer["Nytt passord må minst inneholde 6 karakterer"])); + } + + var user = _context.Users.SingleOrDefault(c => c.Id == LoggedInUser.Id); + if (user == default) { + HttpContext.SignOutAsync(); + return Redirect("/"); + } + + + user.HashAndSetPassword(payload.NewPassword); + user.Updated = DateTime.UtcNow; + _context.SaveChanges(); + return Ok(); + } + + [AllowAnonymous] + [HttpGet("create-initial")] + public ActionResult CreateInitialUser() { + if (_context.Users.Any()) return Redirect("/kontoret"); + var user = new User("admin@ivarlovlie.no"); + user.SetBaseValues(); + user.HashAndSetPassword("ivar123"); + _context.Users.Add(user); + _context.SaveChanges(); + return Redirect("/kontoret"); + } + + [AllowAnonymous] + [HttpGet("me")] + public async Task<ActionResult> GetLoggedInUser() { + var authres = + await _authentication.AuthenticateAsync(HttpContext, CookieAuthenticationDefaults.AuthenticationScheme); + if (authres.Succeeded) + return Ok(LoggedInUser); + + await HttpContext.SignOutAsync(); + return StatusCode(403); + } + + [HttpGet("logout")] + public ActionResult Logout() { + HttpContext.SignOutAsync(); + return Ok(); + } +}
\ No newline at end of file diff --git a/src/Controllers/CategoriesController.cs b/src/Controllers/CategoriesController.cs new file mode 100644 index 0000000..5ef87ea --- /dev/null +++ b/src/Controllers/CategoriesController.cs @@ -0,0 +1,106 @@ +using System; +using System.Linq; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; +using VSH.Data; +using VSH.Data.Database; +using VSH.Data.Enums; +using VSH.Data.Results; +using IOL.Helpers; + +namespace VSH.Controllers; + +public class CategoriesController : MainControllerBase +{ + private readonly MainDbContext _context; + private readonly IStringLocalizer<SharedControllerResources> _localizer; + + public CategoriesController(MainDbContext context, IStringLocalizer<SharedControllerResources> localizer) { + _context = context; + _localizer = localizer; + } + + [HttpGet] + public ActionResult GetCategories() { + return Ok(_context.Categories.OrderBy(c => c.Created)); + } + + [HttpGet("with-products")] + public ActionResult GetCategoriesWithProducts() { + return Ok(_context.Categories.Include(c => c.Products) + .OrderBy(c => c.Created)); + } + + [HttpGet("{id}")] + public ActionResult GetCategory(Guid id) { + return Ok(_context.Categories.SingleOrDefault(c => c.Id == id)); + } + + [HttpGet("{id}/enable")] + public ActionResult EnableCategory(Guid id) { + var category = _context.Categories.SingleOrDefault(c => c.Id == id); + if (category == default) + return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"])); + category.VisibilityState = CategoryVisibility.DEFAULT; + category.Update(); + _context.SaveChanges(); + return Ok(); + } + + [HttpGet("{id}/disable")] + public ActionResult DisableCategory(Guid id) { + var category = _context.Categories.SingleOrDefault(c => c.Id == id); + if (category == default) + return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"])); + category.VisibilityState = CategoryVisibility.DISABLED; + category.Update(); + _context.SaveChanges(); + return Ok(); + } + + [HttpGet("create")] + public ActionResult CreateCategoryAsync(string name) { + if (name.IsNullOrWhiteSpace()) + return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"], _localizer["Navn er påkrevd"])); + + if (_context.Categories.Any(c => c.Name == name)) + return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"], + _localizer["En kategori med det navnet finnes allerede"])); + + var newCategory = new Category(name); + newCategory.SetBaseValues(); + _context.Categories.Add(newCategory); + _context.SaveChanges(); + return Ok(newCategory); + } + + [HttpGet("{id}/update")] + public ActionResult UpdateCategoryAsync(Guid id, string newName) { + var category = _context.Categories.SingleOrDefault(c => c.Id == id); + if (category == default) + return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"])); + if (newName.IsNullOrWhiteSpace()) + return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"], + _localizer["Det nye navnet kan ikke være tomt"])); + category.Update(new Category(newName)); + _context.SaveChanges(); + return Ok(); + } + + [HttpDelete("{id}/delete")] + public ActionResult DeleteCategoryAsync(Guid id) { + var category = _context.Categories.Include(c => c.Products).SingleOrDefault(c => c.Id == id); + if (category == default) + return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"])); + if (category.Products.Any()) { + category.VisibilityState = CategoryVisibility.DELETED; + _context.SaveChanges(); + } else { + _context.Categories.Remove(category); + _context.SaveChanges(); + } + + return Ok(); + } +}
\ No newline at end of file diff --git a/src/Controllers/DocumentsController.cs b/src/Controllers/DocumentsController.cs new file mode 100644 index 0000000..b2a6122 --- /dev/null +++ b/src/Controllers/DocumentsController.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using IOL.Helpers; +using Microsoft.AspNetCore.Mvc; +using VSH.Data; +using VSH.Data.Database; +using VSH.Data.Enums; +using VSH.Data.Static; +using VSH.Utilities; + +namespace VSH.Controllers; + +public class DocumentsController : MainControllerBase +{ + private readonly MainDbContext _context; + + public DocumentsController(MainDbContext context) { + _context = context; + } + + [HttpGet("{type}")] + public ActionResult GetDocument(DocumentType type) { + var document = _context.Documents.SingleOrDefault(d => d.Type == type); + return Ok(document?.Content); + } + + [HttpPost("{type}")] + public ActionResult UpdateDocument([FromRoute] DocumentType type, [FromForm] string content) { + var document = _context.Documents.SingleOrDefault(d => d.Type == type); + if (document == default) { + var newDocument = new Document { + Content = content, + Type = type, + Created = DateTime.UtcNow + }; + _context.Documents.Add(newDocument); + _context.SaveChanges(); + return Ok(newDocument.Content); + } + + document.Content = content; + document.Updated = DateTime.UtcNow; + _context.SaveChanges(); + return Ok(document.Content); + } + + [HttpPost("upload-images")] + public ActionResult UploadImages() { + var files = Request.Form.Files; + if (files.Count == 0) + return BadRequest(); + var filePaths = new List<FileInfo>(); + var fileNames = new List<string>(); + foreach (var file in files) { + var fileName = RandomString.Generate(4, + true) + + "_" + + file.FileName; + var filePath = Path.Combine(AppPaths.DocumentImages.HostPath, + fileName); + using var writeStream = new FileStream(filePath, + FileMode.CreateNew); + file.CopyTo(writeStream); + filePaths.Add(new FileInfo(filePath)); + fileNames.Add(fileName); + } + + foreach (var filePath in filePaths) { + ImageFunctions.EnsureNormalOrLessImageResolution(filePath); + } + + return Ok(fileNames); + } +}
\ No newline at end of file diff --git a/src/Controllers/MainControllerBase.cs b/src/Controllers/MainControllerBase.cs new file mode 100644 index 0000000..4f8f47f --- /dev/null +++ b/src/Controllers/MainControllerBase.cs @@ -0,0 +1,26 @@ +using System; +using System.Linq; +using System.Security.Claims; +using IOL.Helpers; +using Microsoft.AspNetCore.Mvc; + +namespace VSH.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class MainControllerBase : ControllerBase +{ + public string CurrentHost => Request.GetRequestHost(); + + + protected LoggedInUserModel LoggedInUser => new() { + Username = User.Identity?.Name, + Id = User.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value.ToGuid() ?? default + }; + + protected class LoggedInUserModel + { + public Guid Id { get; set; } + public string Username { get; set; } + } +}
\ No newline at end of file diff --git a/src/Controllers/OrdersController.cs b/src/Controllers/OrdersController.cs new file mode 100644 index 0000000..39c0818 --- /dev/null +++ b/src/Controllers/OrdersController.cs @@ -0,0 +1,339 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Threading.Tasks; +using IOL.Helpers; +using IOL.VippsEcommerce; +using IOL.VippsEcommerce.Models.Api; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using VSH.Data; +using VSH.Data.Database; +using VSH.Data.Dtos; +using VSH.Data.Enums; +using VSH.Data.Results; +using VSH.Services; +using VSH.Utilities; + +namespace VSH.Controllers; + +public class OrdersController : MainControllerBase +{ + private readonly MainDbContext _context; + private readonly OrderService _orderService; + private readonly IVippsEcommerceService _vippsService; + private readonly EmailService _emailService; + private readonly ILogger<OrdersController> _logger; + private readonly IConfiguration _configuration; + + public OrdersController( + MainDbContext context, + IConfiguration configuration, + OrderService orderService, + IVippsEcommerceService vippsService, + EmailService emailService, + ILogger<OrdersController> logger + ) { + _context = context; + _configuration = configuration; + _orderService = orderService; + _vippsService = vippsService; + _logger = logger; + _emailService = emailService; + } + + [HttpGet] + public ActionResult GetOrders(string filter = default) { + return filter switch { + "not-cancelled" => Ok(_context.Orders.Where(c => c.Status != OrderStatus.CANCELLED) + .OrderByDescending(c => c.Created)), + _ => Ok(_context.Orders.OrderByDescending(c => c.Created)) + }; + } + + [HttpPost("submit")] + public async Task<ActionResult> SubmitOrder(Order payload) { + var validationResult = _orderService.ValidateOrder(payload); + if (!validationResult.IsValid) + return BadRequest(validationResult); + payload.SetBaseValues(); + var orderRef = RandomString.Generate(6); + var isOrderRefUsed = _context.Orders.Any(c => c.OrderReference == orderRef); + + while (isOrderRefUsed) { + orderRef = RandomString.Generate(6); + isOrderRefUsed = _context.Orders.Any(c => c.OrderReference == orderRef); + } + + payload.OrderReference = orderRef; + + foreach (var payloadProduct in payload.Products) { + var dbProduct = _context.Products.SingleOrDefault(c => c.Id == payloadProduct.Id); + if (dbProduct == default) { + throw new ApplicationException("Could not find product in order payload that passed validation"); + } + + payloadProduct.PriceAtTimeOfOrder = dbProduct.Price; + } + + switch (payload.PaymentType) { + case OrderPaymentType.VIPPS: { + payload.Id = Guid.NewGuid(); + payload.Status = OrderStatus.AWAITING_VIPPS; + await _context.Orders.AddAsync(payload); + await _context.SaveChangesAsync(); + var vippsUrl = await _orderService.GetVippsPaymentUrlAsync(payload, CurrentHost); + return Ok(vippsUrl); + } + case OrderPaymentType.INVOICE_BY_EMAIL: { + payload.Status = OrderStatus.AWAITING_INVOICE; + await _context.Orders.AddAsync(payload); + await _context.SaveChangesAsync(); + + await _emailService.SendEmailAsync("Ny ordre - VSH", + payload.GetAdminMailContent(CurrentHost), + _configuration.GetOrderStatusEmailRecipients()); + await _emailService.SendEmailAsync("Din ordre hos Vinjesvingen Handel AS", + payload.GetCustomerMailContent(CurrentHost), + payload.ContactInfo.EmailAddress); + return Ok("/status/" + payload.OrderReference + "?clearCart=true"); + } + default: { + return BadRequest("No PaymentType was specified"); + } + } + } + + [HttpGet("{orderId}/details")] + public ActionResult<AdminViewOrderDto> GetOrderDetails(Guid orderId) { + var order = _context.Orders.SingleOrDefault(c => c.Id == orderId); + if (order == default) { + return NotFound(); + } + + var products = new List<AdminViewOrderDto.OrderDetailProduct>(); + + foreach (var orderProduct in order.Products) { + var dbProduct = _context.Products.SingleOrDefault(c => c.Id == orderProduct.Id); + if (dbProduct == default) + continue; + products.Add(new AdminViewOrderDto.OrderDetailProduct { + Id = orderProduct.Id, + Count = orderProduct.NumberOfItems, + PayedPrice = orderProduct.PriceAtTimeOfOrder, + Name = dbProduct.Name + }); + } + + var x = new AdminViewOrderDto { + Comment = order.Comment, + Id = order.Id, + Products = products, + Status = order.Status, + ContactInformation = order.ContactInfo, + OrderDate = order.Created, + OrderReference = order.OrderReference, + PaymentType = order.PaymentType, + VippsId = order.VippsTransactionId, + VippsStatus = order.VippsStatus.ToString(), + VippsTransactionStatus = order.VippsTransactionStatus.ToString() + }; + + return x; + } + + + [HttpGet("{orderId}/capture")] + public async Task<ActionResult> CaptureVippsPayment(Guid orderId) { + var order = _context.Orders.SingleOrDefault(c => c.Id == orderId); + if (order == default) + return NotFound(); + try { + var response = await _vippsService.CapturePaymentAsync(order.OrderReference, + new VippsPaymentActionRequest { + Transaction = new TTransaction { + TransactionText = + order.OrderReference + + "_" + + DateTime.UtcNow.ToString("O") + } + }); + if (response == default) + return StatusCode(500); + order.VippsStatus = response.TransactionInfo.Status; + await _context.SaveChangesAsync(); + return Ok(); + } catch (Exception e) { + Console.WriteLine(e); + e.Data.Add("orderId", orderId); + return StatusCode(500); + } + } + + [HttpGet("{orderId}/cancel")] + public async Task<ActionResult> CancelVippsPayment(Guid orderId) { + var order = _context.Orders.SingleOrDefault(c => c.Id == orderId); + if (order == default) + return NotFound(); + try { + var response = await _vippsService.CancelPaymentAsync(order.OrderReference, + new VippsPaymentActionRequest { + Transaction = new TTransaction { + TransactionText = + order.OrderReference + + "_" + + DateTime.UtcNow.ToString("O") + } + }); + if (response == default) + return StatusCode(500); + order.VippsStatus = response.TransactionInfo.Status; + await _context.SaveChangesAsync(); + return Ok(); + } catch (Exception e) { + Console.WriteLine(e); + e.Data.Add("orderId", orderId); + return StatusCode(500); + } + } + + [HttpGet("{orderId}/refund")] + public async Task<ActionResult> RefundVippsPayment(Guid orderId) { + var order = _context.Orders.SingleOrDefault(c => c.Id == orderId); + if (order == default) + return NotFound(); + try { + var response = await _vippsService.RefundPaymentAsync(order.OrderReference, + new VippsPaymentActionRequest { + Transaction = new TTransaction { + TransactionText = + order.OrderReference + + "_" + + DateTime.UtcNow.ToString("O") + } + }); + if (response == default) + return StatusCode(500); + order.VippsStatus = response.TransactionInfo.Status; + await _context.SaveChangesAsync(); + return Ok(); + } catch (Exception e) { + Console.WriteLine(e); + e.Data.Add("orderId", orderId); + return StatusCode(500); + } + } + + [HttpPost("validate-products")] + public ActionResult<AppValidationResult> ValidateOrderProducts(Order payload) { + return _orderService.ValidateOrderProducts(payload); + } + + [HttpPost("validate")] + public ActionResult<AppValidationResult> ValidateOrder(Order payload) { + return _orderService.ValidateOrder(payload); + } + + /// <summary> + /// This is used for all payment updates performed at vipps and can be called anytime from vipps + /// This endpoint updates the order status and save the body as an VippsResponses.InitiationResponse in db + /// </summary> + /// <param name="orderReference"></param> + /// <returns></returns> + [HttpPost("vipps/callbacks-for-payment-update/v2/payments/{orderReference}")] + public async Task<ActionResult> VippsPaymentUpdateCallback([FromRoute] string orderReference) { + var bodyContent = await new StreamReader(Request.Body).ReadToEndAsync(); + _logger.LogInformation("Recieved vipps payment update callback for order: " + orderReference); + _logger.LogDebug("With body: " + bodyContent); + + var order = _context.Orders.SingleOrDefault(c => c.OrderReference == orderReference); + if (order == default) { + _logger.LogWarning("Could not find order: " + orderReference + ", in database"); + return Ok(); + } + + try { + var response = JsonSerializer.Deserialize<VippsPaymentInitiationCallbackResponse>(bodyContent); + if (response == default) { + _logger.LogCritical("Could not deserialize vipps response into " + + nameof(VippsPaymentInitiationCallbackResponse)); + return Ok(); + } + + order.VippsTransactionId = response.TransactionInfo.TransactionId; + order.VippsTransactionStatus = response.TransactionInfo.StatusEnum(); + order.Status = order.VippsTransactionStatus switch { + ETransactionStatus.SALE or ETransactionStatus.RESERVED => OrderStatus.COMPLETED, + ETransactionStatus.REJECTED or + ETransactionStatus.CANCELLED or + ETransactionStatus.AUTO_CANCEL => OrderStatus.CANCELLED, + ETransactionStatus.SALE_FAILED or ETransactionStatus.RESERVE_FAILED => OrderStatus.FAILED, + _ => OrderStatus.FAILED + }; + await _context.SaveChangesAsync(); + + if (order.Status != OrderStatus.COMPLETED) { + _logger.LogWarning("OrderStatus is unsatisfactory for this stage of payment history, returning to cart page with error message"); + if (response.TransactionInfo != default) { + _logger.LogWarning("Vipps TransactionStatus is " + response.TransactionInfo?.Status); + } else { + _logger.LogWarning("Vipps TransactionInfo is empty"); + } + } + + return Ok(); + } catch (Exception e) { + Console.WriteLine(e); + e.Data.Add("orderid", order.Id); + _logger.LogCritical(e, "WHOOOOOOOOOOOPS"); + return Ok(); + } + } + + /// <summary> + /// This endpoint is specified in the intiation request to vipps, regardless of the result of a capture in vipps, vipps will send customers to this endpoint. + /// This endpoint decides where a customer is sent based on the result of a vipps payment request + /// </summary> + /// <param name="orderReference"></param> + /// <returns></returns> + [HttpGet("vipps/payment-callback/{orderReference}")] + public async Task<ActionResult> VippsPaymentCallback([FromRoute] string orderReference) { + _logger.LogInformation("Recieved vipps payment callback for order: " + orderReference); + + var order = _context.Orders.SingleOrDefault(c => c.OrderReference == orderReference); + if (order == default) { + _logger.LogWarning("Could not find order: " + orderReference + ", in database"); + return Redirect("/handlekorg?error=failed"); + } + + try { + if (order.Status == OrderStatus.CANCELLED) { + return Redirect("/handlekorg?error=cancelled"); + } + + if (order.Status != OrderStatus.COMPLETED) { + _logger.LogWarning("OrderStatus is unsatisfactory for this stage of payment history, returning to cart page with error message"); + + return Redirect("/handlekorg?error=failed"); + } + + await _emailService.SendEmailAsync("Ny ordre - VSH", + order.GetAdminMailContent(CurrentHost), + _configuration.GetOrderStatusEmailRecipients()); + + await _emailService.SendEmailAsync("Din ordre hos Vinjesvingen Handel AS", + order.GetCustomerMailContent(CurrentHost), + order.ContactInfo.EmailAddress); + + return Redirect("/status/" + orderReference + "?clearCart=true"); + } catch (Exception e) { + Console.WriteLine(e); + e.Data.Add("orderid", order.Id); + _logger.LogCritical(e, "WHOOOOOOOOOOOPS"); + return Redirect("/handlekorg?error=failed"); + } + } +} diff --git a/src/Controllers/ProductsController.cs b/src/Controllers/ProductsController.cs new file mode 100644 index 0000000..9bd7e93 --- /dev/null +++ b/src/Controllers/ProductsController.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using IOL.Helpers; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; +using VSH.Data; +using VSH.Data.Database; +using VSH.Data.Enums; +using VSH.Data.Results; +using VSH.Data.Static; +using VSH.Utilities; + +namespace VSH.Controllers; + +[Authorize] +public class ProductsController : MainControllerBase +{ + private readonly MainDbContext _context; + private readonly IStringLocalizer<SharedControllerResources> _localizer; + + public ProductsController( + MainDbContext context, + IStringLocalizer<SharedControllerResources> localizer + ) { + _context = context; + _localizer = localizer; + } + + [HttpGet] + [AllowAnonymous] + public ActionResult GetAllProducts() { + return Ok(_context.Products.Include(c => c.Category)); + } + + [HttpGet("{id}")] + [AllowAnonymous] + public Product GetProduct(Guid id) { + return _context.Products + .Include(c => c.Category) + .SingleOrDefault(c => c.Id == id); + } + + [HttpPost("upload-images")] + public ActionResult UploadImages() { + if (Request.Form.Files.Count == 0) + return BadRequest(); + var filePaths = new List<FileInfo>(); + var fileNames = new List<string>(); + foreach (var file in Request.Form.Files) { + var fileName = RandomString.Generate(8, true) + file.FileName.ExtractExtension(); + var filePath = Path.Combine(AppPaths.ProductImages.HostPath, fileName); + using var writeStream = new FileStream(filePath, FileMode.CreateNew); + file.CopyTo(writeStream); + filePaths.Add(new FileInfo(filePath)); + fileNames.Add(fileName); + } + + foreach (var filePath in filePaths) { + ImageFunctions.CreateProductImageCollection(filePath); + } + + return Ok(fileNames); + } + + [HttpPost("create")] + public ActionResult CreateProductAsync(Product payload) { + payload.SetBaseValues(); + var category = _context.Categories.SingleOrDefault(p => p.Id == payload.Category.Id); + if (category == default) + return BadRequest(new ErrorResult(_localizer["Kunne ikke finne kategorien"])); + payload.Category = category; + payload.Slug = payload.Name.Slugified(); + _context.Products.Add(payload); + _context.SaveChanges(); + return Ok(); + } + + + [HttpPost("{id}/update")] + public ActionResult UpdateProductAsync([FromRoute] Guid id, [FromBody] Product payload) { + var product = _context.Products.SingleOrDefault(p => p.Id == id); + if (product == default) + return NotFound(new ErrorResult(_localizer["Kunne ikke finne produktet"])); + var category = _context.Categories.AsNoTracking().SingleOrDefault(c => c.Id == payload.Category.Id); + if (category == default) + return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"])); + + var newImages = payload.Images.Select(c => new ProductImage(c.FileName, c.Order)).ToList(); + + product.Images = newImages; + product.Category = category; + product.Name = payload.Name; + product.Slug = product.Name.Slugified(); + product.Description = payload.Description; + product.Price = payload.Price; + product.Count = payload.Count; + product.PriceSuffix = payload.PriceSuffix; + product.ShowOnFrontpage = payload.ShowOnFrontpage; + product.Updated = DateTime.UtcNow; + _context.SaveChanges(); + + return Ok(); + } + + [HttpDelete("{id}/delete")] + public ActionResult DeleteProductAsync(Guid id) { + var product = _context.Products.SingleOrDefault(p => p.Id == id); + if (product == default) + return NotFound(new ErrorResult(_localizer["Kunne ikke finne produktet"])); + + product.VisibilityState = ProductVisibility.DELETED; + product.Updated = DateTime.UtcNow; + + _context.SaveChanges(); + return Ok(); + } +}
\ No newline at end of file diff --git a/src/Controllers/RootController.cs b/src/Controllers/RootController.cs new file mode 100644 index 0000000..6a31d46 --- /dev/null +++ b/src/Controllers/RootController.cs @@ -0,0 +1,75 @@ +using System; +using System.Text; +using IOL.VippsEcommerce; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using VSH.Data.Static; + +namespace VSH.Controllers; + +public class RootController : MainControllerBase +{ + private readonly IVippsEcommerceService _vippsEcommerceService; + private readonly IConfiguration _configuration; + + public RootController(IConfiguration configuration, IVippsEcommerceService vippsEcommerceService) { + _configuration = configuration; + _vippsEcommerceService = vippsEcommerceService; + } + + [HttpGet("~/kontoret")] + public ActionResult AdminRedirect() { + return Redirect("/kontoret/produkter"); + } + + [Authorize] + [HttpGet("~/info")] + public ActionResult GetInfo() { + var infoString = new StringBuilder(); + infoString.AppendLine("Variables"); + infoString.AppendLine($" - CurrentHost: {CurrentHost}"); + infoString.AppendLine("Environment"); + infoString.AppendLine($" - DB_HOST: {_configuration.GetValue("DB_HOST", "unset")}"); + infoString.AppendLine($" - DB_PORT: {_configuration.GetValue("DB_PORT", "unset")}"); + infoString.AppendLine($" - DB_USER: {_configuration.GetValue("DB_USER", "unset")}"); + infoString.AppendLine($" - DB_PASSWORD: {HiddenIfSet(_configuration.GetValue("DB_PASSWORD", "unset"))}"); + infoString.AppendLine($" - DB_NAME: {_configuration.GetValue("DB_NAME", "unset")}"); + infoString.AppendLine($" - SENDGRID_API_KEY: {HiddenIfSet(_configuration.GetValue("SENDGRID_API_KEY", "unset"))}"); + infoString.AppendLine($" - MAIL_FROM_ADDRESS: {_configuration.GetValue("MAIL_FROM_ADDRESS", "unset")}"); + infoString.AppendLine($" - MAIL_REPLY_TO_ADDRESS: {_configuration.GetValue("MAIL_REPLY_TO_ADDRESS", "unset")}"); + infoString.AppendLine($" - MAIL_FROM_NAME: {_configuration.GetValue("MAIL_FROM_NAME", "unset")}"); + infoString.AppendLine("Headers"); + infoString.AppendLine($" - X-Forwarded-For: {Request.Headers["X-Forwarded-For"]}"); + infoString.AppendLine($" - X-Real-IP: {Request.Headers["X-Real-IP"]}"); + infoString.AppendLine($" - X-Forwarded-Host: {Request.Headers["X-Forwarded-Host"]}"); + infoString.AppendLine($" - X-Forwarded-Proto: {Request.Headers["X-Forwarded-Proto"]}"); + return Ok(infoString.ToString()); + } + + [Authorize] + [HttpGet("~/vipps-config")] + public ActionResult GetVippsConfiguration() { + return Ok(_vippsEcommerceService.Configuration); + } + + private string HiddenIfSet(string value) { + return value == "unset" ? "unset" : "*****"; + } + + [HttpPost("~/set-culture")] + public ActionResult SetCulture( + [FromForm] string culture, + [FromQuery] string returnUrl + ) { + Response.Cookies.Append(AppCookies.Culture.Name, + CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), + new CookieOptions { + Expires = DateTimeOffset.UtcNow.AddYears(1) + }); + + return LocalRedirect(returnUrl); + } +}
\ No newline at end of file diff --git a/src/Data/Database/Base.cs b/src/Data/Database/Base.cs new file mode 100644 index 0000000..4084ec8 --- /dev/null +++ b/src/Data/Database/Base.cs @@ -0,0 +1,15 @@ +using System; + +namespace VSH.Data.Database; + +public class Base +{ + public Guid Id { get; set; } + public DateTime Created { get; set; } + public DateTime? Updated { get; set; } + + public void SetBaseValues() { + Id = Guid.NewGuid(); + Created = DateTime.UtcNow; + } +}
\ No newline at end of file diff --git a/src/Data/Database/Category.cs b/src/Data/Database/Category.cs new file mode 100644 index 0000000..6e0d324 --- /dev/null +++ b/src/Data/Database/Category.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using IOL.Helpers; +using VSH.Data.Enums; +using VSH.Utilities; + +namespace VSH.Data.Database; + +public class Category : Base +{ + public Category(string name = default) { + if (name.IsNullOrWhiteSpace()) + return; + Name = name; + Slug = name.Slugified(); + } + + public string Name { get; set; } + public string Slug { get; set; } + public CategoryVisibility VisibilityState { get; set; } + public ICollection<Product> Products { get; set; } + public bool Disabled => VisibilityState == CategoryVisibility.DISABLED; + public bool Deleted => VisibilityState == CategoryVisibility.DELETED; + + public void Update(Category update = default) { + Name = update?.Name ?? Name; + VisibilityState = update?.VisibilityState ?? VisibilityState; + Updated = DateTime.UtcNow; + } +}
\ No newline at end of file diff --git a/src/Data/Database/Document.cs b/src/Data/Database/Document.cs new file mode 100644 index 0000000..2ae40d6 --- /dev/null +++ b/src/Data/Database/Document.cs @@ -0,0 +1,9 @@ +using VSH.Data.Enums; + +namespace VSH.Data.Database; + +public class Document : Base +{ + public DocumentType Type { get; set; } + public string Content { get; set; } +}
\ No newline at end of file diff --git a/src/Data/Database/Order.cs b/src/Data/Database/Order.cs new file mode 100644 index 0000000..02869b2 --- /dev/null +++ b/src/Data/Database/Order.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using IOL.Helpers; +using IOL.VippsEcommerce.Models.Api; +using VSH.Data.Enums; +using VSH.Utilities; + +namespace VSH.Data.Database; + +public class Order : Base +{ + public string Comment { get; set; } + public string OrderReference { get; set; } + public OrderStatus Status { get; set; } + public OrderPaymentType PaymentType { get; set; } + public string VippsTransactionId { get; set; } + public ETransactionStatus VippsTransactionStatus { get; set; } + public EStatusEnum VippsStatus { get; set; } + public ContactInformation ContactInfo { get; set; } + public List<OrderProduct> Products { get; set; } + + public class ContactInformation + { + public string Name { get; set; } + public string PhoneNumber { get; set; } + public string EmailAddress { get; set; } + } + + public decimal Total(bool includeTax = true) { + if (!Products.Any()) + return default; + var total = Products.Sum(product => product.PriceAtTimeOfOrder * product.NumberOfItems); + if (includeTax) + return total; + var taxCut = total * 25 / 100; + return total - taxCut; + } + + public decimal Tax(bool includeTax = true) { + if (!Products.Any()) + return default; + var total = Products.Sum(product => product.PriceAtTimeOfOrder * product.NumberOfItems); + var taxCut = total * 25 / 100; + return taxCut; + } + + public string GetAdminMailContent(string hostname) => @$" +Referanse: {OrderReference} +Lenke: {hostname}/kontoret/bestillinger?order={OrderReference} +Betalingsmetode: {EnumName.ForPaymentType(PaymentType)} +Status: {EnumName.ForOrderStatus(Status)} +Navn: {ContactInfo.Name} +E-postadresse: {ContactInfo.EmailAddress} +Telefon: {ContactInfo.PhoneNumber} +{(Comment.HasValue() ? "Kommentar:" + Comment : "")} +"; + + public string GetCustomerMailContent(string hostname) => @$" +Hei {ContactInfo.Name}, tusen takk for din bestilling! +Gå til {hostname}/status/{OrderReference} for å få full oversikt over bestillinga. + +Hvis du har spørsmål angående din ordre er det bare å svare på denne mailen så svarer vi så raskt vi kan. + +Med venleg hilsen + +Øystein og Bodil +Vinjesvingen Handel AS +915 61 900 +"; +} + +public class OrderProduct +{ + public Guid Id { get; set; } + + public int NumberOfItems { get; set; } + + public decimal PriceAtTimeOfOrder { get; set; } + + public decimal Total(bool includeTax = true) { + if (NumberOfItems == default || PriceAtTimeOfOrder == default) + return default; + var total = PriceAtTimeOfOrder * NumberOfItems; + if (includeTax) + return total; + var taxCut = total * 25 / 100; + return total - taxCut; + } + + public decimal Tax(bool includeTax = true) { + if (NumberOfItems == default || PriceAtTimeOfOrder == default) + return default; + var total = PriceAtTimeOfOrder * NumberOfItems; + var taxCut = total * 25 / 100; + return taxCut; + } +}
\ No newline at end of file diff --git a/src/Data/Database/Product.cs b/src/Data/Database/Product.cs new file mode 100644 index 0000000..d8a3d8b --- /dev/null +++ b/src/Data/Database/Product.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using VSH.Data.Enums; +using VSH.Data.Miscellaneous; +using VSH.Data.Static; +using VSH.Utilities; + +namespace VSH.Data.Database; + +public class Product : Base +{ + public string Name { get; set; } + public string Description { get; set; } + public decimal Price { get; set; } + public PriceSuffix PriceSuffix { get; set; } + public ProductVisibility VisibilityState { get; set; } + public Category Category { get; set; } + public List<ProductImage> Images { get; set; } + public int Count { get; set; } + public string Slug { get; set; } + public bool ShowOnFrontpage { get; set; } + + public string ReadablePriceSuffix => EnumName.ForPriceSuffix(PriceSuffix); + + public AppPath GetPrimaryImage() { + var productImage = Images.OrderBy(c => c.Order).FirstOrDefault(); + return productImage != default ? productImage.GetPath() : AppPaths.DefaultProductImage; + } + + public string WebPath() => $"/produktar/{Category?.Slug}/{Slug}"; + + public bool IsVisible => VisibilityState == ProductVisibility.DEFAULT; + public bool IsAvailable => Count == -1 || Count >= 1; +} + +public class ProductImage +{ + public ProductImage(string fileName = default, int order = default) { + FileName = fileName; + Order = order; + } + + public int Order { get; } + public string FileName { get; } + + public AppPath GetPath() { + if (FileName == default) return AppPaths.DefaultProductImage; + return new AppPath { + WebPath = Path.Combine(AppPaths.ProductImages.WebPath, FileName), + HostPath = Path.Combine(AppPaths.ProductImages.HostPath, FileName), + }; + } +}
\ No newline at end of file diff --git a/src/Data/Database/User.cs b/src/Data/Database/User.cs new file mode 100644 index 0000000..f8b083d --- /dev/null +++ b/src/Data/Database/User.cs @@ -0,0 +1,18 @@ +using IOL.Helpers; + +namespace VSH.Data.Database; + +public class User : Base +{ + public User(string username) => Username = username; + public string Username { get; set; } + public string Password { get; set; } + + public void HashAndSetPassword(string password) { + Password = PasswordHelper.HashPassword(password); + } + + public bool VerifyPassword(string password) { + return PasswordHelper.Verify(password, Password); + } +}
\ No newline at end of file diff --git a/src/Data/Dtos/AdminViewOrderDto.cs b/src/Data/Dtos/AdminViewOrderDto.cs new file mode 100644 index 0000000..846b503 --- /dev/null +++ b/src/Data/Dtos/AdminViewOrderDto.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using VSH.Data.Database; +using VSH.Data.Enums; + +namespace VSH.Data.Dtos; + +public class AdminViewOrderDto +{ + public Guid Id { get; set; } + public Order.ContactInformation ContactInformation { get; set; } + public List<OrderDetailProduct> Products { get; set; } + public string OrderReference { get; set; } + public DateTime OrderDate { get; set; } + public OrderPaymentType PaymentType { get; set; } + public OrderStatus Status { get; set; } + public string VippsStatus { get; set; } + public string VippsId { get; set; } + public string VippsTransactionStatus { get; set; } + public string Comment { get; set; } + + public class OrderDetailProduct + { + public Guid Id { get; set; } + public string Name { get; set; } + public int Count { get; set; } + public decimal PayedPrice { get; set; } + } +}
\ No newline at end of file diff --git a/src/Data/Enums/AnalyticType.cs b/src/Data/Enums/AnalyticType.cs new file mode 100644 index 0000000..0ec8b6b --- /dev/null +++ b/src/Data/Enums/AnalyticType.cs @@ -0,0 +1,7 @@ +namespace VSH.Data.Enums; + +public enum AnalyticType +{ + PAGE_LOAD, + ERROR +}
\ No newline at end of file diff --git a/src/Data/Enums/CategoryVisibility.cs b/src/Data/Enums/CategoryVisibility.cs new file mode 100644 index 0000000..b69ee56 --- /dev/null +++ b/src/Data/Enums/CategoryVisibility.cs @@ -0,0 +1,8 @@ +namespace VSH.Data.Enums; + +public enum CategoryVisibility +{ + DEFAULT = 0, + DISABLED = 1, + DELETED = 2 +}
\ No newline at end of file diff --git a/src/Data/Enums/CookieType.cs b/src/Data/Enums/CookieType.cs new file mode 100644 index 0000000..74f1742 --- /dev/null +++ b/src/Data/Enums/CookieType.cs @@ -0,0 +1,8 @@ +namespace VSH.Data.Enums; + +public enum CookieType +{ + XSRF = 0, + SESSION = 1, + CULTURE = 2 +}
\ No newline at end of file diff --git a/src/Data/Enums/DocumentType.cs b/src/Data/Enums/DocumentType.cs new file mode 100644 index 0000000..084e80e --- /dev/null +++ b/src/Data/Enums/DocumentType.cs @@ -0,0 +1,10 @@ +namespace VSH.Data.Enums; + +public enum DocumentType +{ + PRIVACY_POLICY = 0, + SALES_TERMS = 1, + ABOUT_PAGE = 2, + CONTACT_PAGE = 3, + DEALERS_PAGE = 4, +}
\ No newline at end of file diff --git a/src/Data/Enums/OrderAdminStatus.cs b/src/Data/Enums/OrderAdminStatus.cs new file mode 100644 index 0000000..b3235ea --- /dev/null +++ b/src/Data/Enums/OrderAdminStatus.cs @@ -0,0 +1,9 @@ +namespace VSH.Data.Enums; + +public enum OrderAdminStatus +{ + VIPPS_CAPTURED = 0, + INVOICE_SENT = 1, + PAYED = 2, + IN_PROGESS = 3, +}
\ No newline at end of file diff --git a/src/Data/Enums/OrderPaymentType.cs b/src/Data/Enums/OrderPaymentType.cs new file mode 100644 index 0000000..73df3b9 --- /dev/null +++ b/src/Data/Enums/OrderPaymentType.cs @@ -0,0 +1,7 @@ +namespace VSH.Data.Enums; + +public enum OrderPaymentType +{ + VIPPS = 0, + INVOICE_BY_EMAIL = 1 +}
\ No newline at end of file diff --git a/src/Data/Enums/OrderStatus.cs b/src/Data/Enums/OrderStatus.cs new file mode 100644 index 0000000..9baee22 --- /dev/null +++ b/src/Data/Enums/OrderStatus.cs @@ -0,0 +1,11 @@ +namespace VSH.Data.Enums; + +public enum OrderStatus +{ + IN_PROGRESS = 0, + CANCELLED = 1, + FAILED = 2, + COMPLETED = 3, + AWAITING_INVOICE = 4, + AWAITING_VIPPS = 5, +}
\ No newline at end of file diff --git a/src/Data/Enums/PriceSuffix.cs b/src/Data/Enums/PriceSuffix.cs new file mode 100644 index 0000000..c421cd2 --- /dev/null +++ b/src/Data/Enums/PriceSuffix.cs @@ -0,0 +1,7 @@ +namespace VSH.Data.Enums; + +public enum PriceSuffix +{ + PER = 0, + KILOS = 1 +}
\ No newline at end of file diff --git a/src/Data/Enums/ProductVisibility.cs b/src/Data/Enums/ProductVisibility.cs new file mode 100644 index 0000000..41ecc4d --- /dev/null +++ b/src/Data/Enums/ProductVisibility.cs @@ -0,0 +1,8 @@ +namespace VSH.Data.Enums; + +public enum ProductVisibility +{ + DEFAULT = 0, + DISABLED = 1, + DELETED = 2 +}
\ No newline at end of file diff --git a/src/Data/MainDbContext.cs b/src/Data/MainDbContext.cs new file mode 100644 index 0000000..c95a4d0 --- /dev/null +++ b/src/Data/MainDbContext.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore; +using VSH.Data.Database; + +namespace VSH.Data; + +public class MainDbContext : DbContext +{ + public MainDbContext(DbContextOptions<MainDbContext> options) : base(options) { } + + public DbSet<User> Users { get; set; } + public DbSet<Category> Categories { get; set; } + public DbSet<Product> Products { get; set; } + public DbSet<Order> Orders { get; set; } + public DbSet<Document> Documents { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) { + modelBuilder.Entity<User>(e => { + e.ToTable("Users"); + }); + modelBuilder.Entity<Category>(e => { + e.ToTable("Categories"); + }); + modelBuilder.Entity<Order>(e => { + e.Property(c => c.Products).HasColumnType("jsonb"); + e.Property(c => c.ContactInfo).HasColumnType("jsonb"); + e.ToTable("Orders"); + }); + + modelBuilder.Entity<Product>(e => { + e.Property(c => c.Images).HasColumnType("jsonb"); + e.ToTable("Products"); + }); + + modelBuilder.Entity<Document>(e => { + e.ToTable("Documents"); + }); + + base.OnModelCreating(modelBuilder); + } +}
\ No newline at end of file diff --git a/src/Data/Miscellaneous/AppCookie.cs b/src/Data/Miscellaneous/AppCookie.cs new file mode 100644 index 0000000..f355bb6 --- /dev/null +++ b/src/Data/Miscellaneous/AppCookie.cs @@ -0,0 +1,8 @@ +namespace VSH.Data.Miscellaneous; + +public sealed record AppCookie +{ + public string Name { get; init; } + public string Description { get; init; } + public bool Required { get; init; } +}
\ No newline at end of file diff --git a/src/Data/Miscellaneous/AppPath.cs b/src/Data/Miscellaneous/AppPath.cs new file mode 100644 index 0000000..4e17a88 --- /dev/null +++ b/src/Data/Miscellaneous/AppPath.cs @@ -0,0 +1,7 @@ +namespace VSH.Data.Miscellaneous; + +public sealed record AppPath +{ + public string HostPath { get; init; } + public string WebPath { get; init; } +}
\ No newline at end of file diff --git a/src/Data/Miscellaneous/AppSettings.cs b/src/Data/Miscellaneous/AppSettings.cs new file mode 100644 index 0000000..048c67c --- /dev/null +++ b/src/Data/Miscellaneous/AppSettings.cs @@ -0,0 +1,118 @@ +using System.Text.Json.Serialization; + +namespace VSH.Data.Miscellaneous; + +public class AppSettings +{ + [JsonPropertyName("General")] + public GeneralConfiguration General { get; set; } + + [JsonPropertyName("Serilog")] + public SerilogConfiguration Serilog { get; set; } + + public class GeneralConfiguration + { + public const string Name = "General"; + + [JsonPropertyName("StoreName")] + public string StoreName { get; set; } + + [JsonPropertyName("LegalName")] + public string LegalName { get; set; } + + [JsonPropertyName("ShortStoreName")] + public string ShortStoreName { get; set; } + + [JsonPropertyName("DefaultCulture")] + public string DefaultCulture { get; set; } + + [JsonPropertyName("GoogleMapsUrl")] + public string GoogleMapsUrl { get; set; } + + [JsonPropertyName("DefaultDescription")] + public string DefaultDescription { get; set; } + } + + public class SerilogConfiguration + { + public const string Name = "Serilog"; + + [JsonPropertyName("Using")] + public string[] Using { get; set; } + + [JsonPropertyName("MinimumLevel")] + public MinimumLevel MinimumLevel { get; set; } + + [JsonPropertyName("WriteTo")] + public WriteTo[] WriteTo { get; set; } + + [JsonPropertyName("Enrich")] + public string[] Enrich { get; set; } + + [JsonPropertyName("Destructure")] + public Destructure[] Destructure { get; set; } + + [JsonPropertyName("Properties")] + public Properties Properties { get; set; } + } + + public class Destructure + { + [JsonPropertyName("Name")] + public string Name { get; set; } + + [JsonPropertyName("Args")] + public Args Args { get; set; } + } + + public class Args + { + [JsonPropertyName("maximumDestructuringDepth")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public long? MaximumDestructuringDepth { get; set; } + + [JsonPropertyName("maximumStringLength")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public long? MaximumStringLength { get; set; } + + [JsonPropertyName("maximumCollectionCount")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public long? MaximumCollectionCount { get; set; } + } + + public class MinimumLevel + { + [JsonPropertyName("Default")] + public string Default { get; set; } + + [JsonPropertyName("Override")] + public Override Override { get; set; } + } + + public class Override + { + [JsonPropertyName("Microsoft")] + public string Microsoft { get; set; } + + [JsonPropertyName("System")] + public string System { get; set; } + + [JsonPropertyName("Microsoft.AspNetCore")] + public string MicrosoftAspNetCore { get; set; } + + [JsonPropertyName("Microsoft.Hosting")] + public string MicrosoftHosting { get; set; } + } + + public class Properties + { + [JsonPropertyName("Application")] + public string Application { get; set; } + } + + public class WriteTo + { + [JsonPropertyName("Name")] + public string Name { get; set; } + } +}
\ No newline at end of file diff --git a/src/Data/Miscellaneous/OpenGraphData.cs b/src/Data/Miscellaneous/OpenGraphData.cs new file mode 100644 index 0000000..5bf33fe --- /dev/null +++ b/src/Data/Miscellaneous/OpenGraphData.cs @@ -0,0 +1,12 @@ +namespace VSH.Data.Miscellaneous; + +public class OpenGraphData +{ + public string Type { get; set; } + public string Locale { get; set; } + public string Url { get; set; } + public string Title { get; set; } + public string Description { get; set; } + public string SiteName { get; set; } + public string Image { get; set; } +}
\ No newline at end of file diff --git a/src/Data/Payloads/CreateProductDto.cs b/src/Data/Payloads/CreateProductDto.cs new file mode 100644 index 0000000..eada16e --- /dev/null +++ b/src/Data/Payloads/CreateProductDto.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using VSH.Data.Enums; + +namespace VSH.Data.Payloads; + +public class CreateProductDto +{ + public string Name { get; set; } + public string Description { get; set; } + public double Price { get; set; } + public PriceSuffix PriceSuffix { get; set; } + public Guid CategoryId { get; set; } + public List<TProductImage> Images { get; set; } + public int Count { get; set; } + + public class TProductImage + { + public string FileName { get; set; } + public int Order { get; set; } + } +}
\ No newline at end of file diff --git a/src/Data/Payloads/LoginPayload.cs b/src/Data/Payloads/LoginPayload.cs new file mode 100644 index 0000000..8e4f461 --- /dev/null +++ b/src/Data/Payloads/LoginPayload.cs @@ -0,0 +1,8 @@ +namespace VSH.Data.Payloads; + +public record LoginPayload +{ + public string Username { get; set; } + public string Password { get; set; } + public bool Persist { get; set; } +}
\ No newline at end of file diff --git a/src/Data/Payloads/UpdatePasswordPayload.cs b/src/Data/Payloads/UpdatePasswordPayload.cs new file mode 100644 index 0000000..4105eb4 --- /dev/null +++ b/src/Data/Payloads/UpdatePasswordPayload.cs @@ -0,0 +1,6 @@ +namespace VSH.Data.Payloads; + +public class UpdatePasswordPayload +{ + public string NewPassword { get; set; } +}
\ No newline at end of file diff --git a/src/Data/Payloads/ValidateOrderPayload.cs b/src/Data/Payloads/ValidateOrderPayload.cs new file mode 100644 index 0000000..d3aee82 --- /dev/null +++ b/src/Data/Payloads/ValidateOrderPayload.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace VSH.Data.Payloads; + +public record ValidateOrderPayload +{ + public List<ProductValidationDto> Products { get; set; } + + public class ProductValidationDto + { + public Guid Id { get; set; } + public int Count { get; set; } + } +}
\ No newline at end of file diff --git a/src/Data/Results/AppValidationResult.cs b/src/Data/Results/AppValidationResult.cs new file mode 100644 index 0000000..0b1c967 --- /dev/null +++ b/src/Data/Results/AppValidationResult.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace VSH.Data.Results; + +public class AppValidationResult +{ + public AppValidationResult() { + Errors = new List<ValidationError>(); + } + + public bool IsValid => !Errors.Any(); + public List<ValidationError> Errors { get; set; } + + + public class ValidationError + { + public ValidationError(Guid id = default) { + Id = id != default ? id : null; + Errors = new List<string>(); + } + + public Guid? Id { get; set; } + public List<string> Errors { get; set; } + } +}
\ No newline at end of file diff --git a/src/Data/Results/ErrorResult.cs b/src/Data/Results/ErrorResult.cs new file mode 100644 index 0000000..60d1b1d --- /dev/null +++ b/src/Data/Results/ErrorResult.cs @@ -0,0 +1,12 @@ +namespace VSH.Data.Results; + +public class ErrorResult +{ + public ErrorResult(string title = default, string message = default) { + Title = title; + Message = message; + } + + public string Title { get; set; } + public string Message { get; set; } +}
\ No newline at end of file diff --git a/src/Data/Static/AppCookies.cs b/src/Data/Static/AppCookies.cs new file mode 100644 index 0000000..711d59e --- /dev/null +++ b/src/Data/Static/AppCookies.cs @@ -0,0 +1,21 @@ +using VSH.Data.Miscellaneous; + +namespace VSH.Data.Static; + +public static class AppCookies +{ + public static AppCookie Xsrf => new() { + Name = "vsh_xsrf", + Required = true + }; + + public static AppCookie Session => new() { + Name = "vsh_session", + Required = true + }; + + public static AppCookie Culture => new() { + Name = "vsh_culture", + Required = false + }; +}
\ No newline at end of file diff --git a/src/Data/Static/AppPaths.cs b/src/Data/Static/AppPaths.cs new file mode 100644 index 0000000..4073a75 --- /dev/null +++ b/src/Data/Static/AppPaths.cs @@ -0,0 +1,40 @@ +using System.IO; +using VSH.Data.Miscellaneous; + +namespace VSH.Data.Static; + +public static class AppPaths +{ + public static AppPath WwwRoot => new() { + HostPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"), + WebPath = "/" + }; + + public static AppPath Assets => new() { + HostPath = Path.Combine(WwwRoot.HostPath, "assets"), + WebPath = "/assets" + }; + + public static AppPath ProductImages => new() { + HostPath = Path.Combine(Assets.HostPath, "images", "products"), + WebPath = Path.Combine(Assets.WebPath, "images", "products") + }; + + public static AppPath DocumentImages => new() { + HostPath = Path.Combine(Assets.HostPath, "images", "documents"), + WebPath = Path.Combine(Assets.WebPath, "images", "documents") + }; + + public static AppPath DataProtectionKeys => new() { + HostPath = Path.Combine(AppData.HostPath, "DPKeys"), + }; + + public static AppPath AppData => new() { + HostPath = Path.Combine(Directory.GetCurrentDirectory(), "AppData"), + }; + + public static AppPath DefaultProductImage => new() { + HostPath = Path.Combine(Assets.HostPath, "profile", "innrammet.svg"), + WebPath = Path.Combine(Assets.WebPath, "profile", "innrammet.svg") + }; +}
\ No newline at end of file diff --git a/src/Migrations/20210305140605_CleanSlate.Designer.cs b/src/Migrations/20210305140605_CleanSlate.Designer.cs new file mode 100644 index 0000000..7065863 --- /dev/null +++ b/src/Migrations/20210305140605_CleanSlate.Designer.cs @@ -0,0 +1,315 @@ +// <auto-generated /> +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using VSH.Data; +using VSH.Data.Database; +// using VSH.Data.Vipps; + +namespace VSH.Migrations +{ + [DbContext(typeof(MainDbContext))] + [Migration("20210305140605_CleanSlate")] + partial class CleanSlate + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.3") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_categories"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("VSH.Data.Database.Document", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Content") + .HasColumnType("text") + .HasColumnName("content"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<int>("Type") + .HasColumnType("integer") + .HasColumnName("type"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.HasKey("Id") + .HasName("pk_documents"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("VSH.Data.Database.Order", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property<Order.ContactInformation>("ContactInfo") + .HasColumnType("jsonb") + .HasColumnName("contact_info"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("OrderReference") + .HasColumnType("text") + .HasColumnName("order_reference"); + + b.Property<int>("PaymentType") + .HasColumnType("integer") + .HasColumnName("payment_type"); + + b.Property<List<OrderProduct>>("Products") + .HasColumnType("jsonb") + .HasColumnName("products"); + + b.Property<int>("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.HasKey("Id") + .HasName("pk_orders"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<Guid?>("CategoryId") + .HasColumnType("uuid") + .HasColumnName("category_id"); + + b.Property<int>("Count") + .HasColumnType("integer") + .HasColumnName("count"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property<List<ProductImage>>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<decimal>("Price") + .HasColumnType("numeric") + .HasColumnName("price"); + + b.Property<int>("PriceSuffix") + .HasColumnType("integer") + .HasColumnName("price_suffix"); + + b.Property<bool>("ShowOnFrontpage") + .HasColumnType("boolean") + .HasColumnName("show_on_frontpage"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_products"); + + b.HasIndex("CategoryId") + .HasDatabaseName("ix_products_category_id"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("VSH.Data.Database.User", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<string>("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.ToTable("Users"); + }); + // + // modelBuilder.Entity("VSH.Data.Database.VippsResponse", b => + // { + // b.Property<Guid>("Id") + // .ValueGeneratedOnAdd() + // .HasColumnType("uuid") + // .HasColumnName("id"); + // + // b.Property<VippsPaymentActionResponse>("CancellationResponse") + // .HasColumnType("jsonb") + // .HasColumnName("cancellation_response"); + // + // b.Property<VippsPaymentActionResponse>("CaptureResponse") + // .HasColumnType("jsonb") + // .HasColumnName("capture_response"); + // + // b.Property<DateTime>("Created") + // .HasColumnType("timestamp without time zone") + // .HasColumnName("created"); + // + // b.Property<VippsErrorResponse>("ErrorResponse") + // .HasColumnType("jsonb") + // .HasColumnName("error_response"); + // + // b.Property<VippsPaymentInitiationCallbackResponse>("InitiationResponse") + // .HasColumnType("jsonb") + // .HasColumnName("initiation_response"); + // + // b.Property<Guid>("OrderId") + // .HasColumnType("uuid") + // .HasColumnName("order_id"); + // + // b.Property<VippsGetPaymentDetailsResponse>("PaymentDetailResponse") + // .HasColumnType("jsonb") + // .HasColumnName("payment_detail_response"); + // + // b.Property<VippsPaymentActionResponse>("RefundResponse") + // .HasColumnType("jsonb") + // .HasColumnName("refund_response"); + // + // b.Property<int>("StatusCode") + // .HasColumnType("integer") + // .HasColumnName("status_code"); + // + // b.Property<DateTime?>("Updated") + // .HasColumnType("timestamp without time zone") + // .HasColumnName("updated"); + // + // b.HasKey("Id") + // .HasName("pk_vipps_responses"); + // + // b.HasIndex("OrderId") + // .HasDatabaseName("ix_vipps_responses_order_id"); + // + // b.ToTable("VippsResponses"); + // }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.HasOne("VSH.Data.Database.Category", "Category") + .WithMany("Products") + .HasForeignKey("CategoryId") + .HasConstraintName("fk_products_categories_category_id"); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("VSH.Data.Database.VippsResponse", b => + { + b.HasOne("VSH.Data.Database.Order", null) + .WithMany("VippsResponses") + .HasForeignKey("OrderId") + .HasConstraintName("fk_vipps_responses_orders_order_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Navigation("Products"); + }); + + modelBuilder.Entity("VSH.Data.Database.Order", b => + { + b.Navigation("VippsResponses"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Migrations/20210305140605_CleanSlate.cs b/src/Migrations/20210305140605_CleanSlate.cs new file mode 100644 index 0000000..bde6c16 --- /dev/null +++ b/src/Migrations/20210305140605_CleanSlate.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using IOL.VippsEcommerce.Models.Api; +using Microsoft.EntityFrameworkCore.Migrations; +using VSH.Data.Database; + +namespace VSH.Migrations +{ + public partial class CleanSlate : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Categories", + columns: table => new + { + id = table.Column<Guid>(type: "uuid", nullable: false), + name = table.Column<string>(type: "text", nullable: true), + slug = table.Column<string>(type: "text", nullable: true), + visibility_state = table.Column<int>(type: "integer", nullable: false), + created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false), + updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_categories", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "Documents", + columns: table => new + { + id = table.Column<Guid>(type: "uuid", nullable: false), + type = table.Column<int>(type: "integer", nullable: false), + content = table.Column<string>(type: "text", nullable: true), + created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false), + updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_documents", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "Orders", + columns: table => new + { + id = table.Column<Guid>(type: "uuid", nullable: false), + comment = table.Column<string>(type: "text", nullable: true), + order_reference = table.Column<string>(type: "text", nullable: true), + status = table.Column<int>(type: "integer", nullable: false), + payment_type = table.Column<int>(type: "integer", nullable: false), + contact_info = table.Column<Order.ContactInformation>(type: "jsonb", nullable: true), + products = table.Column<List<OrderProduct>>(type: "jsonb", nullable: true), + created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false), + updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_orders", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + id = table.Column<Guid>(type: "uuid", nullable: false), + username = table.Column<string>(type: "text", nullable: true), + password = table.Column<string>(type: "text", nullable: true), + created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false), + updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_users", x => x.id); + }); + + migrationBuilder.CreateTable( + name: "Products", + columns: table => new + { + id = table.Column<Guid>(type: "uuid", nullable: false), + name = table.Column<string>(type: "text", nullable: true), + description = table.Column<string>(type: "text", nullable: true), + price = table.Column<decimal>(type: "numeric", nullable: false), + price_suffix = table.Column<int>(type: "integer", nullable: false), + visibility_state = table.Column<int>(type: "integer", nullable: false), + category_id = table.Column<Guid>(type: "uuid", nullable: true), + images = table.Column<List<ProductImage>>(type: "jsonb", nullable: true), + count = table.Column<int>(type: "integer", nullable: false), + slug = table.Column<string>(type: "text", nullable: true), + show_on_frontpage = table.Column<bool>(type: "boolean", nullable: false), + created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false), + updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_products", x => x.id); + table.ForeignKey( + name: "fk_products_categories_category_id", + column: x => x.category_id, + principalTable: "Categories", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "VippsResponses", + columns: table => new + { + id = table.Column<Guid>(type: "uuid", nullable: false), + order_id = table.Column<Guid>(type: "uuid", nullable: false), + status_code = table.Column<int>(type: "integer", nullable: false), + initiation_response = table.Column<VippsPaymentInitiationCallbackResponse>(type: "jsonb", nullable: true), + payment_detail_response = table.Column<VippsGetPaymentDetailsResponse>(type: "jsonb", nullable: true), + cancellation_response = table.Column<VippsPaymentActionResponse>(type: "jsonb", nullable: true), + refund_response = table.Column<VippsPaymentActionResponse>(type: "jsonb", nullable: true), + capture_response = table.Column<VippsPaymentActionResponse>(type: "jsonb", nullable: true), + error_response = table.Column<VippsErrorResponse>(type: "jsonb", nullable: true), + created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false), + updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_vipps_responses", x => x.id); + table.ForeignKey( + name: "fk_vipps_responses_orders_order_id", + column: x => x.order_id, + principalTable: "Orders", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "ix_products_category_id", + table: "Products", + column: "category_id"); + + migrationBuilder.CreateIndex( + name: "ix_vipps_responses_order_id", + table: "VippsResponses", + column: "order_id"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Documents"); + + migrationBuilder.DropTable( + name: "Products"); + + migrationBuilder.DropTable( + name: "Users"); + + migrationBuilder.DropTable( + name: "VippsResponses"); + + migrationBuilder.DropTable( + name: "Categories"); + + migrationBuilder.DropTable( + name: "Orders"); + } + } +} diff --git a/src/Migrations/20210308201742_VippsResponsesAsStrings.Designer.cs b/src/Migrations/20210308201742_VippsResponsesAsStrings.Designer.cs new file mode 100644 index 0000000..5a332a5 --- /dev/null +++ b/src/Migrations/20210308201742_VippsResponsesAsStrings.Designer.cs @@ -0,0 +1,314 @@ +// <auto-generated /> +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using VSH.Data; +using VSH.Data.Database; + +namespace VSH.Migrations +{ + [DbContext(typeof(MainDbContext))] + [Migration("20210308201742_VippsResponsesAsStrings")] + partial class VippsResponsesAsStrings + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.3") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_categories"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("VSH.Data.Database.Document", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Content") + .HasColumnType("text") + .HasColumnName("content"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<int>("Type") + .HasColumnType("integer") + .HasColumnName("type"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.HasKey("Id") + .HasName("pk_documents"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("VSH.Data.Database.Order", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property<Order.ContactInformation>("ContactInfo") + .HasColumnType("jsonb") + .HasColumnName("contact_info"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("OrderReference") + .HasColumnType("text") + .HasColumnName("order_reference"); + + b.Property<int>("PaymentType") + .HasColumnType("integer") + .HasColumnName("payment_type"); + + b.Property<List<OrderProduct>>("Products") + .HasColumnType("jsonb") + .HasColumnName("products"); + + b.Property<int>("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.HasKey("Id") + .HasName("pk_orders"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<Guid?>("CategoryId") + .HasColumnType("uuid") + .HasColumnName("category_id"); + + b.Property<int>("Count") + .HasColumnType("integer") + .HasColumnName("count"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property<List<ProductImage>>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<decimal>("Price") + .HasColumnType("numeric") + .HasColumnName("price"); + + b.Property<int>("PriceSuffix") + .HasColumnType("integer") + .HasColumnName("price_suffix"); + + b.Property<bool>("ShowOnFrontpage") + .HasColumnType("boolean") + .HasColumnName("show_on_frontpage"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_products"); + + b.HasIndex("CategoryId") + .HasDatabaseName("ix_products_category_id"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("VSH.Data.Database.User", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<string>("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("VSH.Data.Database.VippsResponse", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("CancellationResponse") + .HasColumnType("jsonb") + .HasColumnName("cancellation_response"); + + b.Property<string>("CaptureResponse") + .HasColumnType("jsonb") + .HasColumnName("capture_response"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("ErrorResponse") + .HasColumnType("jsonb") + .HasColumnName("error_response"); + + b.Property<string>("InitiationResponse") + .HasColumnType("jsonb") + .HasColumnName("initiation_response"); + + b.Property<Guid>("OrderId") + .HasColumnType("uuid") + .HasColumnName("order_id"); + + b.Property<string>("PaymentDetailResponse") + .HasColumnType("jsonb") + .HasColumnName("payment_detail_response"); + + b.Property<string>("RefundResponse") + .HasColumnType("jsonb") + .HasColumnName("refund_response"); + + b.Property<int>("StatusCode") + .HasColumnType("integer") + .HasColumnName("status_code"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.HasKey("Id") + .HasName("pk_vipps_responses"); + + b.HasIndex("OrderId") + .HasDatabaseName("ix_vipps_responses_order_id"); + + b.ToTable("VippsResponses"); + }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.HasOne("VSH.Data.Database.Category", "Category") + .WithMany("Products") + .HasForeignKey("CategoryId") + .HasConstraintName("fk_products_categories_category_id"); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("VSH.Data.Database.VippsResponse", b => + { + b.HasOne("VSH.Data.Database.Order", null) + .WithMany("VippsResponses") + .HasForeignKey("OrderId") + .HasConstraintName("fk_vipps_responses_orders_order_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Navigation("Products"); + }); + + modelBuilder.Entity("VSH.Data.Database.Order", b => + { + b.Navigation("VippsResponses"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Migrations/20210308201742_VippsResponsesAsStrings.cs b/src/Migrations/20210308201742_VippsResponsesAsStrings.cs new file mode 100644 index 0000000..c0de79a --- /dev/null +++ b/src/Migrations/20210308201742_VippsResponsesAsStrings.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace VSH.Migrations +{ + public partial class VippsResponsesAsStrings : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/src/Migrations/20210309193123_RemoveVippsResponses.Designer.cs b/src/Migrations/20210309193123_RemoveVippsResponses.Designer.cs new file mode 100644 index 0000000..81db0a1 --- /dev/null +++ b/src/Migrations/20210309193123_RemoveVippsResponses.Designer.cs @@ -0,0 +1,255 @@ +// <auto-generated /> +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using VSH.Data; +using VSH.Data.Database; + +namespace VSH.Migrations +{ + [DbContext(typeof(MainDbContext))] + [Migration("20210309193123_RemoveVippsResponses")] + partial class RemoveVippsResponses + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.3") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_categories"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("VSH.Data.Database.Document", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Content") + .HasColumnType("text") + .HasColumnName("content"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<int>("Type") + .HasColumnType("integer") + .HasColumnName("type"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.HasKey("Id") + .HasName("pk_documents"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("VSH.Data.Database.Order", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property<Order.ContactInformation>("ContactInfo") + .HasColumnType("jsonb") + .HasColumnName("contact_info"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("OrderReference") + .HasColumnType("text") + .HasColumnName("order_reference"); + + b.Property<int>("PaymentType") + .HasColumnType("integer") + .HasColumnName("payment_type"); + + b.Property<List<OrderProduct>>("Products") + .HasColumnType("jsonb") + .HasColumnName("products"); + + b.Property<int>("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VippsStatus") + .HasColumnType("integer") + .HasColumnName("vipps_status"); + + b.Property<string>("VippsTransactionId") + .HasColumnType("text") + .HasColumnName("vipps_transaction_id"); + + b.Property<int>("VippsTransactionStatus") + .HasColumnType("integer") + .HasColumnName("vipps_transaction_status"); + + b.HasKey("Id") + .HasName("pk_orders"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<Guid?>("CategoryId") + .HasColumnType("uuid") + .HasColumnName("category_id"); + + b.Property<int>("Count") + .HasColumnType("integer") + .HasColumnName("count"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property<List<ProductImage>>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<decimal>("Price") + .HasColumnType("numeric") + .HasColumnName("price"); + + b.Property<int>("PriceSuffix") + .HasColumnType("integer") + .HasColumnName("price_suffix"); + + b.Property<bool>("ShowOnFrontpage") + .HasColumnType("boolean") + .HasColumnName("show_on_frontpage"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_products"); + + b.HasIndex("CategoryId") + .HasDatabaseName("ix_products_category_id"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("VSH.Data.Database.User", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<string>("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.HasOne("VSH.Data.Database.Category", "Category") + .WithMany("Products") + .HasForeignKey("CategoryId") + .HasConstraintName("fk_products_categories_category_id"); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Navigation("Products"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Migrations/20210309193123_RemoveVippsResponses.cs b/src/Migrations/20210309193123_RemoveVippsResponses.cs new file mode 100644 index 0000000..8fdd4f0 --- /dev/null +++ b/src/Migrations/20210309193123_RemoveVippsResponses.cs @@ -0,0 +1,81 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace VSH.Migrations +{ + public partial class RemoveVippsResponses : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "VippsResponses"); + + migrationBuilder.AddColumn<int>( + name: "vipps_status", + table: "Orders", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn<string>( + name: "vipps_transaction_id", + table: "Orders", + type: "text", + nullable: true); + + migrationBuilder.AddColumn<int>( + name: "vipps_transaction_status", + table: "Orders", + type: "integer", + nullable: false, + defaultValue: 0); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "vipps_status", + table: "Orders"); + + migrationBuilder.DropColumn( + name: "vipps_transaction_id", + table: "Orders"); + + migrationBuilder.DropColumn( + name: "vipps_transaction_status", + table: "Orders"); + + migrationBuilder.CreateTable( + name: "VippsResponses", + columns: table => new + { + id = table.Column<Guid>(type: "uuid", nullable: false), + cancellation_response = table.Column<string>(type: "jsonb", nullable: true), + capture_response = table.Column<string>(type: "jsonb", nullable: true), + created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false), + error_response = table.Column<string>(type: "jsonb", nullable: true), + initiation_response = table.Column<string>(type: "jsonb", nullable: true), + order_id = table.Column<Guid>(type: "uuid", nullable: false), + payment_detail_response = table.Column<string>(type: "jsonb", nullable: true), + refund_response = table.Column<string>(type: "jsonb", nullable: true), + status_code = table.Column<int>(type: "integer", nullable: false), + updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_vipps_responses", x => x.id); + table.ForeignKey( + name: "fk_vipps_responses_orders_order_id", + column: x => x.order_id, + principalTable: "Orders", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "ix_vipps_responses_order_id", + table: "VippsResponses", + column: "order_id"); + } + } +} diff --git a/src/Migrations/MainDbContextModelSnapshot.cs b/src/Migrations/MainDbContextModelSnapshot.cs new file mode 100644 index 0000000..34b688e --- /dev/null +++ b/src/Migrations/MainDbContextModelSnapshot.cs @@ -0,0 +1,253 @@ +// <auto-generated /> +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using VSH.Data; +using VSH.Data.Database; + +namespace VSH.Migrations +{ + [DbContext(typeof(MainDbContext))] + partial class MainDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.3") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_categories"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("VSH.Data.Database.Document", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Content") + .HasColumnType("text") + .HasColumnName("content"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<int>("Type") + .HasColumnType("integer") + .HasColumnName("type"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.HasKey("Id") + .HasName("pk_documents"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("VSH.Data.Database.Order", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Comment") + .HasColumnType("text") + .HasColumnName("comment"); + + b.Property<Order.ContactInformation>("ContactInfo") + .HasColumnType("jsonb") + .HasColumnName("contact_info"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("OrderReference") + .HasColumnType("text") + .HasColumnName("order_reference"); + + b.Property<int>("PaymentType") + .HasColumnType("integer") + .HasColumnName("payment_type"); + + b.Property<List<OrderProduct>>("Products") + .HasColumnType("jsonb") + .HasColumnName("products"); + + b.Property<int>("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VippsStatus") + .HasColumnType("integer") + .HasColumnName("vipps_status"); + + b.Property<string>("VippsTransactionId") + .HasColumnType("text") + .HasColumnName("vipps_transaction_id"); + + b.Property<int>("VippsTransactionStatus") + .HasColumnType("integer") + .HasColumnName("vipps_transaction_status"); + + b.HasKey("Id") + .HasName("pk_orders"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<Guid?>("CategoryId") + .HasColumnType("uuid") + .HasColumnName("category_id"); + + b.Property<int>("Count") + .HasColumnType("integer") + .HasColumnName("count"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property<List<ProductImage>>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<decimal>("Price") + .HasColumnType("numeric") + .HasColumnName("price"); + + b.Property<int>("PriceSuffix") + .HasColumnType("integer") + .HasColumnName("price_suffix"); + + b.Property<bool>("ShowOnFrontpage") + .HasColumnType("boolean") + .HasColumnName("show_on_frontpage"); + + b.Property<string>("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<int>("VisibilityState") + .HasColumnType("integer") + .HasColumnName("visibility_state"); + + b.HasKey("Id") + .HasName("pk_products"); + + b.HasIndex("CategoryId") + .HasDatabaseName("ix_products_category_id"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("VSH.Data.Database.User", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("Created") + .HasColumnType("timestamp without time zone") + .HasColumnName("created"); + + b.Property<string>("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property<DateTime?>("Updated") + .HasColumnType("timestamp without time zone") + .HasColumnName("updated"); + + b.Property<string>("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("VSH.Data.Database.Product", b => + { + b.HasOne("VSH.Data.Database.Category", "Category") + .WithMany("Products") + .HasForeignKey("CategoryId") + .HasConstraintName("fk_products_categories_category_id"); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("VSH.Data.Database.Category", b => + { + b.Navigation("Products"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Pages/Errors/Index.cshtml b/src/Pages/Errors/Index.cshtml new file mode 100644 index 0000000..5db7b59 --- /dev/null +++ b/src/Pages/Errors/Index.cshtml @@ -0,0 +1,33 @@ +@page "{code}" +@using System.Net +@model VSH.Pages.Errors.Index +@{ + ViewData["Title"] = Model.ErrorStatusCode switch { + HttpStatusCode.NotFound => "Fant ikkje sida", + var _ => "Uventa feil" + }; +} +<section class="container py-3 py-lg-5"> + @switch (Model.ErrorStatusCode) { + case HttpStatusCode.NotFound: + <div class="text-component text-center margin-bottom-lg"> + <h1>Fant ikkje siden</h1> + <p>Beklagar, sida du prøvar å nå finnes ikkje.</p> + <p><a href="/">Gå til forsida</a> eller <a href="/kontakt">kontakt oss</a>.</p> + </div> + break; + case HttpStatusCode.InternalServerError: + <div class="text-component text-center margin-bottom-lg"> + <h1>Her gjekk noko gale</h1> + <p>Vi jobbar med å løysa problemet, ver vennleg og prøv igjen seinare.</p> + </div> + break; + default: + <div class="text-component text-center margin-bottom-lg"> + <h1>Heisann, her gjekk ikkje alt etter planen</h1> + <p>Ver vennleg og prøv igjen snart.</p> + <p><a href="/">Gå til forsida</a> eller <a href="/kontakt">kontakt oss</a>.</p> + </div> + break; + } +</section> diff --git a/src/Pages/Errors/Index.cshtml.cs b/src/Pages/Errors/Index.cshtml.cs new file mode 100644 index 0000000..05e405d --- /dev/null +++ b/src/Pages/Errors/Index.cshtml.cs @@ -0,0 +1,19 @@ +using System; +using System.Net; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace VSH.Pages.Errors; + +public class Index : PageModel +{ + public HttpStatusCode ErrorStatusCode { get; set; } + + public void OnGet() { + try { + if (int.TryParse(RouteData.Values["code"]?.ToString(), out var status)) + ErrorStatusCode = (HttpStatusCode)status; + } catch (Exception e) { + Console.WriteLine(e); + } + } +}
\ No newline at end of file diff --git a/src/Pages/Handlekorg.cshtml b/src/Pages/Handlekorg.cshtml new file mode 100644 index 0000000..9f8f159 --- /dev/null +++ b/src/Pages/Handlekorg.cshtml @@ -0,0 +1,100 @@ +@page +@model VSH.Pages.Handlekorg +@{ + ViewData["Title"] = "Handlekorg"; +} + +<div class="container py-3 py-md-5"> + <div class="row"> + <div class="alert alert-info p-3 d-none" id="order-alert"></div> + <div class="col-12 col-lg-8 pe-lg-5"> + <div class="spinner-border text-primary m-0-auto d-flex" role="status" id="order-summary-spinner"> + <span class="visually-hidden">Lastar...</span> + </div> + <div class="d-none" id="order-summary-wrapper"> + <div class="row"> + <table class="table"> + <thead> + <tr> + <th scope="col">Produkt</th> + <th scope="col">Antall</th> + <th scope="col">Pris</th> + <th scope="col">Totalsum</th> + </tr> + </thead> + <tbody></tbody> + </table> + </div> + <div class="row d-flex float-right flex-column" id="total-wrapper"> + <div class="d-flex flex-column w-max-content"> + <span class="fs-3">Totalt inkl. MVA: <span id="total-sum"></span></span> + <span>Av dei MVA: <span id="total-tax"></span></span> + </div> + </div> + </div> + </div> + <div class="col-12 col-lg-4" id="submit-order-wrapper"> + <form id="submit-order-form" onsubmit="return false"> + <div class="loader"> + <div class="spinner-border" role="status"> + <span class="visually-hidden">Lastar...</span> + </div> + </div> + <fieldset class="py-3"> + <div class="mb-3"> + <label for="input-name" class="form-label">Namn <span class="text-danger">*</span></label> + <input type="text" id="input-name" class="form-control" required> + </div> + <div class="row mb-3"> + <div class="col"> + <label for="input-phone" class="form-label">Telefon <span class="text-danger">*</span></label> + <input type="tel" inputmode="tel" id="input-phone" class="form-control" required> + </div> + <div class="col"> + <label for="input-email" class="form-label">E-postadresse <span class="text-danger">*</span></label> + <input type="email" inputmode="email" id="input-email" class="form-control" required> + </div> + </div> + <label for="input-comment" class="form-label">Anna informasjon</label> + <textarea class="form-control" id="input-comment" rows="3"></textarea> + </fieldset> + <ul id="form-errors" class="alert alert-danger py-3 ps-5 d-none"></ul> + <fieldset class="py-3"> + <legend>Betal med</legend> + <div class="nav nav-pills nav-fill" role="tablist"> + <a class="nav-link active" id="vipps-tab-buttom" data-bs-toggle="tab" href="#vipps-tab" role="tab" aria-controls="vipps-tab" aria-selected="true">Vipps</a> + <a class="nav-link ms-sm-0 ms-md-2" id="invoice-tab-buttom" data-bs-toggle="tab" href="#invoice-tab" role="tab" aria-controls="invoice-tab" aria-selected="false">Faktura på mail</a> + </div> + <div class="tab-content"> + <div class="tab-pane py-3 active" id="vipps-tab" role="tabpanel"> + <p>Gå til vipps for å fullføre betalinga</p> + <div class="form-check mb-3"> + <input class="form-check-input" type="checkbox" value="" id="vipps-terms-confirm" required> + <label class="form-check-label" for="vipps-terms-confirm"> + Eg samtykker til <a href="/vilkår">salsvilkårane</a> og <a href="/personvern">personvernerklæringa.</a> + </label> + </div> + <div class="d-flex justify-content-end"> + <button class="btn btn-link shadow-none submit-vipps"> + <img src="/assets/profile/vipps_button.png" alt="Fortsett med vipps"> + </button> + </div> + </div> + <div class="tab-pane py-3" id="invoice-tab" role="tabpanel"> + <p>Du får tilsendt faktura på mail til <span id="invoice-mail">e-postadressa di</span></p> + <div class="form-check mb-3"> + <input class="form-check-input" type="checkbox" id="invoice-terms-confirm" required> + <label class="form-check-label" for="invoice-terms-confirm"> + Eg samtykker til <a href="/vilkår">salsvilkårane</a> og <a href="/personvern">personvernerklæringa.</a> + </label> + </div> + <div class="d-flex justify-content-end"> + <button class="btn btn-primary btn-lg shadow-none submit-invoice">Send bestilling</button> + </div> + </div> + </div> + </fieldset> + </form> + </div> + </div> +</div>
\ No newline at end of file diff --git a/src/Pages/Handlekorg.cshtml.cs b/src/Pages/Handlekorg.cshtml.cs new file mode 100644 index 0000000..02f72a7 --- /dev/null +++ b/src/Pages/Handlekorg.cshtml.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace VSH.Pages; + +public class Handlekorg : PageModel +{ + public void OnGet() { } +}
\ No newline at end of file diff --git a/src/Pages/Index.cshtml b/src/Pages/Index.cshtml new file mode 100644 index 0000000..aa23602 --- /dev/null +++ b/src/Pages/Index.cshtml @@ -0,0 +1,41 @@ +@page +@using Microsoft.Extensions.Localization +@inject IStringLocalizer<SharedPageResources> Localizer; +@model IndexModel +@{ + ViewData["Title"] = Localizer["Forsida"]; +} + +@section Head { + <style> + #body-wrapper { + overflow-x: hidden; + } + </style> +} + +<div class="my-2" id="frontpage-image"> + <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1283 471.46"> + <defs> + <style>.cls-12,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-8,.cls-9{fill:none;stroke:#ee741e;stroke-miterlimit:10}.cls-2{stroke-width:.93px}.cls-8,.cls-9{stroke-width:.94px}.cls-12,.cls-14,.cls-15{stroke-width:.95px}.cls-16{stroke-width:.98px}.cls-17{stroke-width:1px}.cls-18{fill:#ee741e}</style> + </defs><path fill="#fff" d="M0 0h1283v471.46H0z"/><path class="cls-2" d="M561.56 286.96l394.6-2.79M561.56 295.34l395.53-.93M235.82 418.65v6.52l155.42 4.65v-6.58l-155.42-4.59zM325.16 396.32l-89.34 22.33M391.24 422.96l89.81-34.55M391.71 429.36l72.59-28.85M464.72 396.32v7.83h63.77v-7l-63.77-.83zM482.91 383.75v8.71M392.17 387.48l88.49.63"/><path class="cls-2" d="M351.91 375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12 0 010 .23L378 382.82l-33.5-4.65c-.16 0-.16-.9 0-.93l31.64-5.94" transform="translate(1.64)"/><path class="cls-2" d="M326.56 350.25v46.07h5.06v-2.31l9.83 1.84v3.72l3.72.93 8.38-2.79V379.31"/><path stroke-width=".89" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M340.99 369.79l-9.31-1.86v19.28l9.31 2.54v-19.96z"/><path class="cls-2" d="M347.86 367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07 3.47-22.67 12 0 9.4 0 9.4z" transform="translate(1.64)"/><path class="cls-2" d="M352.45 365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63 2.62-17.08 9 0 7.14 0 7.14zM358.43 322.33V340s-25.13-3.72-37.23 7.45l20.47 3.79s17.49-17.82 44.11-4.76" transform="translate(1.64)"/><path class="cls-2" d="M368.82 322.33v19.38"/><path class="cls-2" d="M355.63 314.88h13.54a.41.41 0 00.21-.76c-2.2-1.3-7.52-3.45-14.2.76" transform="translate(1.64)"/><path class="cls-2" d="M360.06 315.81l-1.91 6.52h12.06l-1.77-7.45"/><path class="cls-2" d="M383.55 380s.53 2.27 4 7.18.67 23.53.67 23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28 1.89 1.57 7.46a108.72 108.72 0 01-.64 13.94l-4.65.78v-20.29c0-5.59-1.86-1.86-8.38 1.86-7.44 7.44-.93 21.4-.93 21.4s-5.58.93-6.51.93c-3.72-17.68 0-25.12 4.65-27s4.66-3.72 4.66-3.72" transform="translate(1.64)"/><path class="cls-2" d="M339.59 306.51l217.78-.93v1.86l-217.78.98v-1.91zM339.59 306.51l92.14-35.37 129.36-.93"/><path class="cls-2" d="M562.95 217.16l-1.86 85.62h8.38l-4.16 3.73v5.89h-218.1v-3.98M407.53 370.72v-55.04h38.27l-1.06 55.04h-37.21z"/><path class="cls-2" d="M402.41 373.05v-57.37h48.05l-1.34 57.37h-46.71zM547.13 378.17l-151.7-2.79M553.36 312.4v70.5l138.03 3.65M536.22 389.34l151.44 4.65-1.56 2.33 49.96.46-2.16-7.03 18.91.69M535.97 396.32l149.83 4.18.3-4.18"/><path class="cls-2" d="M736.06 396.78l10-.46 2.78 9.36-218.46-7.97"/><path class="cls-2" d="M748.84 405.68v6.88l-218.46-8.33v-6.52l5.59-1.39.25-6.98 10.91-5.23v-5.94l-18.64 6.42v9.66l-49.3-1.93M617.86 264.63h-19.54v-35.37h19.54v35.37zM639.27 264.63H619.72v-35.37h19.55v35.37zM629.7 229.73v34.43M619.72 240.87h19.08M619.87 252.44l18.93.01M608.3 229.73v34.43M598.32 240.87h19.08M598.32 252.44l19.08.01M591.8 224.61l.93 2.79h51.97l1.08-2.79H591.8zM594.33 227.4v39.52h2.88V227.4M640.87 227.4v39.52h2.88V227.4M591.8 266.92h53.98v2.24l-53.98.53v-2.77zM730.77 261.78h-20.32v-35.36h20.32v35.36zM753.02 261.78H732.7v-35.36h20.32v35.36zM743.07 226.88v34.44M732.7 238.03h19.83M732.85 249.59l19.68.02M720.82 226.88v34.44M710.45 238.03h19.83M710.45 249.59l19.83.02M703.68 221.76l.96 2.8h54.02l1.13-2.8h-56.11zM706.31 224.56v39.51h2.99v-39.51M754.68 224.56v39.51h2.99v-39.51M703.68 264.07h56.11v2.24l-56.11.54v-2.78zM858.65 260.7h-22v-36.42h22v36.42zM882.75 260.7h-22v-36.42h22v36.42zM871.98 224.76v35.46M860.75 236.24h21.48M860.92 248.15l21.31.01M847.88 224.76v35.46M836.65 236.24h21.48M836.65 248.15l21.48.01M829.32 219.49l1.05 2.87h58.49l1.23-2.87h-60.77zM832.16 222.36v40.7h3.25v-40.7M884.55 222.36v40.7h3.24v-40.7M829.32 263.06h60.77v2.31l-60.77.55v-2.86zM735.13 314.88h18.61v41.88h-18.61zM744.43 314.88l.35 41.88M735.13 325.28h18.61M735.13 335.31h18.61M735.13 345.13h18.61M755.6 314.88h18.61v41.88H755.6zM764.91 314.88l.35 41.88M755.6 325.28h18.62M755.6 335.31h18.62M755.6 345.13h18.62"/><path class="cls-2" d="M732.34 313.02h44.67v45.6h-44.67zM596.23 314.75h16.39v38.89h-16.39zM604.43 314.75l.3 38.89M596.23 324.41h16.39M596.23 333.72h16.39M596.23 342.84h16.39M614.26 314.75h16.39v38.89h-16.39zM622.46 314.75l.3 38.89M614.26 324.41h16.39M614.26 333.72h16.39M614.26 342.84h16.39"/><path class="cls-2" d="M594.6 313.02h37.69v42.35H594.6zM855.29 317.67h19.63v41.88h-19.63zM865.1 317.67l.36 41.89M855.29 328.08h19.62M855.29 338.11h19.62M855.29 347.92h19.62M876.87 317.67h19.63v41.88h-19.63zM886.69 317.67l.36 41.89M876.87 328.08h19.63M876.87 338.11h19.63M876.87 347.92h19.63"/><path class="cls-2" d="M853.32 315.81h45.14v45.6h-45.14zM696.97 313.95h22.34v49.33h-22.34z"/><path class="cls-2" d="M692.32 310.23h31.64v67.94h-31.64zM692.32 378.17h31.64v8.38h-31.64zM695.06 386.55l-3.67 4.78 27.92-.13-1.63-4.65M730.47 306.51h13.03v4.65h-13.03z"/><circle class="cls-2" cx="722.1" cy="340.01" r=".93"/><path class="cls-2" d="M720.46 342.8v1.87a.93.93 0 01-.93.93h-4.65v-.94h5.58" transform="translate(1.64)"/><path class="cls-2" d="M688.65 386.47v-79.96h39.27v82.43"/><path class="cls-2" d="M751.3 373.52h14.34a.09.09 0 01.08.14c-.9 1.08-6.79 7.51-14.46-.05a.05.05 0 01.04-.09z" transform="translate(1.64)"/><path class="cls-2" d="M765.83 373.52s.23 1.86-.7 18.61c-8.37 4.65-14-1.69-14-1.69v-16.92" transform="translate(1.64)"/><path class="cls-2" d="M385.26 346.49v24.91M345.17 351.18v48.86"/><path class="cls-2" d="M749.31 185.52L904.73 179l79.11 14.89L816 199.48l-294.52 8.37 52-16.7 157.81-4.6" transform="translate(1.64)"/><path stroke-width="1.03" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M732.8 156.42l17.02.25 1.13 32.57H732.8v-32.82z"/><path class="cls-2" d="M526.66 210.65v4.73l458.82-14.08v-4.27l-458.82 13.62z"/><path class="cls-2" d="M961.16 202.04l24.32 5.81 6.52-13.02-9.64-1.52M522.93 207.85v8.95l3.73 1.57v4.55l18.94-7.53M569.47 302.78l387.16-.93-1.86-99.58"/><path class="cls-2" d="M947.54 301.85c.39.93-.38 94.93-.38 94.93l-182-4.65" transform="translate(1.64)"/><path class="cls-2" d="M939.88 396.78l.93 13.03-165.11-3.43M956.69 288.36l103.93 27.45-2.99 8.6-101.13-28.37M1028.18 316.74l6.63 89.35-49.33 1.78M1031.15 405.84v10.14M562.84 222.36l391.86-9.53M561.56 275.79l394.07-2.47M562.68 229.73l31.45-.47M643.75 229.26l62.99-.93M757.67 226.88l73.91-2.12M887.79 224.28l66.91-1.92M562.68 239.03l31.45-.46M643.75 238.57l62.99-.93M757.67 236.19l73.91-2.12M887.79 233.59l66.91-1.92M562.68 250.2l31.45-.46M643.75 249.74l62.99-.94M757.67 247.36l73.91-2.13M887.79 244.76l66.91-1.92M562.68 260.44l31.45-.47M643.75 259.97l62.99-.93M757.67 257.6l73.91-2.13M887.79 254.99l66.91-1.91"/><path stroke-width=".92" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M561.75 268.81l30.52-.46M645.32 268.35l184.27-2.79"/><path stroke-width=".91" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M890.09 263.37l64.61-1.92"/><path class="cls-2" d="M574.06 302.78v80.62M580.32 302.78v80.47M587.43 302.74v80.66M559.84 312.56v70.69M566.96 305.11v78.29M634.55 302.78l.06 82.37M640.81 302.78v82.37M647.93 302.74v82.41M655.03 302.78v83.3M661.29 302.78v83.3M668.4 302.74v83.34M674.57 302.78v83.3M680.83 302.78v83.3M594.53 355.38v28.84M600.79 355.38v28.78M607.91 355.37v28.85M615.01 355.38v28.84M621.27 355.38v28.78M628.1 355.37v29.78M594.53 302.75v9.81M600.79 302.75v9.79M607.91 302.74v9.82M615.01 302.75v9.81M621.27 302.75v9.79M628.38 302.74v9.82M802.07 301.86v90.73"/><path class="cls-8" d="M808.33 301.86v91.49M815.45 301.81v91.72M822.55 301.86v91.67"/><path class="cls-9" d="M828.81 301.86v91.67"/><path class="cls-8" d="M835.92 301.81v91.72"/><path stroke-width=".94" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M842.09 301.86v91.67"/><path class="cls-9" d="M848.35 301.86v91.67"/><path class="cls-2" d="M855.47 301.81v13.54M780.67 302.32v90.27M787.86 302.32v90.11M794.97 302.32v90.27M755.54 358.16v14.89M762.73 358.18v14.87M769.84 359.09v32.57M775.08 359.11v33.48M734.14 359.09v30.71M741.33 359.09v30.66M748.44 358.16v31.64M757.4 302.32v10.24M764.59 302.32v10.24M771.71 302.62v10.57M736 302.62v3.42M743.19 302.62v4.35M750.3 302.32v10.26M882.11 301.82v13.53M888.37 301.82v13.5M895.49 301.81v13.54M902.59 301.86v93.53M908.85 301.86v93.35M915.96 301.81v93.58M922.13 301.86v94.46M928.39 301.86v94.28M935.51 301.81v94.51M943.88 301.81v94.51M861.64 301.96v13.39M867.9 301.96v13.36M875.01 301.95v13.4"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M855.47 360.95v33.51"/><path class="cls-12" d="M882.11 361.9v33.49"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M888.37 361.88v33.45"/><path class="cls-12" d="M895.49 361.88v33.51"/><path class="cls-14" d="M861.64 360.97v33.49M867.9 360.97v33.42M875.01 360.95v33.51"/><path class="cls-2" d="M516.82 364.18v-7.39s3.72-4.71 7.45-4.71 6.51 2.79 5.58 4.66-.93 7.44-.93 7.44a15.35 15.35 0 01-12.1 0z" transform="translate(1.64)"/><path class="cls-2" d="M516.82 365.42V377s6.52 2.09 12.1.23v-13M523.43 363s2.7.3 2.7-.63-1.68-2.49-2.7-1.71 0 2.34 0 2.34z" transform="translate(1.64)"/><path class="cls-15" d="M407.53 358.53h37.44M374.65 313.02v29.24M382.56 312.4v32.03M390.91 312.56v58.9M399.29 312.56v58.9"/><path class="cls-2" d="M454.99 312.09l-1.72 63.75M463.37 313.02l-1.73 63.75"/><path class="cls-16" d="M480.12 313.02l-1.72 63.75M471.75 313.02l-1.73 63.75M489.43 313.02l-1.73 63.75"/><path class="cls-17" d="M497.81 312.56l-1.73 65.14M514.56 312.56l-1.73 65.14M506.18 312.56l-1.73 65.14"/><path class="cls-2" d="M521.7 312.4v41.24M530.38 312.4l-.5 40.88M537.35 312.4l-1.13 65.3M545.89 312.09l-1.71 66.02M552.01 312.4v70.85l1.99-.33M960.96 297.29l1.25 87.86M975.68 301.42l-.44 93.04M990.45 305.56v102.31M1004.09 309.3l1.87 98.19M1016.51 313.01l3.41 94.01"/><path class="cls-2" d="M946 414.88q-3.35-10.53-6.36-21.17c4.91 5.55 5.88 13.66 10.36 19.56l-3.44-19.6a3.29 3.29 0 01.27-2.59c1.35 1.32 1.7 3.33 2.06 5.18a82.64 82.64 0 004.21 14.63 3 3 0 001.51 1.94c1.26-7.83-.92-15.83-.32-23.74.55 7.4 1.13 14.89 3.38 22a6.86 6.86 0 00.91-2.43l3-12.65a142 142 0 01-1.91 16.43l5.72-13c.82 4.36-1.47 8.78-1.09 13.21 1.13-1 1.53-2.57 2-4a25.27 25.27 0 014.37-8L967.14 415q4.1-5.27 8.52-10.26c.77 3.36-2 6.57-2 10l6.72-7.18c.75 1.66-.51 3.5-.8 5.3a1.58 1.58 0 000 .78c.35.94 1.73.7 2.68.35a13 13 0 016.58-.85c1.41.23 2.76.77 4.16 1.05a5.59 5.59 0 004.16-.49M944.75 412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73 1.14-.71 1.85l.08 2.86c0 .54 0 1.17-.48 1.45a1.19 1.19 0 01-.79.1 6.29 6.29 0 01-1.59-.66 2.57 2.57 0 00-1.66-.32 1.12 1.12 0 00-.9 1.26 1.54 1.54 0 001.14.86 14.76 14.76 0 005.18.22c-1.48.42-3.07.25-4.56.61a30.28 30.28 0 00-2.93 1.09c-2.94 1-6.17.74-9.27.44" transform="translate(1.64)"/><path class="cls-2" d="M947.83 414.31a33.48 33.48 0 01-1.49-6.59l-1.42-9.13c.32 0 .56.29.73.58a25.08 25.08 0 012.5 5.16c.41 1.35.59 2.77 1 4.11.54 1.66 1.48 3.2 1.73 4.93.29-5.67.6-11.35 1.38-17q1.37 5.67 2.47 11.4c.35 1.82.73 3.74 2 5.1 2-4.4 2.17-9.35 2.35-14.17.29 2.29.2 4.62.33 6.92a14.84 14.84 0 001.68 6.66 27.13 27.13 0 003.15-9.25l-.47 7.9a9.64 9.64 0 00.09 2.63 3.53 3.53 0 001.77-1.76c1.25-2.22 2-4.8 3.77-6.6a59.09 59.09 0 00-1.52 9.25 6.7 6.7 0 002-2.44q1.43-2.43 2.82-4.87a55.44 55.44 0 01-1 7.48M977.47 408.1a30.9 30.9 0 004.12-7.81c.46.54.94 1.06 1.45 1.55a2.82 2.82 0 001.11.74 1.67 1.67 0 001.89-1.21 2.37 2.37 0 00-.73-2.25 4.14 4.14 0 00-2.23-1 5.93 5.93 0 002.69-1.92 2 2 0 00-.55-2.91 2.22 2.22 0 00-2.24.53 4.05 4.05 0 00-1.4 2.76 3.16 3.16 0 00-1.69-1.44 2.62 2.62 0 00-2.58 1.51 2.39 2.39 0 00-.41 1.36 2 2 0 001.59 1.59 5.74 5.74 0 002.4-.14" transform="translate(1.64)"/><path class="cls-2" d="M971.64 406.82a43.28 43.28 0 003.46-8.65 4.59 4.59 0 01.75-1.93c.22-.26.49-.46.72-.7a2.81 2.81 0 00.78-2 1.32 1.32 0 00-.14-.65c-.4-.65-1.4-.42-2 0a5.88 5.88 0 00-2 2.5 3.57 3.57 0 00-2.72-1.69 1.63 1.63 0 00-1.62.65c-.39.71.16 1.59.81 2.07a4.73 4.73 0 003.82.81" transform="translate(1.64)"/><path class="cls-2" d="M963.59 401.9c.53-2.47 2.15-4.58 2.73-7a22.71 22.71 0 01.71-3.17c.31-.76.83-1.57.56-2.35a1.6 1.6 0 00-2.39-.56 2.69 2.69 0 00-.88 2.57 2.07 2.07 0 00-2.62-.2 1.6 1.6 0 000 2.46c.83.56 1.94.07 2.82-.42l3.11-1.75a4.1 4.1 0 011.33-.56 1.39 1.39 0 011.31.43c.54.7 0 1.71-.7 2.25a3 3 0 01-2 .72A1.76 1.76 0 01966 393M959 400.58l.28-10a2.13 2.13 0 002.34-1.35 6.17 6.17 0 00.29-2.9 2.41 2.41 0 00-.22-1 .83.83 0 00-.86-.46 1.07 1.07 0 00-.53.41 5.66 5.66 0 00-.66 3.71 6.35 6.35 0 00-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81 0 00-.13.63 6 6 0 001.75 3.57 1.37 1.37 0 00-1.49-1.16 2.6 2.6 0 00-1.75 1.07 1 1 0 00-.27.94 1 1 0 00.73.48 6.5 6.5 0 003.19 0M749.35 407.26q-1.61-3.75-2.83-7.64a17.35 17.35 0 012.34 6.77c.72-2.11.18-4.69 1.58-6.43l.29 7.35a19.69 19.69 0 013-5.28 6.47 6.47 0 01-1.31 2.32 3.32 3.32 0 00-.77 2.49 27.28 27.28 0 015.82-2.08l-1.28 2.39a4.22 4.22 0 011.4-1.64 1.47 1.47 0 012 .31c.11.18.16.38.28.55.4.59 1.31.48 1.93.13a6.34 6.34 0 011.85-1c.89-.18 1.75.37 2.66.49 1.25.18 2.51-.47 3.77-.31.76.1 1.46.49 2.22.65 1.93.39 3.9-.78 5.86-.55a19.88 19.88 0 012.71.77 14.72 14.72 0 003 .38l5.11.29" transform="translate(1.64)"/><path class="cls-2" d="M780.12 407.83c-1.9-.75-4-.4-6.06-.51a29.3 29.3 0 00-3.37-.2 18.26 18.26 0 00-4.33 1.11 26.24 26.24 0 01-4.87 1M749.51 404.89a26.24 26.24 0 01-.52-7.29 2.83 2.83 0 01.9-2.22c1.15-.78 3 .28 4-.65a1.56 1.56 0 000-2.2 2.12 2.12 0 00-2.3-.33 3.49 3.49 0 00-1.68 1.75 7.58 7.58 0 00-.31-2.68 3.26 3.26 0 00-.81-1.48 1.58 1.58 0 00-1.56-.44 2 2 0 00-1 2.27 4.37 4.37 0 002.12 3.1 5.29 5.29 0 00-3.34-1.07 2.68 2.68 0 00-1.92.73 1.39 1.39 0 00-.07 1.89 2 2 0 001.35.42 11.89 11.89 0 003.36-.39M458.36 408.52a15.77 15.77 0 003.21-8.77 37.41 37.41 0 01-3.36 6.19l-.72-2.9c-.89 1-.64 3-1.88 3.52-1 .48-2.58-.37-3.27.54-.5.65-.12 1.09-.92 1.25-.41.08-1.62-.74-2-.92l-4-1.85c-.48-.22-1.05-.64-.88-1.14a.84.84 0 01.4-.43c1.17-.67 2.62.11 3.69.93s2.33 1.76 3.63 1.4a.75.75 0 00.35-.19.92.92 0 00.13-.7 12.83 12.83 0 01.54-4.69c.78 2.07.48 6.29-1.26 7.9s-5.39 2-7.44 2.76l-6.69 2.37a31.42 31.42 0 01-4.74 1.4M280 432.39c-2.64-1.48-5.84-1.64-8.86-1.36s-6 1-9 1.09c-5.8.2-11.55-1.81-17.34-1.36a38.31 38.31 0 005.2-5.86l-5.31 5.16a17 17 0 01-.64-4.85q-.19 2.55-.6 5.07l-2.78-3.41.82 4.41c-2.08-.84-2.37-4.53-4.62-4.53l1.58 4.85a10.65 10.65 0 01-2.43-3.26c-.48.45-.45 1.21-.69 1.81s-1.23 1-1.49.41a1.37 1.37 0 010-.67c.09-1.3-1-2.33-1.6-3.48a10.37 10.37 0 01-.91-3.94l-.84-8.84c-1.54 5.31 1.21 11 .6 16.46a57.61 57.61 0 00-7.24-11.28c-.44-.54-1.15-1.11-1.74-.75.07 1.62 1.23 2.95 2.33 4.13q4.26 4.53 8.74 8.84a42.88 42.88 0 00-13.46-7.47 67.92 67.92 0 0010.92 9 37 37 0 00-7.24-3.05 12.59 12.59 0 00-7.73.19 92.59 92.59 0 0017.24 2.07c0 .73-.77 1.19-1.45 1.45-5.14 1.94-10.88 1.41-16.23 2.67a48.81 48.81 0 00-8.16 2.95M286 310.43h16.58a6.28 6.28 0 001.63-.21c2.61-.68 9.65-3.19 2-9a19.15 19.15 0 00-17.4-3.23c-3.95 1.18-7 3.41-8.27 5.38-1.47 2.3-1 3.06-.63 4.13s2.55 2.6 6.31 2.92M288.64 286.67s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M293.54 286.26s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M298 285.89s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M289.33 298.21a3.74 3.74 0 00-1.41 4.21M295.48 297.17s-3.65 1.81-2.71 5.25M300.67 298s-3.13 1.35-2.58 4.4M352.84 77.37V85l20.25-8.78v-8c-4.46-4.15-13.71-3.19-13.71-3.19l-6.54 12.28 20.09-8.93" transform="translate(1.64)"/><ellipse class="cls-2" cx="367.39" cy="67.8" rx="1.43" ry=".64"/><ellipse class="cls-2" cx="366.09" cy="75.88" rx="1.59" ry="1.43"/><ellipse class="cls-2" cx="359.58" cy="72.74" rx="1.28" ry=".48"/><path class="cls-2" d="M435.69 33.88s0 1.31-1.31 0 1.31-3.88 2.62-2.61l1.31 1.3M463.78 33.23l-6.62-2.32s-7.76-1.6-14.54 0-6.28 7.54-5 8.85l2.22 2.24c-1.73 3.5.42 7 .42 7h3.92a5.73 5.73 0 01-1.31-4 2.56 2.56 0 012.61-2.62l1.31 1.31c1.31 1.31 7.84 0 7.84 0-1.31 2.61 2.61 5.23 2.61 5.23h2.62c-1.31-1.31-1.31-9.15.74-6.54s6.87 0 6.87 0l1.53-2.62c-2.61 0-3.92-3.92-3.92-3.92" transform="translate(1.64)"/><path class="cls-2" d="M463.36 37.53s-2.44-3.51 2.71-5.45l1.52.32s-.59 2.88-2.11 2.6M564.42 35a2.56 2.56 0 01-2.62-2.61c0-1.31 1.31-2.61 3.27.65h1.31c1.3 0 1.3 0 3.91 1.84s0 3.39 0 3.39a11.48 11.48 0 00-3.91.65c-1.31.65.17 4.06-.66 6.53-.65 2-3.26 3.27-3.26 3.27s-1 5.88-.31 7.19c1 .65 1.31 3.26 1.31 3.26h-3.62v-2.64a1.28 1.28 0 01-1.3-1.31c0-1.3-1.15-5.88-1.47-5.88-4.09 2-10.29-.65-10.29-.65" transform="translate(1.64)"/><path class="cls-2" d="M546.78 49l-2 3v2.61a4.58 4.58 0 011.3 2.61 5.24 5.24 0 00.29 2l-2.9-.65s0-2.61-1.31-2.61v-2.7L540.9 52l1.3-2.62s.71-3.35-.3-4.94a4.75 4.75 0 012.92-6.81c2.48-.83 11.76 1.3 14.37 0S561.8 35 561.8 35" transform="translate(1.64)"/><rect class="cls-2" x="625.42" y="67.29" width="5.69" height="1.81" rx=".62"/><path class="cls-2" d="M623.31 76.87a2.19 2.19 0 00-2 2.17v14a2.19 2.19 0 002.18 2.18h6.26a2.19 2.19 0 002.18-2.18V79a2.19 2.19 0 00-1.57-2" transform="translate(1.64)"/><path class="cls-2" d="M633.58 93.17v-.11M626.23 69.1l-1.52 7.76M630.41 69.1l1.51 7.74.01.02M631.92 76.84l.12.12M625.47 72.98l5.31-1.98M622.96 81.68h10.63M622.96 91.93h10.62M630.48 65.22v-2.85M632.55 65.82l2.21-2M633.33 67.61l3.1.15"/><path class="cls-2" d="M654.59 155.68s3.63 5.23 8.59 2.35a3.63 3.63 0 01-2.67 4.69s-5.73-1.81-6.49-6.49-.38-12.27 9.92-14.07a17.64 17.64 0 018.33.25h.14a10.27 10.27 0 015.66 4.4c.76 1.08 1.91 5.77 1.91 5.77s-6.49 3.61-13.36.36c-7.26-2.49-8.78-3.21-12.03 2.74zM672.27 142.41s-6.37 2.91-2.58 11.61" transform="translate(1.64)"/><path class="cls-2" d="M664.15 142.12a19 19 0 00-2.09-2l-1.44-1.12s6.62-1.32 8.2 2.77" transform="translate(1.64)"/><ellipse class="cls-2" cx="676.08" cy="147.75" rx=".76" ry=".72"/><path class="cls-2" d="M275.58 202.46l.16 2.55 14.45-.72-.18-2.75-14.16.9-.27.02zM274.09 227.75l6.32 1.66-.94-14.66-3.73-9.74-1.89 8.26.24 14.48z"/><path class="cls-2" d="M274.09 227.75l3.3-2.28 2.77 3.88M276.65 213.78l.74 11.69M279.45 214.52l13.86-.89-2.92-9.36"/><path class="cls-2" d="M280.41 229.41l14.39-1.6-1.49-14.18M280.93 202.12l.17 2.55 2.84 4.5 3.44-.22-2.37-4.68.08-2.42M280.25 226.99l14.26-1.89"/><path class="cls-2" d="M284.91 218.44a2.89 2.89 0 00-3.18-.13 2.45 2.45 0 102.33 4.22 3.11 3.11 0 001.49-1.75" transform="translate(1.64)"/><ellipse class="cls-2" cx="287.66" cy="219.43" rx="2.41" ry="2.86" transform="rotate(-48.66 288.45921753 217.6128333)"/><path class="cls-2" d="M287.32 217.37l4.13 3.95M282.03 221.8l4.64-3.24"/><path class="cls-2" d="M304.82 114.56s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15M309.27 114.19s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15" transform="translate(1.64)"/><path class="cls-2" d="M302.55 124.63h12.66a.65.65 0 01.65.65v2.45h-14v-2.45a.65.65 0 01.69-.65zM303.59 123.08h10.28a.53.53 0 01.53.53v1h-11.34v-1a.53.53 0 01.53-.53z"/><path class="cls-2" d="M300.75 127.73l.28 2.52 1.36 12a.5.5 0 00.49.44h8.61a.5.5 0 00.49-.44l1.7-14.54" transform="translate(1.64)"/><path class="cls-2" d="M315.03 130.26h-12.36M303.42 136.91h10.83"/><path class="cls-18" d="M394.18 150.93h1.24l3.43 10.23 3.43-10.23h1.24l-4.12 11.9h-1.1zM405.32 150.93h1.18v11.9h-1.18zm.81 0H413V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36H413v1.1h-6.83zM415.33 150.93h1.18v11.9h-1.18zm.84 10.8H423v1.1h-6.8zM424.94 150.93h1.17v11.9h-1.17zm.57 8.27l6.52-8.27h1.52l-7.55 9.18zm3.35-2.72l.68-1.22 4.51 7.57h-1.41zM436.86 162.44a3.43 3.43 0 01-1.42-1.5 5.25 5.25 0 01-.49-2.37v-3.37a5.26 5.26 0 01.49-2.38 3.36 3.36 0 011.42-1.49 5.19 5.19 0 014.53 0 3.43 3.43 0 011.43 1.49 5.4 5.4 0 01.49 2.38v3.37a5.38 5.38 0 01-.49 2.37 3.51 3.51 0 01-1.43 1.5 5.28 5.28 0 01-4.53 0zm3.89-1a2.5 2.5 0 001-1.1 4 4 0 00.35-1.75v-3.48a4 4 0 00-.35-1.75 2.5 2.5 0 00-1-1.1 3.66 3.66 0 00-3.25 0 2.42 2.42 0 00-1 1.1 3.9 3.9 0 00-.36 1.75v3.48a3.87 3.87 0 00.36 1.75 2.42 2.42 0 001 1.1 3.66 3.66 0 003.25 0zM454.72 150.93H456v11.9h-1.18v-10.22l.13.52-3.59 8.05h-.83l-3.58-7.88.12-.69v10.22h-1.18v-11.9h1.24l3.82 8.59zM467.77 150.93H469v11.9h-1.18v-10.22l.12.52-3.58 8.05h-.84L460 153.3l.12-.69v10.22h-1.22v-11.9h1.23l3.82 8.59zM472 150.93h1.18v11.9H472zm.81 0h6.83V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36h6.83v1.1h-6.83zM482 150.93h1.19l6.9 10.72-.48-.33v-10.39h1.18v11.89h-1.2L482.5 152l.64.47v10.33H482zM493.82 161.49h1.34v1.34h-1.34zm.08-10.56h1.17v9.17h-1.17zM394.91 180.47h.79v7.92h-.79zm.55 0h4.44v.73h-4.44zm0 3.69h3.84v.73h-3.84zM401.27 180.46h.78v7.93h-.78zm.48 3.85h2.71a1.67 1.67 0 00.78-.19 1.35 1.35 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.38 1.38 0 00-.52-.55 1.61 1.61 0 00-.78-.19h-2.71v-.73h2.66a2.46 2.46 0 011.21.28 2 2 0 01.81.81 2.48 2.48 0 01.29 1.2 2.45 2.45 0 01-.29 1.2 2 2 0 01-.81.81 2.49 2.49 0 01-1.21.28h-2.66zm2.54.49l.73-.26 2 3.85h-.94zM408.55 180.47h.78v7.92h-.78zm.54 0h4.55v.73h-4.55zm0 3.62h4v.73h-4zm0 3.57h4.55v.73h-4.55zM415.22 180.47h.78v7.92h-.79zm.76 7.19h1.79a2.36 2.36 0 001.65-.51 2.06 2.06 0 00.55-1.55v-2.34a2.06 2.06 0 00-.55-1.55 2.36 2.36 0 00-1.65-.51H416v-.73h1.76a4 4 0 011.68.31 2.1 2.1 0 011 .95 3.36 3.36 0 01.33 1.58v2.24a3.36 3.36 0 01-.33 1.58 2.17 2.17 0 01-1 1 4 4 0 01-1.68.31H416zM424.38 180.47h.95l2.93 7.92h-.88l-2.52-7.1-2.53 7.1h-.87zm-1.57 5.27H427v.73h-4.17zM434.44 184.34v1.17a3.83 3.83 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.32 2 2 0 01-.93-.92 3.44 3.44 0 01-.31-1.56v-2.34a3.91 3.91 0 01.3-1.64 2.13 2.13 0 01.93-1 3.22 3.22 0 011.54-.33 3 3 0 011.33.27 2.21 2.21 0 01.91.78 3.55 3.55 0 01.5 1.31h-.85a2.72 2.72 0 00-.39-.91 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.33 2.33 0 00-1.11.25 1.64 1.64 0 00-.66.74 3 3 0 00-.22 1.24v2.34a2.71 2.71 0 00.22 1.15 1.51 1.51 0 00.68.69 2.48 2.48 0 001.12.22 2.2 2.2 0 001.09-.23 1.52 1.52 0 00.65-.72 3.25 3.25 0 00.21-1.26v-.46h-1.92v-.73zM441 188.39h-.79v-7.26l-1.45.91v-.82l1.13-.75H441zM442.67 187.76l3-3.91a3.37 3.37 0 00.46-.75 1.76 1.76 0 00.16-.65 1.27 1.27 0 00-.37-1 1.43 1.43 0 00-1-.35 1.41 1.41 0 00-1 .38 1.71 1.71 0 00-.47 1h-.82a3.11 3.11 0 01.4-1.17 2 2 0 01.78-.73 2.33 2.33 0 011.11-.26 2.64 2.64 0 011.21.25 1.62 1.62 0 01.76.7 2.19 2.19 0 01.27 1.12 2.23 2.23 0 01-.22.85 4.79 4.79 0 01-.6 1l-2.63 3.37h3.49v.73h-4.47zM452.28 185.19v.73h-3.67v-.73zM455.66 188.39h-.78v-7.26l-1.46.91v-.82l1.13-.75h1.11zM460.6 184.46v.19a.74.74 0 01-.45.37 2.26 2.26 0 01-.77.12 2.06 2.06 0 01-1.09-.29 1.89 1.89 0 01-.72-.81 2.8 2.8 0 01-.26-1.22 3.06 3.06 0 01.26-1.31 1.76 1.76 0 01.76-.83 2.61 2.61 0 012.39 0 1.91 1.91 0 01.75.84 3 3 0 01.26 1.33 3.7 3.7 0 01-.11.91 5.1 5.1 0 01-.31 1l-.06.14a1 1 0 00-.07.15l-1.69 3.39h-.88zm0-.49a1.79 1.79 0 00.37-1.2 1.77 1.77 0 00-.38-1.21 1.47 1.47 0 00-2.1 0 1.77 1.77 0 00-.38 1.21 1.73 1.73 0 00.38 1.19 1.51 1.51 0 002.11 0zM394.91 193.87h.79v7.93h-.79zm.56 7.2H400v.73h-4.54zM403.59 193.87h.94l2.93 7.93h-.87l-2.53-7.11-2.52 7.11h-.88zm-1.59 5.27h4.17v.73H402zM409.34 201.56a2.06 2.06 0 01-.92-1 3.61 3.61 0 01-.31-1.61v-5.11h.79V199a2.18 2.18 0 00.49 1.56 2 2 0 001.5.52 2 2 0 001.51-.52 2.18 2.18 0 00.5-1.56v-5.15h.78V199a3.76 3.76 0 01-.3 1.61 2.13 2.13 0 01-.93 1 3.47 3.47 0 01-1.56.32 3.39 3.39 0 01-1.55-.37zM415.43 193.86h.78v7.94h-.78zm.48 3.85h2.71a1.55 1.55 0 00.78-.19 1.29 1.29 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.23 1.23 0 00-.52-.54 1.51 1.51 0 00-.78-.2h-2.71v-.73h2.67a2.45 2.45 0 011.2.29 1.89 1.89 0 01.81.8 2.48 2.48 0 01.29 1.2 2.42 2.42 0 01-.29 1.2 2 2 0 01-.81.81 2.47 2.47 0 01-1.2.28h-2.67zm2.55.49l.72-.25 2 3.85h-.94zM422.71 193.87h.78v7.93h-.78zm.75 7.2h1.8a2.36 2.36 0 001.65-.52 2 2 0 00.54-1.55v-2.34a2.06 2.06 0 00-.54-1.55 2.36 2.36 0 00-1.65-.51h-1.8v-.73h1.76a3.91 3.91 0 011.68.31 2.08 2.08 0 011 .95 3.39 3.39 0 01.33 1.58V199a3.24 3.24 0 01-.34 1.58 2.1 2.1 0 01-1 .95 4 4 0 01-1.68.32h-1.76zM431.87 193.87h.95l2.92 7.93h-.87l-2.52-7.11-2.53 7.11H429zm-1.57 5.27h4.17v.73h-4.17zM441.93 197.74v1.17a4 4 0 01-.31 1.65 2.11 2.11 0 01-.92 1 3.29 3.29 0 01-1.55.33 3.61 3.61 0 01-1.56-.31 2.06 2.06 0 01-.94-.93 3.56 3.56 0 01-.31-1.55v-2.34a4 4 0 01.31-1.65 2.08 2.08 0 01.93-1 3.23 3.23 0 011.54-.32 3 3 0 011.32.26 2.09 2.09 0 01.91.78 3.39 3.39 0 01.51 1.31H441a2.87 2.87 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.45 2.45 0 001.12.23 2.23 2.23 0 001.09-.24 1.42 1.42 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.46h-1.92v-.73zM448.48 201.8h-.79v-7.27l-1.45.91v-.82l1.12-.75h1.12zM450.16 201.16l3-3.91a3.31 3.31 0 00.45-.75 1.58 1.58 0 00.16-.65 1.3 1.3 0 00-.36-1 1.44 1.44 0 00-1-.34 1.38 1.38 0 00-1 .37 1.71 1.71 0 00-.47 1.05h-.82a2.85 2.85 0 01.4-1.16 2 2 0 01.78-.74 2.33 2.33 0 011.11-.25 2.81 2.81 0 011.21.24 1.67 1.67 0 01.76.7 2.21 2.21 0 01.26 1.12 2.19 2.19 0 01-.21.85 5.5 5.5 0 01-.6 1l-2.63 3.38h3.49v.73h-4.47zM459.76 198.59v.73h-3.66v-.73zM463.15 201.8h-.78v-7.27l-1.46.91v-.82l1.13-.75h1.11zM469.05 194.53L467 201.8h-.86l2.09-7.2h-2.71v1.46h-.79v-2.19h4.32zM396.21 215.17a3.68 3.68 0 01-.95-.33 3.75 3.75 0 01-.84-.54l.48-.62a3.47 3.47 0 001.09.65 3.71 3.71 0 001.31.22 2.67 2.67 0 001.58-.41 1.3 1.3 0 00.56-1.13 1 1 0 00-.25-.72 1.5 1.5 0 00-.62-.41 7.84 7.84 0 00-1-.25h-.24a8.26 8.26 0 01-1.33-.33 1.94 1.94 0 01-.86-.58 1.75 1.75 0 01-.35-1.15 2.32 2.32 0 01.33-1.26 2.1 2.1 0 011-.79 3.86 3.86 0 011.52-.27 4 4 0 01.84.09 4.28 4.28 0 01.81.27 5 5 0 01.79.47l-.46.61a4.34 4.34 0 00-1-.54 3 3 0 00-1-.17 2.39 2.39 0 00-1.5.41 1.35 1.35 0 00-.54 1.15.93.93 0 00.27.71 1.66 1.66 0 00.66.38 9.36 9.36 0 001.09.26h.18a8.4 8.4 0 011.24.35 2 2 0 01.83.62 1.74 1.74 0 01.33 1.12 2.15 2.15 0 01-.34 1.24 2.1 2.1 0 01-1 .79 4.09 4.09 0 01-1.57.27 5.44 5.44 0 01-1.06-.11zM402.7 215a2.13 2.13 0 01-.93-1 3.75 3.75 0 01-.31-1.61v-5.11h.79v5.15a2.12 2.12 0 00.5 1.56 2 2 0 001.49.52 2 2 0 001.51-.52 2.16 2.16 0 00.5-1.56v-5.15h.75v5.11a3.75 3.75 0 01-.31 1.61 2.13 2.13 0 01-.93 1 3.44 3.44 0 01-1.56.32 3.35 3.35 0 01-1.5-.32zM408.78 207.27h.79l4.61 7.14-.33-.22v-6.92h.79v7.92h-.8l-4.7-7.2.43.31v6.89h-.79zM416.6 207.27h.79v7.93h-.79zm.76 7.2h1.79a2.36 2.36 0 001.65-.52 2 2 0 00.55-1.55v-2.33a2.07 2.07 0 00-.55-1.56 2.36 2.36 0 00-1.65-.51h-1.79v-.73h1.76a4 4 0 011.68.31 2.14 2.14 0 011 .95 3.39 3.39 0 01.33 1.58v2.25a3.35 3.35 0 01-.33 1.57 2.17 2.17 0 01-1 .95 4 4 0 01-1.68.32h-1.75zM425.76 207.27h.95l2.93 7.93h-.88l-2.52-7.11-2.53 7.11h-.87zm-1.57 5.27h4.17v.73h-4.17zM435.82 211.15v1.16a3.8 3.8 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.31 2 2 0 01-.93-.93 3.4 3.4 0 01-.31-1.55v-2.34a4 4 0 01.3-1.65 2.13 2.13 0 01.93-1 3.35 3.35 0 011.54-.32 3.07 3.07 0 011.33.26 2.21 2.21 0 01.91.78 3.62 3.62 0 01.5 1.31h-.85a2.66 2.66 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.48 2.48 0 001.12.23 2.2 2.2 0 001.09-.24 1.38 1.38 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.45h-1.92v-.73zM442.37 215.2h-.79v-7.27l-1.45.91V208l1.12-.75h1.12zM445.05 215a1.94 1.94 0 01-.82-.68 2.33 2.33 0 01-.39-1.08h.79a1.65 1.65 0 00.27.68 1.31 1.31 0 00.55.43 1.86 1.86 0 00.77.15 1.53 1.53 0 001.1-.38 1.42 1.42 0 00.39-1.07v-.24a1.38 1.38 0 00-.38-1 1.43 1.43 0 00-1.06-.37h-.56v-.73h.56a1.38 1.38 0 001-.32 1.23 1.23 0 00.34-.91v-.24a1.28 1.28 0 00-.36-1 1.39 1.39 0 00-1-.34 1.59 1.59 0 00-.66.14 1.39 1.39 0 00-.5.41 1.76 1.76 0 00-.29.65h-.8a2.6 2.6 0 01.41-1 2 2 0 01.77-.66 2.29 2.29 0 011.06-.23 2.2 2.2 0 011.59.54 2 2 0 01.56 1.52v.24a1.83 1.83 0 01-.26 1 1.6 1.6 0 01-.75.6 1.36 1.36 0 01.84.6 2.17 2.17 0 01.3 1.19v.24a2.46 2.46 0 01-.27 1.19 1.72 1.72 0 01-.77.74 2.72 2.72 0 01-1.23.26 2.66 2.66 0 01-1.2-.33zM453.79 212v.73h-3.66V212zM457.18 215.2h-.78v-7.27l-1.46.91V208l1.13-.75h1.11zM463.07 207.93l-2 7.27h-.86l2.09-7.2h-2.71v1.47h-.79v-2.2h4.31z" transform="translate(1.64)"/><path d="M683 282.77h60.29a.18.18 0 01.18.18v10.11a5.4 5.4 0 01-5.4 5.4H677.5a.18.18 0 01-.18-.18v-9.8a5.71 5.71 0 015.68-5.71z" stroke-width="1.4" stroke="#ed7320" stroke-miterlimit="10" fill="#fff"/><path class="cls-18" d="M678.29 288.52h.76l1 3.19 1-3.19h.76l-1.45 4.39h-.61zM682.29 288.52h.71v.72h-.72zm0 1.26h.71v3.13h-.72zM683.87 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM686.91 293.5h.27a.2.2 0 00.15-.06.24.24 0 000-.18v-3.48h.73v3.58a.88.88 0 01-.2.61.74.74 0 01-.57.22h-.43zm.47-5h.73v.72h-.73zM689.55 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.78 1.78 0 01.16-.8 1.17 1.17 0 01.46-.5 1.54 1.54 0 01.73-.17 1.19 1.19 0 01.69.2 1.3 1.3 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.14v-.53h1.47a1 1 0 00-.18-.52.53.53 0 00-.42-.18.61.61 0 00-.5.21.84.84 0 00-.18.58v.4a.75.75 0 00.19.55.78.78 0 00.55.19 1.09 1.09 0 00.35-.07 1.08 1.08 0 00.31-.19l.48.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM692.93 292.91a2.36 2.36 0 01-.47-.16 1.6 1.6 0 01-.4-.25l.43-.54a1.89 1.89 0 00.49.25 1.46 1.46 0 00.49.09 1.09 1.09 0 00.5-.09.28.28 0 00.17-.26.24.24 0 00-.08-.19.4.4 0 00-.22-.09l-.36-.05h-.21a2.82 2.82 0 01-.54-.11.68.68 0 01-.36-.25.88.88 0 01-.14-.53 1 1 0 01.14-.54 1 1 0 01.42-.34 2 2 0 01.69-.11 1.83 1.83 0 01.47 0 2.23 2.23 0 01.44.13 3.11 3.11 0 01.4.22l-.44.53a1.58 1.58 0 00-.44-.2 1.39 1.39 0 00-.44-.07 1 1 0 00-.43.08.27.27 0 00-.15.24.19.19 0 00.08.16.44.44 0 00.21.07l.35.05h.14a2.66 2.66 0 01.58.1.77.77 0 01.39.26.89.89 0 01.16.58 1 1 0 01-.15.56.88.88 0 01-.45.34 2 2 0 01-.73.12 3.1 3.1 0 01-.54 0zM697.25 289.78h.75l-1.18 3.13h-.53l-1.18-3.13h.74l.7 2.1zM698.51 288.52h.72v.72h-.72zm0 1.26h.72v3.13h-.72zM700.09 289.78h.72v3.13h-.72zM702 291a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.84.84 0 01.5-.15 1 1 0 01.78.33 1.44 1.44 0 01.28.95v1.9H702zM704 292.81a1 1 0 01-.37-.45 1.88 1.88 0 01-.12-.71v-.6a1.94 1.94 0 01.12-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1 1 0 01.35.42l-.06.67a.59.59 0 00-.07-.31.37.37 0 00-.18-.19.62.62 0 00-.71.1.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.62.62 0 00.71.1.41.41 0 00.18-.19.62.62 0 00.07-.31v.69a.82.82 0 01-.8.55 1.07 1.07 0 01-.54-.16zm0 1.25a1.1 1.1 0 01-.45-.37l.49-.45a.71.71 0 00.27.22.8.8 0 00.33.08.69.69 0 00.49-.17.61.61 0 00.18-.47v-3.12h.69v3a1.53 1.53 0 01-.16.74 1.12 1.12 0 01-.47.47 1.6 1.6 0 01-.75.16 1.51 1.51 0 01-.62-.09zM707.45 292.8a1.14 1.14 0 01-.49-.48 1.65 1.65 0 01-.16-.77v-.35a1.78 1.78 0 01.16-.8 1.12 1.12 0 01.46-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.69.2 1.29 1.29 0 01.43.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a.9.9 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.89.89 0 00-.17.58v.4a.75.75 0 00.19.55.77.77 0 00.54.19 1.15 1.15 0 00.36-.07 1.23 1.23 0 00.31-.19l.47.44a1.73 1.73 0 01-.54.35 1.53 1.53 0 01-.6.12 1.57 1.57 0 01-.75-.19zM710.21 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM718.72 288.52h.73v4.39h-.73zm.39 1.88h2.5v.69h-2.5zm2.07-1.88h.72v4.39h-.72zM723 292.72a.92.92 0 01-.27-.73.88.88 0 01.27-.7 1.25 1.25 0 01.82-.23h.84v.56h-.88a.47.47 0 00-.32.09.32.32 0 00-.11.28.33.33 0 00.14.29.76.76 0 00.42.1 1.29 1.29 0 00.51-.08.25.25 0 00.17-.23l.06.44a.49.49 0 01-.18.25.75.75 0 01-.31.15 1.6 1.6 0 01-.39 0 1.17 1.17 0 01-.77-.19zm1.63-1.8a.49.49 0 00-.16-.4.6.6 0 00-.44-.15 1 1 0 00-.35.06 1.07 1.07 0 00-.32.16l-.48-.41a1.21 1.21 0 01.48-.33 1.81 1.81 0 01.67-.12 1.55 1.55 0 01.68.14 1 1 0 01.44.4 1.22 1.22 0 01.15.63v2h-.67zM726.16 289.78h.73v3.13h-.73zM728 291a.6.6 0 00-.16-.43.54.54 0 00-.43-.16.5.5 0 00-.55.55l-.07-.65a1.24 1.24 0 01.36-.44.9.9 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.28.95v1.9H728zM730 292.81a.93.93 0 01-.37-.45 1.87 1.87 0 01-.13-.71v-.6a1.93 1.93 0 01.13-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1.13 1.13 0 01.35.42l-.07.67a.71.71 0 00-.06-.31.37.37 0 00-.18-.19.56.56 0 00-.3-.07.51.51 0 00-.41.17.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.51.51 0 00.41.17.56.56 0 00.3-.07.41.41 0 00.18-.19.75.75 0 00.06-.31v.69a1 1 0 01-.3.4.84.84 0 01-.5.15 1.07 1.07 0 01-.53-.16zm1.33-4.29h.73v4.39h-.73zM733.52 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.93 1.93 0 01.16-.8 1.14 1.14 0 01.47-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.68.2 1.24 1.24 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a1 1 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.84.84 0 00-.18.58v.4a.76.76 0 00.2.55.77.77 0 00.54.19 1 1 0 00.35-.07 1.29 1.29 0 00.32-.19l.47.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM737 292a.24.24 0 00.06.18.21.21 0 00.16.06h.22v.69h-.4a.73.73 0 01-.56-.21.86.86 0 01-.2-.62v-3.57h.72z" transform="translate(1.64)"/><path d="M720.79 282.77c-.18.63-.55 1.78-1.29 3.67-1.24 3.19-3 5.09-2.47 7.14s2 3 4.82 3.84a45.51 45.51 0 004.73 1.05l-.74-.13" stroke="#ed7320" stroke-width=".93" stroke-miterlimit="10" fill="none"/> + </svg> +</div> +<div class="container"> + <div class="row my-5"> + @if (Model.HighlightedProducts.Any(c => c.IsAvailable && c.IsVisible)) { + <h2>Favorittar</h2> + <div class="favorites"> + @foreach (var product in Model.HighlightedProducts.Where(c => c.IsVisible && c.IsAvailable).OrderByDescending(c => c.Updated)) { + <a href="@product.WebPath()" class="favorite-card"> + <img src="@product.GetPrimaryImage().WebPath" class="lazyload blur-up" alt="..."> + <h3 class="mt-2">@product.Name</h3> + </a> + } + </div> + } + </div> + <div class="row contact-section" id="kontakt"> + @Html.Raw(Model.ContactHtml) + </div> +</div>
\ No newline at end of file diff --git a/src/Pages/Index.cshtml.cs b/src/Pages/Index.cshtml.cs new file mode 100644 index 0000000..3cefa0d --- /dev/null +++ b/src/Pages/Index.cshtml.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; +using VSH.Data; +using VSH.Data.Database; +using VSH.Data.Enums; + +namespace VSH.Pages; + +public class IndexModel : PageModel +{ + private readonly MainDbContext _context; + + public string ContactHtml { get; set; } + public List<Product> HighlightedProducts { get; set; } = new(); + + public IndexModel(MainDbContext context) { + _context = context; + } + + public ActionResult OnGet() { + ContactHtml = _context.Documents.OrderBy(c => c.Created) + .LastOrDefault(c => c.Type == DocumentType.CONTACT_PAGE) + ?.Content; + HighlightedProducts = _context.Products + .Where(c => c.ShowOnFrontpage + && c.VisibilityState == ProductVisibility.DEFAULT) + .Include(c => c.Category) + .ToList(); + return Page(); + } +}
\ No newline at end of file diff --git a/src/Pages/Kontoret/Bestillinger.cshtml b/src/Pages/Kontoret/Bestillinger.cshtml new file mode 100644 index 0000000..961e12a --- /dev/null +++ b/src/Pages/Kontoret/Bestillinger.cshtml @@ -0,0 +1,67 @@ +@page +@model VSH.Pages.Kontoret.Bestillinger +@{ + ViewData["Title"] = "Bestillinger"; +} +<div class="d-flex justify-content-center my-5" id="orders-loader"> + <div class="spinner-border" role="status"> + <span class="visually-hidden">Laster...</span> + </div> +</div> +<div id="orders-wrapper" class="d-none py-3"></div> + +<div id="order-info-modal" tabindex="-1" class="modal"> + <div class="modal-dialog modal-dialog-scrollable modal-lg"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title"></h5> + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> + </div> + <div class="modal-body"> + <div id="loader"> + <div class="spinner-border text-primary" role="status"> + <span class="visually-hidden">Loading...</span> + </div> + </div> + <div id="loaded"> + <span class="text-bold">Betalingsmetode:</span> <span id="order-payment-type"></span> <br> + <div class="ps-5 d-none" id="vipps-section"> + <span class="text-bold">Vipps - status:</span> <span id="vipps-status"></span> <br> + <span class="text-bold">Vipps - lenke:</span> <span id="vipps-link"></span> <br> + <button id="vipps-order-capture" class="btn btn-link d-none" title="Trykk her for å signalisere om levert bestilling"> + <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> + Bestillingen er levert + </button> + <button id="vipps-order-refund" class="btn btn-link d-none" title="Trykk her for å refundere bestillingen hos vipps"> + <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> + Bestillingen er refundert + </button> + <button id="vipps-order-cancel" class="btn btn-link d-none" title="Trykk her for å kansellere bestillingen hos vipps"> + <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> + Bestillingen er kansellert + </button> + </div> + <span class="text-bold">Status:</span> <span id="order-status"></span> <br> + <span class="text-bold">Navn:</span> <span id="contact-info-name"></span> <br> + <span class="text-bold">E-postadresse:</span> <span id="contact-info-emailAddress"></span> <br> + <span class="text-bold">Telefon:</span> <span id="contact-info-phoneNumber"></span> <br> + <span class="text-bold">Referanse:</span> <span id="order-reference"></span> <br> + <span class="text-bold">Bestillingsdato:</span> <span id="order-date"></span> <br> + <span class="text-bold">Totalt:</span> <span id="order-total"></span> <br> + <span class="text-bold">Kommentar:</span> <span id="order-comment"></span> + <table class="table"> + <thead> + <tr> + <th scope="col">#</th> + <th scope="col">Navn</th> + <th scope="col">Antall</th> + <th scope="col">Pris</th> + </tr> + </thead> + <tbody></tbody> + </table> + </div> + </div> + </div> + </div> +</div>
\ No newline at end of file diff --git a/src/Pages/Kontoret/Bestillinger.cshtml.cs b/src/Pages/Kontoret/Bestillinger.cshtml.cs new file mode 100644 index 0000000..8aff3c4 --- /dev/null +++ b/src/Pages/Kontoret/Bestillinger.cshtml.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace VSH.Pages.Kontoret; + +public class Bestillinger : PageModel +{ + public void OnGet() { } +}
\ No newline at end of file diff --git a/src/Pages/Kontoret/Dokumenter.cshtml b/src/Pages/Kontoret/Dokumenter.cshtml new file mode 100644 index 0000000..55e0ba6 --- /dev/null +++ b/src/Pages/Kontoret/Dokumenter.cshtml @@ -0,0 +1,21 @@ +@page +@using VSH.Data.Enums +@using VSH.Utilities +@using IOL.Helpers +@model VSH.Pages.Kontoret.Dokumenter +@{ + ViewData["Title"] = "Dokumenter"; +} + +<div class="d-flex mb-3"> + <select name="document-selector" id="document-selector" class="form-select"> + @foreach (var option in EnumHelpers.GetValues<DocumentType>()) { + <option value="@(option)">@EnumName.ForDocumentType(option)</option> + } + </select> + <button class="btn btn-outline-primary ms-3 fs-3" id="publish-button" title="Publiser"> + <i class="bi bi-cloud-upload"></i> + </button> +</div> + +<div id="editor"></div>
\ No newline at end of file diff --git a/src/Pages/Kontoret/Dokumenter.cshtml.cs b/src/Pages/Kontoret/Dokumenter.cshtml.cs new file mode 100644 index 0000000..ca72b4e --- /dev/null +++ b/src/Pages/Kontoret/Dokumenter.cshtml.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace VSH.Pages.Kontoret; + +public class Dokumenter : PageModel +{ + public void OnGet() { } +}
\ No newline at end of file diff --git a/src/Pages/Kontoret/Produkter.cshtml b/src/Pages/Kontoret/Produkter.cshtml new file mode 100644 index 0000000..825005d --- /dev/null +++ b/src/Pages/Kontoret/Produkter.cshtml @@ -0,0 +1,18 @@ +@page +@model VSH.Pages.Kontoret.Produkter2 +@{ + ViewData["Title"] = "Produkter"; +} + +<button class="btn btn-primary" id="open-product-modal">Legg til produkt</button> +<button class="btn btn-primary" id="open-categories-modal">Ã…pne kategorier</button> + +<div class="d-flex justify-content-center my-5" id="products-loader"> + <div class="spinner-border" role="status"> + <span class="visually-hidden">Laster...</span> + </div> +</div> +<div id="products" class="d-none py-3"></div> + +<partial name="Partials/_AdminProductModal"/> +<partial name="Partials/_AdminCategoriesModal"/>
\ No newline at end of file diff --git a/src/Pages/Kontoret/Produkter.cshtml.cs b/src/Pages/Kontoret/Produkter.cshtml.cs new file mode 100644 index 0000000..0d16e08 --- /dev/null +++ b/src/Pages/Kontoret/Produkter.cshtml.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace VSH.Pages.Kontoret; + +public class Produkter2 : PageModel +{ + public void OnGet() { } +}
\ No newline at end of file diff --git a/src/Pages/Kontoret/_ViewImports.cshtml b/src/Pages/Kontoret/_ViewImports.cshtml new file mode 100644 index 0000000..01f3f6a --- /dev/null +++ b/src/Pages/Kontoret/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using VSH +@namespace VSH.Pages.Kontoret +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/src/Pages/Kontoret/_ViewStart.cshtml b/src/Pages/Kontoret/_ViewStart.cshtml new file mode 100644 index 0000000..0297c66 --- /dev/null +++ b/src/Pages/Kontoret/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_AdminLayout"; +}
\ No newline at end of file diff --git a/src/Pages/Leverandorar.cshtml b/src/Pages/Leverandorar.cshtml new file mode 100644 index 0000000..eb712a5 --- /dev/null +++ b/src/Pages/Leverandorar.cshtml @@ -0,0 +1,9 @@ +@page "/leverandørar" +@model VSH.Pages.Leverandorar +@{ + ViewData["Title"] = "Leverandørar"; +} + +<div class="container py-3 py-md-5 dynamic-content"> + @Html.Raw(Model.DealersPageHtml) +</div>
\ No newline at end of file diff --git a/src/Pages/Leverandorar.cshtml.cs b/src/Pages/Leverandorar.cshtml.cs new file mode 100644 index 0000000..e8f467b --- /dev/null +++ b/src/Pages/Leverandorar.cshtml.cs @@ -0,0 +1,23 @@ +using System.Linq; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; +using VSH.Data; +using VSH.Data.Enums; + +namespace VSH.Pages; + +public class Leverandorar : PageModel +{ + private readonly MainDbContext _context; + + public Leverandorar(MainDbContext context) { + context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + _context = context; + } + + public string DealersPageHtml { get; set; } + + public void OnGet() { + DealersPageHtml = _context.Documents.FirstOrDefault(c => c.Type == DocumentType.DEALERS_PAGE)?.Content; + } +}
\ No newline at end of file diff --git a/src/Pages/LoggInn.cshtml b/src/Pages/LoggInn.cshtml new file mode 100644 index 0000000..6349466 --- /dev/null +++ b/src/Pages/LoggInn.cshtml @@ -0,0 +1,34 @@ +@page +@using Microsoft.AspNetCore.Antiforgery +@model VSH.Pages.LoggInn +@inject IAntiforgery Antiforgery +@{ + ViewData["Title"] = "Logg inn"; + var token = Antiforgery.GetAndStoreTokens(HttpContext).RequestToken; +} + +<div class="container mw-450px py-3 py-md-5"> + <div class="alert alert-danger d-none" id="error" role="alert"> + <h4 class="alert-header" id="error-title"></h4> + <p class="mb-0" id="error-message"></p> + </div> + <form id="login-form" onsubmit="return false"> + <div class="mb-3"> + <label for="input-email" class="form-label">E-postadresse</label> + <input type="email" class="form-control" name="input-email" id="input-email" placeholder="navn@domene.no" autofocus required> + </div> + <div class="mb-3"> + <label for="input-password" class="form-label">Passord</label> + <input type="password" class="form-control" name="input-password" id="input-password" required> + </div> + <div class="mb-3 form-check"> + <input type="checkbox" class="form-check-input" id="persist-session"> + <label class="form-check-label" for="persist-session">Husk meg</label> + </div> + <input type="hidden" name="xsrf" value="@token"> + <button type="submit" id="submit" class="btn btn-primary float-right"> + <span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span> + Logg inn + </button> + </form> +</div> diff --git a/src/Pages/LoggInn.cshtml.cs b/src/Pages/LoggInn.cshtml.cs new file mode 100644 index 0000000..d4ee7d7 --- /dev/null +++ b/src/Pages/LoggInn.cshtml.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace VSH.Pages; + +public class LoggInn : PageModel +{ + public ActionResult OnGet() { + if (User.Identity?.IsAuthenticated ?? false) { + if (Request.Query.ContainsKey("ReturnUrl")) { + return Redirect(Request.Query["ReturnUrl"]); + } + + return Redirect("/kontoret"); + } + + return Page(); + } +}
\ No newline at end of file diff --git a/src/Pages/OmOss.cshtml b/src/Pages/OmOss.cshtml new file mode 100644 index 0000000..0ba277c --- /dev/null +++ b/src/Pages/OmOss.cshtml @@ -0,0 +1,9 @@ +@page "/om-oss" +@model VSH.Pages.OmOss +@{ + ViewData["Title"] = "Om oss"; +} + +<div class="container py-3 py-md-5 dynamic-content"> + @Html.Raw(Model.AboutUsPageHtml) +</div>
\ No newline at end of file diff --git a/src/Pages/OmOss.cshtml.cs b/src/Pages/OmOss.cshtml.cs new file mode 100644 index 0000000..217f829 --- /dev/null +++ b/src/Pages/OmOss.cshtml.cs @@ -0,0 +1,23 @@ +using System.Linq; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; +using VSH.Data; +using VSH.Data.Enums; + +namespace VSH.Pages; + +public class OmOss : PageModel +{ + private readonly MainDbContext _context; + + public OmOss(MainDbContext context) { + context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + _context = context; + } + + public string AboutUsPageHtml { get; set; } + + public void OnGet() { + AboutUsPageHtml = _context.Documents.FirstOrDefault(c => c.Type == DocumentType.ABOUT_PAGE)?.Content; + } +}
\ No newline at end of file diff --git a/src/Pages/Partials/_AdminCategoriesModal.cshtml b/src/Pages/Partials/_AdminCategoriesModal.cshtml new file mode 100644 index 0000000..ee52f2a --- /dev/null +++ b/src/Pages/Partials/_AdminCategoriesModal.cshtml @@ -0,0 +1,25 @@ +<div class="modal" tabindex="-1" id="categories-modal"> + <div class="modal-dialog modal-dialog-scrollable modal-lg"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title">Kategorier</h5> + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> + </div> + <div class="modal-body"> + <div class="card"> + <div class="card-header p-3"> + <form onsubmit="return false;" id="new-category-form"> + <input type="text" class="form-control" id="new-category-name" name="new-category-name" placeholder="Legg til en ny kategori" autocomplete="off" required> + </form> + </div> + <div class="d-flex justify-content-center p-3" id="loading-wrapper"> + <div class="spinner-border" role="status"> + <span class="visually-hidden">Laster...</span> + </div> + </div> + <div class="list-group list-group-flush d-none" id="list-wrapper"></div> + </div> + </div> + </div> + </div> +</div>
\ No newline at end of file diff --git a/src/Pages/Partials/_AdminProductModal.cshtml b/src/Pages/Partials/_AdminProductModal.cshtml new file mode 100644 index 0000000..06cbc81 --- /dev/null +++ b/src/Pages/Partials/_AdminProductModal.cshtml @@ -0,0 +1,72 @@ +<div class="modal" tabindex="-1" id="product-modal"> + <div class="modal-dialog modal-dialog-scrollable modal-lg"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title" id="product-modal-title">Nytt produkt</h5> + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> + </div> + <div class="modal-body"> + <form class="margin-bottom-sm" id="product-form"> + <div class="loader"> + <div class="spinner-border" role="status"> + <span class="visually-hidden">Laster...</span> + </div> + </div> + <fieldset class="mb-3"> + <label class="form-label mb-2" for="input-name">Navn</label> + <input class="form-control" type="text" name="input-name" id="input-name" required/> + </fieldset> + <fieldset class="mb-3 row"> + <div class="col"> + <label class="form-label mb-2" for="input-price">Pris</label> + <div class="input-group"> + <input class="form-control" type="text" name="input-price" id="input-price" required/> + <select class="form-select" style="max-width: 85px;" id="input-price-suffix"> + <option selected value="0">,-</option> + <option value="1">,- kg</option> + </select> + </div> + </div> + <div class="col"> + <label class="form-label mb-2" for="input-count">Besetning (-1 for uendelig)</label> + <div class="input-group"> + <input class="form-control" type="number" min="-1" name="input-count" id="input-count" placeholder="Antall produkter/kilo for salg"/> + </div> + </div> + </fieldset> + <fieldset class="mb-3"> + <label class="form-label mb-2" for="input-description">Beskrivelse</label> + <textarea class="form-control" name="input-description" id="input-description"></textarea> + </fieldset> + <fieldset class="mb-3"> + <label for="" class="form-label mb-2">Bilder</label> + <div class="row pb-2" id="input-images-row"> + </div> + </fieldset> + <fieldset class="form-check form-switch mb-3"> + <input class="form-check-input" type="checkbox" id="show-on-frontpage" name="show-on-frontpage"> + <label class="form-check-label" for="show-on-frontpage">Vis på forsiden</label> + </fieldset> + <fieldset class="mb-3"> + <label for="" class="form-label mb-2">Kategori</label> + <div id="product-category-picker-wrapper"> + <div id="picker" class="d-none"></div> + <div class="d-flex justify-content-center" id="loader"> + <div class="spinner-border" role="status"> + <span class="visually-hidden">Laster...</span> + </div> + </div> + </div> + </fieldset> + </form> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-lg btn-secondary" data-bs-dismiss="modal">Avbryt</button> + <button type="button" class="btn btn-lg btn-primary" id="submit-product-form"> + <span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span> + <span class="text">Lagre</span> + </button> + </div> + </div> + </div> +</div>
\ No newline at end of file diff --git a/src/Pages/Partials/_CultureSelector.cshtml b/src/Pages/Partials/_CultureSelector.cshtml new file mode 100644 index 0000000..07965f9 --- /dev/null +++ b/src/Pages/Partials/_CultureSelector.cshtml @@ -0,0 +1,35 @@ +@using Microsoft.AspNetCore.Builder +@using Microsoft.AspNetCore.Localization +@using Microsoft.Extensions.Localization +@using Microsoft.Extensions.Options +@using IOL.Helpers + +@inject IStringLocalizer<SharedPageResources> Localizer +@inject IOptions<RequestLocalizationOptions> LocOptions + +@{ + var requestCulture = Context.Features.Get<IRequestCultureFeature>(); + var cultureItems = LocOptions.Value.SupportedUICultures; +} + +<div> + <form asp-controller="Root" + asp-action="SetCulture" + asp-route-returnUrl="@Context.Request.Path" + method="post" + class="row row-cols-lg-auto g-3 align-items-center" + role="form"> + <div class="col"> + <select class="form-control" name="culture"> + @foreach (var item in cultureItems) { + if (item.Name == requestCulture?.RequestCulture.UICulture.Name) { + <option value="@item.Name" selected>@item.NativeName.Capitalize()</option> + } else { + <option value="@item.Name">@item.NativeName.Capitalize()</option> + } + } + </select> + </div> + <button type="submit" class="btn btn-default btn-xs">@Localizer["Lagre"]</button> + </form> +</div>
\ No newline at end of file diff --git a/src/Pages/Personvern.cshtml b/src/Pages/Personvern.cshtml new file mode 100644 index 0000000..83d5043 --- /dev/null +++ b/src/Pages/Personvern.cshtml @@ -0,0 +1,8 @@ +@page +@model PrivacyModel +@{ + ViewData["Title"] = "Personvern"; +} +<div class="container py-3 py-md-5 dynamic-content"> + @Html.Raw(Model.PrivacyPolicyHtml) +</div>
\ No newline at end of file diff --git a/src/Pages/Personvern.cshtml.cs b/src/Pages/Personvern.cshtml.cs new file mode 100644 index 0000000..1a661c5 --- /dev/null +++ b/src/Pages/Personvern.cshtml.cs @@ -0,0 +1,25 @@ +using System.Linq; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; +using VSH.Data; +using VSH.Data.Enums; + +namespace VSH.Pages; + +public class PrivacyModel : PageModel +{ + private readonly MainDbContext _context; + + public PrivacyModel(MainDbContext context) { + context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + _context = context; + } + + public string PrivacyPolicyHtml { get; set; } + + public void OnGet() { + PrivacyPolicyHtml = _context.Documents.OrderBy(c => c.Created) + .LastOrDefault(c => c.Type == DocumentType.PRIVACY_POLICY) + ?.Content; + } +}
\ No newline at end of file diff --git a/src/Pages/Produktar.cshtml b/src/Pages/Produktar.cshtml new file mode 100644 index 0000000..f43e4ab --- /dev/null +++ b/src/Pages/Produktar.cshtml @@ -0,0 +1,163 @@ +@page "{categorySlug?}/{productSlug?}" +@using VSH.Data.Static +@using IOL.Helpers +@model VSH.Pages.Produktar +@{ + var title = "Produktar"; + if (Model.IsProduct) { + title = Model.CurrentProduct.Name; + } else if (Model.IsCategory) { + title = Model.Categories.FirstOrDefault()?.Name; + } + + ViewData["Title"] = title; +} + +<div class="container py-3 py-md-5"> + @if (Model.IsCategory || Model.IsProduct) { + <nav aria-label="breadcrumb" class="pt-3"> + <ol class="breadcrumb"> + @if (Model.Categories?.Count == 1) { + <li class="breadcrumb-item"> + <a href="/produktar">Produktar</a> + </li> + <li class="breadcrumb-item active" aria-current="page"> + @Model.Categories.SingleOrDefault()?.Name + </li> + } + @if (Model.IsProduct) { + <li class="breadcrumb-item"> + <a href="/produktar">Produktar</a> + </li> + <li class="breadcrumb-item"> + <a href="/produktar/@Model.CategorySlug">@Model.CurrentProduct.Category.Name</a> + </li> + <li class="breadcrumb-item active" aria-current="page"> + @Model.CurrentProduct.Name + </li> + } + </ol> + </nav> + } + + @if (Model.IsProduct) { + <div class="row" id="single-product-wrapper" data-id="@Model.CurrentProduct.Id"> + <div class="col-12 col-md-6"> + @if (Model.CurrentProduct.Images.Any()) { + if (Model.CurrentProduct.Images.Count > 1) { + <div id="product-carousel" class="carousel"> + <div class="carousel-inner"> + @{ var index = 0; } + @foreach (var secondaryImage in Model.CurrentProduct.Images.OrderBy(c => c.Order)) { + <div class="carousel-item @(index == 0 ? "active" : "")"> + <img src="@secondaryImage.GetPath().WebPath" class="d-block w-100 @(index == 0 ? "lazyload blur-up" : "")" alt=""> + </div> + index++; + } + </div> + </div> + <div class="d-flex justify-content-start flex-wrap mt-2" id="carousel-navigator"> + @{ var secIndex = 0; } + @foreach (var secondaryImage in Model.CurrentProduct.Images.OrderBy(c => c.Order)) { + <div class="px-1 thumb-button cursor-pointer" data-thumb-index="@secIndex"> + <img src="@secondaryImage.GetPath().WebPath" class="img-thumbnail lazyload blur-up border-0" alt=""> + </div> + secIndex++; + } + </div> + } else { + var fileName = Model.CurrentProduct.GetPrimaryImage(); + <img src="@(fileName.WebPath.ExtractFileName() + "-150" + fileName.WebPath.ExtractExtension())" + data-src="@fileName.WebPath" + class="card-img-top lazyload blur-up" + alt="Bilde av produktet"> + } + } else { + <img src="/assets/profile/innrammet.svg" + data-src="/assets/profile/innrammet.svg" + class="card-img-top lazyload blur-up placeholder p-5" + alt="Bilde av produktet"> + } + </div> + <div class="col-12 pt-3 col-md-6"> + <div class="row"> + <h2 class="title">@Model.CurrentProduct.Name</h2> + <p class="description">@Model.CurrentProduct.Description</p> + </div> + <div class="row"> + <div class="col d-flex justify-content-end align-items-center buttons"> + @if (Model.CurrentProduct.IsAvailable) { + <div class="add-to-cart-button"> + <div class="counter-wrapper"></div> + <button class="btn btn-outline-primary shadow-none disabled bag-button" data-product-max-count="@Model.CurrentProduct.Count"> + <div class="spinner-border text-primary" role="status"> + <span class="visually-hidden">Loading...</span> + </div> + </button> + <span class="product-price text-bold" data-price="@Model.CurrentProduct.Price">@Model.CurrentProduct.Price@(Model.CurrentProduct.ReadablePriceSuffix)</span> + </div> + } else { + <button class="btn btn-lg btn-outline-primary shadow-none disabled"> + Utselt + </button> + } + </div> + </div> + </div> + </div> + } else if ((Model.IsCategory || Model.IsCategories) && Model.Categories?.Count >= 1) { + foreach (var category in Model.Categories.Where(category => category.Products.Count >= 1)) { + <div class="row mb-3"> + <h2 class="h2">@category.Name</h2> + @foreach (var product in category.Products.Where(c => c.IsVisible)) { + <div class="col-sm-12 col-md-6 col-xl-3 p-1 px-2 mb-3"> + <div class="card product-card" data-id="@product.Id"> + @if (product.Images.Any()) { + var fileName = product.GetPrimaryImage(); + <a href="@product.WebPath()"> + <img src="@(fileName.WebPath.ExtractFileName() + "-150" + fileName.WebPath.ExtractExtension())" + data-src="@fileName.WebPath" + class="card-img-top lazyload blur-up" + alt=""> + </a> + } else { + <a href="@product.WebPath()"> + <img src="@AppPaths.DefaultProductImage.WebPath" + data-src="@AppPaths.DefaultProductImage.WebPath" + class="card-img-top lazyload blur-up placeholder" + alt=""> + </a> + } + <div class="card-body"> + <a class="card-title fs-3 text-reset text-decoration-none" href="@product.WebPath()"> + @product.Name + </a> + <div class="d-flex justify-content-end align-items-center pt-1 buttons"> + @if (product.IsAvailable) { + <div class="add-to-cart-button"> + <div class="counter-wrapper"></div> + <button class="btn btn-outline-primary shadow-none disabled bag-button" data-product-max-count="@product.Count"> + <div class="spinner-border text-primary" role="status"> + <span class="visually-hidden">Loading...</span> + </div> + </button> + <span class="product-price text-bold" data-price="@product.Price">@product.Price@(product.ReadablePriceSuffix)</span> + </div> + } else { + <button class="btn btn-link float-right shadow-none disabled"> + Utselt + </button> + } + </div> + </div> + </div> + </div> + } + </div> + } + } else { + <h2> + Heisann, her er det tomt for augneblinken. Prøv igjen snart. + </h2> + } +</div>
\ No newline at end of file diff --git a/src/Pages/Produktar.cshtml.cs b/src/Pages/Produktar.cshtml.cs new file mode 100644 index 0000000..b0ba470 --- /dev/null +++ b/src/Pages/Produktar.cshtml.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using IOL.Helpers; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Options; +using VSH.Data.Miscellaneous; +using VSH.Data.Database; +using VSH.Data; +using VSH.Data.Enums; +using VSH.Data.Static; + +namespace VSH.Pages; + +public class Produktar : PageModel +{ + private readonly MainDbContext _context; + private readonly IStringLocalizer<SharedPageResources> _localizer; + private readonly IOptions<AppSettings.GeneralConfiguration> _options; + + public string ProductSlug { get; set; } + public string CategorySlug { get; set; } + public bool IsProduct { get; set; } + public bool IsCategory { get; set; } + public bool IsCategories { get; set; } + public Product CurrentProduct { get; set; } + + public Produktar( + MainDbContext context, + IStringLocalizer<SharedPageResources> localizer, + IOptions<AppSettings.GeneralConfiguration> options + ) { + _context = context; + _localizer = localizer; + _options = options; + } + + public List<Category> Categories { get; set; } + + public ActionResult OnGet(string categorySlug, string productSlug) { + ProductSlug = productSlug; + CategorySlug = categorySlug; + + if (ProductSlug.HasValue()) { + CurrentProduct = _context.Products.Where(c => c.VisibilityState == ProductVisibility.DEFAULT) + .Include(c => c.Category) + .SingleOrDefault(p => p.Slug == ProductSlug); + IsProduct = CurrentProduct != default; + if (!IsProduct) + return Page(); + var productImage = CurrentProduct != null && CurrentProduct.Images.Any() + ? CurrentProduct.Images.OrderBy(c => c.Order).FirstOrDefault() + : default; + + ViewData["open_graph"] = new OpenGraphData { + Description = CurrentProduct?.Description, + Image = productImage != default + ? (HttpContext.Request.GetRequestHost() + + Path.Combine(AppPaths.ProductImages.WebPath, productImage.FileName)) + : default, + Title = $"{CurrentProduct?.Name} {_localizer["frå"]} {_options.Value.StoreName}", + }; + } else if (CategorySlug.HasValue()) { + Categories = _context + .Categories.Where(c => c.Slug == CategorySlug + && c.VisibilityState == CategoryVisibility.DEFAULT) + .Include(c => c.Products) + .ToList(); + IsCategory = !IsProduct && Categories?.Count == 1; + } else { + Categories = _context.Categories.Where(c => c.VisibilityState == CategoryVisibility.DEFAULT) + .Include(c => c.Products) + .ToList(); + IsCategories = !IsProduct && Categories?.Count >= 1; + } + + return Page(); + } +}
\ No newline at end of file diff --git a/src/Pages/SalesTerms.cshtml b/src/Pages/SalesTerms.cshtml new file mode 100644 index 0000000..7c48bff --- /dev/null +++ b/src/Pages/SalesTerms.cshtml @@ -0,0 +1,9 @@ +@page "/vilkår" +@model VSH.Pages.SalesTerms +@{ + ViewData["Title"] = "Salgsvilkår"; +} + +<div class="container py-5 dynamic-content"> + @Html.Raw(Model.TermsPageHtml) +</div>
\ No newline at end of file diff --git a/src/Pages/SalesTerms.cshtml.cs b/src/Pages/SalesTerms.cshtml.cs new file mode 100644 index 0000000..fe58839 --- /dev/null +++ b/src/Pages/SalesTerms.cshtml.cs @@ -0,0 +1,25 @@ +using System.Linq; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; +using VSH.Data; +using VSH.Data.Enums; + +namespace VSH.Pages; + +public class SalesTerms : PageModel +{ + private readonly MainDbContext _context; + + public SalesTerms(MainDbContext context) { + context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + _context = context; + } + + public string TermsPageHtml { get; set; } + + public void OnGet() { + TermsPageHtml = _context.Documents.OrderBy(c => c.Created) + .LastOrDefault(c => c.Type == DocumentType.SALES_TERMS) + ?.Content; + } +}
\ No newline at end of file diff --git a/src/Pages/Shared/_AdminLayout.cshtml b/src/Pages/Shared/_AdminLayout.cshtml new file mode 100644 index 0000000..d352928 --- /dev/null +++ b/src/Pages/Shared/_AdminLayout.cshtml @@ -0,0 +1,114 @@ +@using VSH.Data.Miscellaneous +@using Microsoft.Extensions.Options +@using Microsoft.Extensions.Configuration +@using VSH.Utilities +@inject IOptions<AppSettings.GeneralConfiguration> Options; +@inject IConfiguration Configuration; +<!DOCTYPE html> +<html lang="no"> +<head> + <meta charset="utf-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + <link rel="manifest" href="/manifest.json"> + <link rel="stylesheet" href="~/dist/backbundle.css" asp-append-version="true"> + @await RenderSectionAsync("Head", required: false) + <title>@ViewData["Title"] - Kontoret - @Options.Value.StoreName</title> +</head> +<body> + +<div class="container my-3"> + <div class="row"> + <div class="col"> + <div class="d-flex mb-3"> + <div class="flex-grow-1"> + <h2>@Options.Value.ShortStoreName</h2> + </div> + <div class="dropdown" id="account-dropdown"> + <button class="dropdown-toggle btn btn-light" type="button" id="account-dropdown-btn" data-bs-toggle="dropdown" aria-expanded="false"> + <span class="d-none d-lg-inline">@Context.User.Identity?.Name</span> + <span class="d-inline d-lg-none"> + <i class="bi bi-person fs-3"></i> + </span> + </button> + <div class="dropdown-menu dropdown-menu-right" aria-labelledby="account-dropdown-btn"> + <a href="/" title="GÃ¥ til forsiden" class="dropdown-item">GÃ¥ til forsiden</a> + <span class="dropdown-item open-update-password-modal cursor-pointer">Endre passord</span> + <hr class="dropdown-divider"> + <span class="text-danger dropdown-item logout-btn cursor-pointer">Logg ut</span> + </div> + </div> + </div> + </div> + </div> + <div style="height: 52px;overflow-y: hidden"> + <div style="overflow: auto hidden"> + <ul class="nav nav-tabs" role="tablist" style="flex-wrap: nowrap;"> + <li class="nav-item" role="presentation"> + @if (Context.Request.Path.Value?.StartsWith("/kontoret/produkter") ?? false) { + <a class="nav-link active" href="/kontoret/produkter" role="tab">Produkter</a> + } else { + <a class="nav-link" href="/kontoret/produkter" role="tab">Produkter</a> + } + </li> + <li class="nav-item" role="presentation"> + @if (Context.Request.Path.Value?.StartsWith("/kontoret/bestillinger") ?? false) { + <a class="nav-link active" href="/kontoret/bestillinger" role="tab">Bestillinger</a> + } else { + <a class="nav-link" href="/kontoret/bestillinger" role="tab">Bestillinger</a> + } + </li> + <li class="nav-item" role="presentation"> + @if (Context.Request.Path.Value?.StartsWith("/kontoret/dokumenter") ?? false) { + <a class="nav-link active" href="/kontoret/dokumenter" role="tab">Dokumenter</a> + } else { + <a class="nav-link" href="/kontoret/dokumenter" role="tab">Dokumenter</a> + } + </li> + </ul> + </div> + </div> + + <script> + if (window.innerWidth < 768) { + document.querySelector(".nav").style.paddingBottom = "50px"; + document.querySelector(".nav").className = "nav nav-pills"; + } + </script> + + <main class="py-3"> + @RenderBody() + </main> +</div> + +<div class="modal" tabindex="-1" id="update-password-modal"> + <div class="modal-dialog modal-sm"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title" id="product-modal-title">Endre passord</h5> + <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> + </div> + <div class="modal-body"> + <form onsubmit="return false"> + <fieldset> + <label for="input-new-password" class="form-label mb-2">Nytt passord</label> + <input class="form-control" type="password" id="input-new-password" minlength="6" min="6" placeholder="Minst 6 karakterer" required> + </fieldset> + </form> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Avbryt</button> + <button type="button" class="btn btn-primary" id="submit-new-password-form"> + <span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span> + <span class="text">Lagre</span> + </button> + </div> + </div> + </div> +</div> + +<span id="version-text" style="position: absolute; bottom: 0; right: 0">@Configuration.GetVersion()</span> + +<script src="~/dist/backbundle.min.js" asp-append-version="true"></script> +@await RenderSectionAsync("Scripts", required: false) +</body> +</html>
\ No newline at end of file diff --git a/src/Pages/Shared/_PublicLayout.cshtml b/src/Pages/Shared/_PublicLayout.cshtml new file mode 100644 index 0000000..d3280dd --- /dev/null +++ b/src/Pages/Shared/_PublicLayout.cshtml @@ -0,0 +1,152 @@ +@using VSH.Data.Miscellaneous +@using Microsoft.Extensions.Options +@using Microsoft.Extensions.Localization +@using IOL.Helpers +@inject IOptions<AppSettings.GeneralConfiguration> Options; +@inject IStringLocalizer<SharedPageResources> Localizer; +@{ + var host = Context.Request.GetRequestHost(); + var currentUrl = host + Context.Request.Path.Value; + const string CURRENT_CULTURE = "nn"; + var openGraphData = ViewData["open_graph"] as OpenGraphData; +} +<!DOCTYPE html> +<html lang="@CURRENT_CULTURE"> +<head> + <meta charset="utf-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + <meta http-equiv="content-type" content="text/html; charset=utf-8"/> + <meta name="description" content="@(openGraphData?.Description ?? Options.Value.DefaultDescription)"/> + <meta name="geo.region" content="NO"/> + <meta name="geo.placename" content="Vinje"/> + <meta name="geo.position" content="59.621963;7.82424"/> + <meta name="ICBM" content="59.621963, 7.82424"/> + <meta property="og:type" content="@(openGraphData?.Type ?? "website")"/> + <meta property="og:locale" content="@(openGraphData?.Locale ?? CURRENT_CULTURE)"/> + <meta property="og:title" content="@(openGraphData?.Title ?? ViewData["Title"])"/> + <meta property="og:url" content="@(openGraphData?.Url ?? currentUrl)"/> + <meta property="og:description" content="@(openGraphData?.Description ?? Options.Value.DefaultDescription)"/> + <meta property="og:site_name" content="@(openGraphData?.SiteName ?? Options.Value.StoreName)"/> + <meta property="og:image" content="@(openGraphData?.Image ?? (host + "/assets/profile/og_default.png"))"/> + <link rel="stylesheet" href="~/dist/frontbundle.css" asp-append-version="true"> + @await RenderSectionAsync("Head", required: false) + <title>@ViewData["Title"] - @Options.Value.StoreName</title> +</head> +<body class="d-flex min-vh-100 flex-column"> + +<nav class="navbar fixed-top navbar-expand-lg user-select-none bg-white"> + <a class="navbar-brand ps-3" href="/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 195.32 48.63"> + <defs> + <style>.cls-logo-1{fill:none;stroke:#ee741e;stroke-miterlimit:10;stroke-width:3px}.cls-logo-2{fill:#ee741e}</style> + </defs> + <path class="cls-logo-1" + d="M24 1.5h167.33a2.49 2.49 0 012.49 2.5v21.72a21.39 21.39 0 01-21.39 21.39H4a2.49 2.49 0 01-2.5-2.5V24A22.5 22.5 0 0124 1.5z"/> + <path class="cls-logo-2" + d="M244.67 287.43h2.21l2.9 9.27 2.89-9.27h2.21l-4.21 12.78h-1.79zM256.31 287.43h2.1v2.1h-2.1zm0 3.65h2.1v9.13h-2.1zM260.89 291.08H263v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.66 1.66 0 00-1.25-.45 1.61 1.61 0 00-1.19.42 1.56 1.56 0 00-.43 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.82 2.82 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM269.72 301.9h.78a.58.58 0 00.45-.18.78.78 0 00.16-.51v-10.13h2.1v10.42a2.51 2.51 0 01-.59 1.78 2.12 2.12 0 01-1.64.64h-1.26zm1.37-14.47h2.13v2.1h-2.13zM278.3 300.34l-.91-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.23 4.23 0 012.12-.5 3.4 3.4 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.15 2.15 0 00.56 1.59 2.19 2.19 0 001.59.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.38 1.27a5 5 0 01-1.56 1 4.52 4.52 0 01-1.74.36zM288 300.34l-.73-.15a6.67 6.67 0 01-1.39-.46 5.07 5.07 0 01-1.16-.73l1.27-1.58a5.72 5.72 0 001.42.75 4.2 4.2 0 001.41.25 3.18 3.18 0 001.46-.26.8.8 0 00.49-.75.66.66 0 00-.24-.56 1.34 1.34 0 00-.62-.26 10.1 10.1 0 00-1.05-.14h-.62a9.26 9.26 0 01-1.57-.29 2 2 0 01-1-.73 2.46 2.46 0 01-.42-1.54 2.84 2.84 0 01.42-1.58 2.51 2.51 0 011.22-1 5.28 5.28 0 012-.33 6.92 6.92 0 011.37.14 7 7 0 011.28.39 6.53 6.53 0 011.15.65l-1.25 1.53a5.57 5.57 0 00-1.3-.59 4.47 4.47 0 00-1.27-.2 2.8 2.8 0 00-1.26.23.78.78 0 00-.43.71.52.52 0 00.24.46 1.64 1.64 0 00.59.21c.24 0 .58.08 1 .12h.4a11.1 11.1 0 011.68.29 2.28 2.28 0 011.13.77 2.65 2.65 0 01.47 1.68 2.92 2.92 0 01-.44 1.63 2.7 2.7 0 01-1.31 1 5.71 5.71 0 01-2.12.34zM299.78 291.08h2.13l-3.43 9.13H297l-3.43-9.13h2.13l2.06 6.12zM303.43 287.43h2.09v2.1h-2.09zm0 3.65h2.09v9.13h-2.09zM308 291.08h2.1v9.13H308zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.64 1.64 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.78 2.78 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1zM319.23 299.9a2.73 2.73 0 01-1.06-1.31 5.14 5.14 0 01-.37-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011-1.31 3 3 0 011.66-.46 2.49 2.49 0 011.41.43 3 3 0 011 1.22l-.18 1.94a2.06 2.06 0 00-.18-.9 1.39 1.39 0 00-.54-.56 1.72 1.72 0 00-.85-.19 1.52 1.52 0 00-1.22.51 2.17 2.17 0 00-.43 1.42v1.72a2.12 2.12 0 00.43 1.41 1.54 1.54 0 001.22.49 1.62 1.62 0 00.85-.2 1.39 1.39 0 00.54-.56 2 2 0 00.18-.89l.12 2a2.39 2.39 0 01-2.33 1.59 3 3 0 01-1.61-.46zm.93 4l-.84-.39a3.06 3.06 0 01-1.3-1.07l1.42-1.3a2.18 2.18 0 00.78.64 2.33 2.33 0 001 .22 2 2 0 001.41-.49 1.79 1.79 0 00.52-1.38v-9.07h2.1v8.85a4.65 4.65 0 01-.47 2.16 3.11 3.11 0 01-1.37 1.36 4.67 4.67 0 01-2.17.47zM330.3 300.34l-.91-.48a3.19 3.19 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.22 3.22 0 011.34-1.46 4.29 4.29 0 012.12-.5 3.38 3.38 0 012 .59 3.57 3.57 0 011.27 1.69 7.33 7.33 0 01.43 2.67v.6h-6.19V295h4.24v-.1a2.52 2.52 0 00-.53-1.48 1.51 1.51 0 00-1.21-.53 1.84 1.84 0 00-1.46.59 2.48 2.48 0 00-.52 1.69v1.16a1.95 1.95 0 002.14 2.15 2.86 2.86 0 001-.2 3 3 0 00.91-.55l1.39 1.27a5.19 5.19 0 01-1.56 1 4.53 4.53 0 01-1.75.36zM337.42 291.08h2.1v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.62 1.62 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.8 2.8 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1z" + transform="translate(-234.32 -270.82)"/> + <path class="cls-logo-1" + d="M363.62 271.28c-.58 1.89-1.77 5.38-4.09 11.1-3.92 9.68-9.44 15.37-7.86 21.65s5.65 9.4 14.19 12c2.49.77 4.85 1.41 7 1.95" + transform="translate(-234.32 -270.82)"/> + <path class="cls-logo-2" + d="M363.63 287.43h2.1v12.78h-2.1zm1.11 5.46H372v2h-7.27zm6-5.46h2.1v12.78h-2.1zM376 299.64a2.71 2.71 0 01-.78-2.12 2.5 2.5 0 01.79-2 3.56 3.56 0 012.37-.68h2.44l.13 1.63h-2.55a1.41 1.41 0 00-.94.27 1 1 0 00-.31.81.94.94 0 00.41.84 2.12 2.12 0 001.22.28 3.76 3.76 0 001.49-.22.71.71 0 00.48-.68l.19 1.3a1.59 1.59 0 01-.52.72 2.51 2.51 0 01-.9.43 4.28 4.28 0 01-1.16.15 3.47 3.47 0 01-2.36-.73zm4.74-5.22a1.53 1.53 0 00-.45-1.18 1.82 1.82 0 00-1.28-.43 3.32 3.32 0 00-1 .17 3.2 3.2 0 00-.92.47l-1.4-1.18a3.52 3.52 0 011.41-1 5.22 5.22 0 011.9-.27 4.61 4.61 0 012 .4 2.9 2.9 0 011.26 1.16 3.65 3.65 0 01.44 1.83v5.87h-1.95zM385.25 291.08h2.1v9.13h-2.1zm5.4 3.6a1.75 1.75 0 00-.44-1.27A1.66 1.66 0 00389 293a1.61 1.61 0 00-1.19.42 1.59 1.59 0 00-.42 1.18l-.19-1.89a3.38 3.38 0 011-1.28 2.56 2.56 0 011.48-.44 2.81 2.81 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM396.47 299.9a2.81 2.81 0 01-1.07-1.31 5.33 5.33 0 01-.36-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011.05-1.31 3 3 0 011.65-.46 2.55 2.55 0 011.42.43 3.17 3.17 0 011 1.22l-.19 1.94a2.06 2.06 0 00-.18-.9 1.27 1.27 0 00-.54-.56 1.7 1.7 0 00-.85-.19 1.5 1.5 0 00-1.21.51 2.11 2.11 0 00-.43 1.42v1.72a2.07 2.07 0 00.43 1.41 1.52 1.52 0 001.21.49 1.6 1.6 0 00.85-.2 1.27 1.27 0 00.54-.56 2 2 0 00.18-.89l.13 2a2.46 2.46 0 01-.88 1.15 2.4 2.4 0 01-1.45.44 2.93 2.93 0 01-1.66-.46zm3.88-12.47h2.11v12.78h-2.11zM407.54 300.34l-.92-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.26 4.26 0 012.12-.5 3.38 3.38 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.12 2.12 0 00.57 1.59 2.14 2.14 0 001.58.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.37 1.29a5 5 0 01-1.56 1 4.48 4.48 0 01-1.74.36zM416.75 297.53a.73.73 0 00.17.51.62.62 0 00.48.18h.6v2h-1.14a2.12 2.12 0 01-1.64-.63 2.53 2.53 0 01-.59-1.78v-10.38h2.1z" + transform="translate(-234.32 -270.82)"/> + </svg> + </a> + <button class="navbar-toggler shadow-none border-0 text-primary" type="button" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation"> + <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="bi bi-list" viewBox="0 0 16 16"> + <path fill-rule="evenodd" d="M2.5 11.5A.5.5 0 0 1 3 11h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 3h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/> + </svg> + </button> + <div id="header-cart-button" class="d-flex d-none px-1 h-100 align-items-center cursor-pointer text-primary"> + <span class="d-none d-md-inline-block px-1">Handlekorg</span> + <span class="d-inline-block d-md-none px-1"> + <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" fill="currentColor" class="bi bi-basket3" viewBox="0 0 16 16"> + <path d="M5.757 1.071a.5.5 0 0 1 .172.686L3.383 6h9.234L10.07 1.757a.5.5 0 1 1 .858-.514L13.783 6H15.5a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5H.5a.5.5 0 0 1-.5-.5v-1A.5.5 0 0 1 .5 6h1.717L5.07 1.243a.5.5 0 0 1 .686-.172zM3.394 15l-1.48-6h-.97l1.525 6.426a.75.75 0 0 0 .729.574h9.606a.75.75 0 0 0 .73-.574L15.056 9h-.972l-1.479 6h-9.21z"/> + </svg> + </span>(<span id="item-count"></span>) + </div> + <div class="collapse navbar-collapse bg-white px-3" id="navbar"> + <ul class="navbar-nav me-auto text-uppercase"> + <li class="nav-item d-none"> + @if (Context.Request.Path.Value?.StartsWith("/produktar") ?? false) { + <a href="/produktar" class="nav-link active" title="@Localizer["GÃ¥ til /produktar"]" aria-current="page">@Localizer["Produktar"]</a> + } else { + <a href="/produktar" class="nav-link" title="@Localizer["GÃ¥ til /produktar"]">@Localizer["Produktar"]</a> + } + </li> + <li class="nav-item"> + @if (Context.Request.Path.Value?.StartsWith("/leverandørar") ?? false) { + <a href="/leverandørar" class="nav-link active" title="@Localizer["GÃ¥ til /leverandørar"]" aria-current="page">@Localizer["Leverandørar"]</a> + } else { + <a href="/leverandørar" class="nav-link" title="@Localizer["GÃ¥ til /leverandørar"]">@Localizer["Leverandørar"]</a> + } + </li> + <li class="nav-item"> + @if (Context.Request.Path.Value?.StartsWith("/om-oss") ?? false) { + <a href="/om-oss" class="nav-link active" title="@Localizer["GÃ¥ til /om-oss"]" aria-current="page">@Localizer["Om oss"]</a> + } else { + <a href="/om-oss" class="nav-link" title="@Localizer["GÃ¥ til /om-oss"]">@Localizer["Om oss"]</a> + } + </li> + <li class="nav-item"> + <a href="/#kontakt" class="nav-link" title="@Localizer["GÃ¥ til kontaktinformasjon"]">@Localizer["Kontakt oss"]</a> + </li> + @if (User.Identity?.IsAuthenticated ?? false) { + <li class="nav-item"> + <a href="/kontoret" class="nav-link" title="@Localizer["GÃ¥ til kontoret"]"> + Kontoret + </a> + </li> + } + </ul> + </div> +</nav> + +<main class="flex-1" id="body-wrapper"> + + @RenderBody() + +</main> + +<footer> + <div class="container py-5"> + <div class="row"> + <div class="col-sm-6"> + <span class="text-uppercase">© @Options.Value.StoreName</span> + | <a href="/personvern">@Localizer["Personvernerklæring"]</a> + | <a href="/vilkÃ¥r">@Localizer["SalsvilkÃ¥r"]</a> + | <a href="https://www.facebook.com/VinjesvingenHandel">Facebook</a> + </div> + </div> + </div> +</footer> + +<div id="cart-modal" class="modal modal-right" tabindex="-1" role="dialog"> + <div class="modal-dialog modal-dialog-aside" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title">@Localizer["Handlekorg"]</h5> + <button type="button" class="btn-close close" data-bs-dismiss="modal" aria-label="@Localizer["Lukk"]"></button> + </div> + <div class="modal-body"> + <div id="product-list"></div> + </div> + <div class="modal-footer flex-column align-items-end"> + <div id="quote" class="mb-3 mb-md-4"> + <span class="h3">@Localizer["I alt"]: <span id="total"></span></span> + </div> + + <div class="w-100"> + <button type="button" class="btn btn-primary btn-lg submit-cart w-100">@Localizer["GÃ¥ til kassa"]</button> + </div> + </div> + </div> + </div> +</div> + +<script src="~/dist/frontbundle.min.js" asp-append-version="true"></script> +@await RenderSectionAsync("Scripts", required: false) + +</body> +</html> diff --git a/src/Pages/Status.cshtml b/src/Pages/Status.cshtml new file mode 100644 index 0000000..d0e2ad1 --- /dev/null +++ b/src/Pages/Status.cshtml @@ -0,0 +1,136 @@ +@page "{orderReference}" +@using VSH.Data.Enums +@using VSH.Utilities +@using System.Globalization +@using IOL.Helpers +@model VSH.Pages.Status + +@{ + string title; + if (Model.CurrentOrder == default) { + title = "Fant ikkje ordren"; + } else { + title = Model.CurrentOrder.Status switch { + OrderStatus.CANCELLED => "Kansellert bestilling", + OrderStatus.FAILED => "Feila bestilling", + OrderStatus.COMPLETED => "Fullført bestilling", + OrderStatus.AWAITING_INVOICE + or OrderStatus.AWAITING_VIPPS + or OrderStatus.IN_PROGRESS => "Ventar pÃ¥ betaling", + var _ => "Uventa feil" + }; + } + ViewData["Title"] = title; +} +<div class="container py-5"> + @if (Model.CurrentOrder != default) { + <div class="row"> + <div class="col-12 col-md-4"> + <div class="row mb-3"> + <h2>Din bestilling</h2> + <hr> + <p> + <span class="text-bold">Status:</span> + @(title) + </p> + <p> + <span class="text-bold">Betalingsmetode:</span> + @(EnumName.ForPaymentType(Model.CurrentOrder.PaymentType)) + @if (Model.CurrentOrder.PaymentType == OrderPaymentType.INVOICE_BY_EMAIL) { + <small>Du fÃ¥r tilsendt faktura til din e-postadresse</small> + } + </p> + <p> + <span class="text-bold">Referanse:</span> + @Model.CurrentOrder.OrderReference + </p> + <p> + <span class="text-bold">Dato:</span> + @Model.CurrentOrder.Created.ToOsloTimeZone().ToString("dd.MM.yyyy HH:mm", new CultureInfo("nb-NO")) + </p> + + @if (!Model.CurrentOrder.Comment.IsNullOrWhiteSpace()) { + <p> + <span class="text-bold">Øvrig informasjon:</span> + @Model.CurrentOrder.Comment + </p> + } + + </div> + <div class="row"> + <h3>Kontaktinformasjon</h3> + <hr> + <p> + <span class="text-bold">Namn:</span> + @Model.CurrentOrder.ContactInfo.Name + </p> + + @if (!Model.CurrentOrder.ContactInfo.EmailAddress.IsNullOrWhiteSpace()) { + <p> + <span class="text-bold">E-postadresse:</span> + @Model.CurrentOrder.ContactInfo.EmailAddress + </p> + } + + @if (!Model.CurrentOrder.ContactInfo.PhoneNumber.IsNullOrWhiteSpace()) { + <p> + <span class="text-bold">Telefonnummer:</span> + @Model.CurrentOrder.ContactInfo.PhoneNumber + </p> + } + </div> + <div class="row"> + <h3>SpørsmÃ¥l?</h3> + <hr> + <p><a href="/#kontakt">Ta gjerne kontakt</a> hvis du har spørsmÃ¥l vedrørande ordren din.</p> + </div> + </div> + <div class="col-12 col-md-8"> + <div class="row"> + <h2>Produktar</h2> + <hr> + <div class="h-100"> + @foreach (var product in Model.CurrentOrderProducts) { + <div class="border-0 my-3 d-flex align-items-center"> + <a href="@product.DbProdcut.WebPath()"> + <img src="@product.DbProdcut.GetPrimaryImage().WebPath" class="blur-up lazyload w-150px object-fit-contain" alt=""> + </a> + <div class="p-2 w-100"> + <a href="@product.DbProdcut.WebPath()" class="h3">@product.DbProdcut.Name</a> + <div class="d-flex flex-column align-items-end w-100"> + <span>Antall: <span>@product.OrderProduct.NumberOfItems</span></span> + <span class="fs-4"> + Totalt: + <span> + @product.OrderProduct.Total().ToString("N", new NumberFormatInfo { + CurrencyDecimalDigits = 2 + }),- + </span> + </span> + </div> + </div> + </div> + } + </div> + <div class="d-flex float-right flex-column"> + <div class="d-flex flex-column"> + <span class="h2"> + Totalt: @Model.CurrentOrder.Total().ToString("N", new NumberFormatInfo { + CurrencyDecimalDigits = 2 + }),- + </span> + <span> + Av dei MVA: @Model.CurrentOrder.Tax().ToString("N", new NumberFormatInfo { + CurrencyDecimalDigits = 2 + }),- + </span> + </div> + </div> + </div> + </div> + </div> + } else { + <h2>Vi fant ikkje din ordre</h2> + <p>Ver vennleg og <a href="/#kontakt">kontakt oss</a> hvis du meiner dette er ein feil.</p> + } +</div> diff --git a/src/Pages/Status.cshtml.cs b/src/Pages/Status.cshtml.cs new file mode 100644 index 0000000..ed15120 --- /dev/null +++ b/src/Pages/Status.cshtml.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; +using VSH.Data; +using VSH.Data.Database; + +namespace VSH.Pages; + +public class Status : PageModel +{ + private readonly MainDbContext _context; + public Order CurrentOrder { get; private set; } + public List<StatusProduct> CurrentOrderProducts { get; } + + public Status(MainDbContext context) { + _context = context; + CurrentOrderProducts = new List<StatusProduct>(); + } + + public ActionResult OnGet(string orderReference) { + try { + CurrentOrder = _context.Orders.SingleOrDefault(o => o.OrderReference == orderReference); + if (CurrentOrder == default) return Page(); + + foreach (var orderProduct in CurrentOrder.Products) { + var dbProduct = _context.Products.Include(c => c.Category) + .SingleOrDefault(p => p.Id == orderProduct.Id); + if (dbProduct == default) continue; + CurrentOrderProducts.Add(new StatusProduct(dbProduct, orderProduct)); + } + + return Page(); + } catch (Exception e) { + Console.WriteLine(e); + } + + return Redirect("/errors/500"); + } + + public class StatusProduct + { + public StatusProduct(Product dbProdcut, OrderProduct orderProduct) { + DbProdcut = dbProdcut; + OrderProduct = orderProduct; + } + + public Product DbProdcut { get; } + public OrderProduct OrderProduct { get; } + } +}
\ No newline at end of file diff --git a/src/Pages/_ViewImports.cshtml b/src/Pages/_ViewImports.cshtml new file mode 100644 index 0000000..3a327c4 --- /dev/null +++ b/src/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using VSH +@namespace VSH.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/src/Pages/_ViewStart.cshtml b/src/Pages/_ViewStart.cshtml new file mode 100644 index 0000000..45bfaa9 --- /dev/null +++ b/src/Pages/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_PublicLayout"; +} diff --git a/src/Program.cs b/src/Program.cs new file mode 100644 index 0000000..a723a0e --- /dev/null +++ b/src/Program.cs @@ -0,0 +1,44 @@ +using System; +using System.Reflection; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Serilog; + +namespace VSH; + +public static class Program +{ + public static int Main(string[] args) { + var config = new ConfigurationBuilder() + .AddUserSecrets(Assembly.GetExecutingAssembly(), true) + .AddEnvironmentVariables() + .Build(); + + Log.Logger = new LoggerConfiguration() + .Enrich.FromLogContext() + .WriteTo.Console() +#if !DEBUG + .WriteTo.Seq(config.GetValue<string>("SEQ_API_URL"), apiKey: config.GetValue<string>("SEQ_API_KEY")) +#endif + .CreateLogger(); + + try { + Log.Information("Starting web host"); + CreateHostBuilder(args).Build().Run(); + return 0; + } catch (Exception ex) { + Log.Fatal(ex, "Host terminated unexpectedly"); + return 1; + } finally { + Log.CloseAndFlush(); + } + } + + private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) + .UseSerilog() + .ConfigureWebHostDefaults(webBuilder => { + webBuilder.UseKestrel(o => o.AddServerHeader = false); + webBuilder.UseStartup<Startup>(); + }); +} diff --git a/src/Properties/launchSettings.json b/src/Properties/launchSettings.json new file mode 100644 index 0000000..0b6cfb3 --- /dev/null +++ b/src/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "Default": { + "commandName": "Project", + "launchBrowser": false, + "applicationUrl": "https://0.0.0.0:5002;http://0.0.0.0:5001", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/Resources/ConnectingClasses/SharedControllerResources.cs b/src/Resources/ConnectingClasses/SharedControllerResources.cs new file mode 100644 index 0000000..84fbf25 --- /dev/null +++ b/src/Resources/ConnectingClasses/SharedControllerResources.cs @@ -0,0 +1,6 @@ +namespace VSH; + +public class SharedControllerResources +{ + // dummy class for resource file +}
\ No newline at end of file diff --git a/src/Resources/ConnectingClasses/SharedPageResources.cs b/src/Resources/ConnectingClasses/SharedPageResources.cs new file mode 100644 index 0000000..79bac17 --- /dev/null +++ b/src/Resources/ConnectingClasses/SharedPageResources.cs @@ -0,0 +1,6 @@ +namespace VSH; + +public class SharedPageResources +{ + // dummy class for resource file +}
\ No newline at end of file diff --git a/src/Resources/ConnectingClasses/SharedServiceResources.cs b/src/Resources/ConnectingClasses/SharedServiceResources.cs new file mode 100644 index 0000000..e0bd98d --- /dev/null +++ b/src/Resources/ConnectingClasses/SharedServiceResources.cs @@ -0,0 +1,6 @@ +namespace VSH; + +public class SharedServiceResources +{ + // dummy class for resource file +}
\ No newline at end of file diff --git a/src/Resources/SharedControllerResources.en.resx b/src/Resources/SharedControllerResources.en.resx new file mode 100644 index 0000000..6b75a2b --- /dev/null +++ b/src/Resources/SharedControllerResources.en.resx @@ -0,0 +1,47 @@ +<root> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>1.3</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <data name="_Kunne ikke finne produktet" xml:space="preserve"> + <value>Could not find that product</value> + </data> + <data name="_Kunne ikke finne kategorien" xml:space="preserve"> + <value>Could not find that category</value> + </data> + <data name="_En kategori med det navnet finnes allerede" xml:space="preserve"> + <value>A category with that name already exists</value> + </data> + <data name="_Kan ikke slette kategorier som har tilhørende produkter" xml:space="preserve"> + <value>Can not delete categories that contains products</value> + </data> + <data name="_Kan ikke slette kategorien" xml:space="preserve"> + <value>Could not delete the category</value> + </data> + <data name="_Ugyldig skjema" xml:space="preserve"> + <value>Invalid form</value> + </data> + <data name="_Ugyldig brukernavn eller passord" xml:space="preserve"> + <value>Invalid username or password</value> + </data> + <data name="_Navn er påkrevd" xml:space="preserve"> + <value>Name is required</value> + </data> + <data name="_Det nye navnet kan ikke være tomt" xml:space="preserve"> + <value>New name is required</value> + </data> + <data name="_Nytt passord er påkrevd" xml:space="preserve"> + <value>New password is required</value> + </data> + <data name="_Produktet er dessverre utilgjengelig" xml:space="preserve"> + <value>This product is unfortunately not available</value> + </data> +</root>
\ No newline at end of file diff --git a/src/Resources/SharedPageResources.en.resx b/src/Resources/SharedPageResources.en.resx new file mode 100644 index 0000000..0ba582f --- /dev/null +++ b/src/Resources/SharedPageResources.en.resx @@ -0,0 +1,47 @@ +<root> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>1.3</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <data name="_Forsiden" xml:space="preserve"> + <value>Frontpage</value> + </data> + <data name="_Lagre" xml:space="preserve"> + <value>Save</value> + </data> + <data name="_Språk" xml:space="preserve"> + <value>Language</value> + </data> + <data name="_Gå videre" xml:space="preserve"> + <value>Continue</value> + </data> + <data name="_Lukk" xml:space="preserve"> + <value>Close</value> + </data> + <data name="_Handlekurv" xml:space="preserve"> + <value>Cart</value> + </data> + <data name="_Personvernerklæring" xml:space="preserve"> + <value>Privacy policy</value> + </data> + <data name="_Kontakt" xml:space="preserve"> + <value>Contact</value> + </data> + <data name="_Produkter" xml:space="preserve"> + <value>Products</value> + </data> + <data name="_Gå til kontoret" xml:space="preserve"> + <value>Go to the office</value> + </data> + <data name="_I alt" xml:space="preserve"> + <value>In total</value> + </data> +</root>
\ No newline at end of file diff --git a/src/Resources/SharedServiceResources.en.resx b/src/Resources/SharedServiceResources.en.resx new file mode 100644 index 0000000..0db1973 --- /dev/null +++ b/src/Resources/SharedServiceResources.en.resx @@ -0,0 +1,14 @@ +<root> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>1.3</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root>
\ No newline at end of file diff --git a/src/Services/AssetsService.cs b/src/Services/AssetsService.cs new file mode 100644 index 0000000..bf0029a --- /dev/null +++ b/src/Services/AssetsService.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using IOL.Helpers; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using VSH.Data; +using VSH.Data.Static; + +namespace VSH.Services; + +public class AssetsService +{ + private readonly MainDbContext _context; + private readonly ILogger<AssetsService> _logger; + + + public AssetsService(MainDbContext context, ILogger<AssetsService> logger) { + _context = context; + _logger = logger; + } + + public Task RemoveUnusedProductImages() { + try { + _logger.LogDebug("Starting RemoveUnusedProductImages"); + var inUseFileNames = new List<string>(); + + foreach (var productImageList in _context.Products.Select(c => c.Images).AsNoTracking()) { + var defaultFiles = productImageList.Select(image => image.FileName).ToList(); + var smallFiles = defaultFiles.Select(c => c.ExtractFileName() + "-300" + c.ExtractExtension()); + var miniFiles = defaultFiles.Select(c => c.ExtractFileName() + "-150" + c.ExtractExtension()); + inUseFileNames.AddRange(defaultFiles); + inUseFileNames.AddRange(miniFiles); + inUseFileNames.AddRange(smallFiles); + } + + var removedFileCount = 0; + if (inUseFileNames.Any()) { + foreach (var diskFile in Directory.EnumerateFiles(AppPaths.ProductImages.HostPath)) { + if (inUseFileNames.Any(c => c == diskFile)) + continue; + if (File.Exists(diskFile)) + File.Delete(diskFile); + removedFileCount++; + _logger.LogDebug("Deleted " + diskFile); + } + } + + _logger.LogInformation("Removed " + removedFileCount + " unused product images"); + return Task.CompletedTask; + } catch (Exception ex) { + _logger.LogError("Exception removing unused assets: {exception}", ex.Message); + return Task.CompletedTask; + } + } +}
\ No newline at end of file diff --git a/src/Services/CookieService.cs b/src/Services/CookieService.cs new file mode 100644 index 0000000..d73f0b6 --- /dev/null +++ b/src/Services/CookieService.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Globalization; +using VSH.Data.Enums; +using VSH.Data.Miscellaneous; +using VSH.Data.Static; + +namespace VSH.Services; + +public class CookieService +{ + private static Dictionary<string, string> XsrfCookieDescriptions => new() { + { + "en", + "This cookie is only required for submitting forms like the order submit form. The cookie is used to prevent abuse, nothing personal is saved or shared with this cookie." + }, { + "nb", + "Denne informasjonskapselen er bare påkrevd for å sende skjema som for eksempel bestillingsskjema. Informasjonskapselen blir brukt for å forhindre misbruk, ingen persondata blir lagret eller delt med denne informasjonskapselen." + }, + }; + + private static Dictionary<string, string> SessionCookieDescriptions => new() { + { + "en", + "This cookie is only required for keeping you logged in while using this site. The cookie is purely functional and nothing personal is saved or shared with this cookie." + }, { + "nb", + "Denne informasjonskapselen er bare påkrevd for å holde deg logget på imens du bruker denne siden. Informasjonskapselen er bare funksjonell og ingen persondata blir lagret eller delt med denne informasjonskapselen." + }, + }; + + private static Dictionary<string, string> CultureCookieDescriptions => new() { + { + "en", "This cookie is used to keep track of your preffered language, nothing personal is saved or shared with this cookie." + }, { + "nb", + "Denne informasjonskapselen bruker vi for å lagre hvilket språk du vil se siden på, ingen persondata blir lagret eller delt med denne informasjonskapselen." + }, + }; + + public static AppCookie GetCookie(CookieType type) { + var isoCode = CultureInfo.DefaultThreadCurrentCulture?.TwoLetterISOLanguageName ?? Startup.DefaultCulture.TwoLetterISOLanguageName; + return type switch { + CookieType.XSRF => AppCookies.Xsrf with { + Description = XsrfCookieDescriptions[isoCode] + }, + CookieType.SESSION => AppCookies.Session with { + Description = SessionCookieDescriptions[isoCode] + }, + CookieType.CULTURE => AppCookies.Culture with { + Description = CultureCookieDescriptions[isoCode] + }, + _ => default + }; + } +}
\ No newline at end of file diff --git a/src/Services/EmailService.cs b/src/Services/EmailService.cs new file mode 100644 index 0000000..d5098e0 --- /dev/null +++ b/src/Services/EmailService.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace VSH.Services; + +public class EmailService +{ + private readonly string _sendGridApiKey; + private readonly string _fromAddress; + private readonly string _fromName; + private readonly string _replyToAddress; + private readonly ILogger<EmailService> _logger; + + public EmailService(IConfiguration configuration, ILogger<EmailService> logger) { + _sendGridApiKey = configuration.GetValue<string>("SENDGRID_API_KEY"); + _fromAddress = configuration.GetValue<string>("MAIL_FROM_ADDRESS"); + _replyToAddress = configuration.GetValue<string>("MAIL_REPLY_TO_ADDRESS"); + _fromName = configuration.GetValue<string>("MAIL_FROM_NAME"); + _logger = logger; + } + + public async Task<bool> SendEmailAsync( + string subject, + string message, + IEnumerable<string> recipients + ) { + foreach (var recipient in recipients) { + if (!await SendEmailAsync(subject, message, recipient)) { + return false; + } + } + + return true; + } + + public Task<bool> SendEmailAsync( + string subject, + string message, + string recipient + ) { + return Task.FromResult(false); + } +} diff --git a/src/Services/OrderService.cs b/src/Services/OrderService.cs new file mode 100644 index 0000000..21dfdee --- /dev/null +++ b/src/Services/OrderService.cs @@ -0,0 +1,126 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using IOL.Helpers; +using IOL.VippsEcommerce; +using IOL.VippsEcommerce.Models.Api; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Localization; +using VSH.Data; +using VSH.Data.Database; +using VSH.Data.Results; +using VSH.Utilities; + +namespace VSH.Services; + +public class OrderService +{ + private readonly MainDbContext _context; + private readonly IStringLocalizer<SharedServiceResources> _localizer; + private readonly IVippsEcommerceService _vippsService; + private readonly string _vippsMsn; + + public OrderService( + MainDbContext context, + IStringLocalizer<SharedServiceResources> localizer, + IVippsEcommerceService vippsService, + IConfiguration configuration + ) { + _context = context; + _localizer = localizer; + _vippsService = vippsService; + _vippsMsn = configuration.GetValue<string>("VIPPS_MSN"); + } + + public AppValidationResult ValidateOrderProducts(Order payload) { + var validationResult = new AppValidationResult(); + foreach (var product in payload.Products) { + var dbProduct = _context.Products.SingleOrDefault(p => p.Id == product.Id); + if (dbProduct == default || !dbProduct.IsAvailable || !dbProduct.IsVisible) { + var error = new AppValidationResult.ValidationError(product.Id); + error.Errors.Add(string.Format(_localizer["Dette produktet er dessverre ikke tilgjengelig"])); + validationResult.Errors.Add(error); + } else if (dbProduct.Count != -1 && dbProduct.Count < product.NumberOfItems) { + var error = new AppValidationResult.ValidationError(product.Id); + error.Errors.Add(string.Format(_localizer + [ + "Vi har dessverre ikke så mange eksemplarer av dette produktet"])); + validationResult.Errors.Add(error); + } + } + + return validationResult; + } + + public AppValidationResult ValidateOrder(Order payload) { + var validationResult = new AppValidationResult(); + if (payload.ContactInfo != default) { + if (payload.ContactInfo.Name.IsNullOrWhiteSpace()) { + var error = new AppValidationResult.ValidationError(); + error.Errors.Add(_localizer["Navn er påkrevd"]); + validationResult.Errors.Add(error); + } + + if (payload.ContactInfo.EmailAddress.IsNullOrWhiteSpace()) { + var error = new AppValidationResult.ValidationError(); + error.Errors.Add(_localizer["E-postadresse er påkrevd"]); + validationResult.Errors.Add(error); + } else if (!payload.ContactInfo.EmailAddress.IsValidEmailAddress()) { + var error = new AppValidationResult.ValidationError(); + error.Errors.Add(_localizer["E-postadressen er ugyldig"]); + validationResult.Errors.Add(error); + } + + if (payload.ContactInfo.PhoneNumber.IsNullOrWhiteSpace()) { + var error = new AppValidationResult.ValidationError(); + error.Errors.Add(_localizer["Telefonnummer er påkrevd"]); + validationResult.Errors.Add(error); + } else if (!payload.ContactInfo.PhoneNumber.IsValidNorwegianPhoneNumber()) { + var error = new AppValidationResult.ValidationError(); + error.Errors.Add(_localizer["Telefonnummeret er ugyldig"]); + validationResult.Errors.Add(error); + } + } else { + var error = new AppValidationResult.ValidationError(); + error.Errors.Add(_localizer["Kontaktinfo er påkrevd"]); + validationResult.Errors.Add(error); + } + + var productValidationResult = ValidateOrderProducts(payload); + validationResult.Errors.AddRange(productValidationResult.Errors); + + return validationResult; + } + + public async Task<Uri> GetVippsPaymentUrlAsync(Order order, string hostname) { + var totalAmountInOre = order.Products.Sum(c => c.NumberOfItems * c.PriceAtTimeOfOrder) * 100; + + var initiatePaymentRequest = new VippsInitiatePaymentRequest { + CustomerInfo = new TCustomerInfo { + MobileNumber = order.ContactInfo.PhoneNumber + }, + Transaction = new TTransactionInfoInitiate { + Amount = Convert.ToInt32(totalAmountInOre), + OrderId = order.OrderReference, + TimeStamp = DateTime.UtcNow.ToString("o"), + SkipLandingPage = false, + TransactionText = "Bestilling på nett", + UseExplicitCheckoutFlow = false + }, + MerchantInfo = new TMerchantInfo { + FallBack = hostname + "/api/orders/vipps/payment-callback/" + order.OrderReference, + CallbackPrefix = hostname + "/api/orders/vipps/callbacks-for-payment-update", + IsApp = false, + MerchantSerialNumber = _vippsMsn + } + }; + + try { + var response = await _vippsService.InitiatePaymentAsync(initiatePaymentRequest); + return response.Url.IsNullOrWhiteSpace() ? default : new Uri(response.Url); + } catch (Exception e) { + Console.WriteLine(e); + throw; + } + } +}
\ No newline at end of file diff --git a/src/Startup.cs b/src/Startup.cs new file mode 100644 index 0000000..c51a0e7 --- /dev/null +++ b/src/Startup.cs @@ -0,0 +1,169 @@ +using System; +using System.Globalization; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using IOL.VippsEcommerce; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using VSH.BackgroundServices; +using VSH.Data; +using VSH.Data.Miscellaneous; +using VSH.Data.Static; +using VSH.Services; + +namespace VSH; + +public class Startup +{ + private IConfiguration Configuration { get; } + private IWebHostEnvironment Environment { get; } + + public Startup(IConfiguration configuration, IWebHostEnvironment environment) { + Configuration = configuration; + Environment = environment; + } + + // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + private static readonly CultureInfo[] _supportedCultures = { + new("nb"), + new("en") + }; + + public static CultureInfo DefaultCulture { get; private set; } = new("nb"); + + private static readonly Action<RequestLocalizationOptions> _appLocalizationOptions = options => { + options.DefaultRequestCulture = new RequestCulture(DefaultCulture, DefaultCulture); + options.ApplyCurrentCultureToResponseHeaders = false; + options.SupportedCultures = _supportedCultures; + options.SupportedUICultures = _supportedCultures; + /*options.RequestCultureProviders.Insert(0, new CookieRequestCultureProvider { + CookieName = Cookies.Culture.Name, + Options = new RequestLocalizationOptions { + DefaultRequestCulture = new RequestCulture(DefaultCulture, DefaultCulture) + } + } + );*/ + }; + + private static readonly Action<JsonOptions> _jsonSettings = options => { + options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve; + options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; + options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString; + options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; + }; + + private string GetConnectionStringFromEnvironment() { + var host = Configuration.GetValue<string>("DB_HOST"); + var port = Configuration.GetValue<string>("DB_PORT"); + var user = Configuration.GetValue<string>("DB_USER"); + var password = Configuration.GetValue<string>("DB_PASSWORD"); + var database = Configuration.GetValue("DB_NAME", "vsh"); + return $"Server={host};Port={port};Database={database};User Id={user};Password={password}"; + } + + public void ConfigureServices(IServiceCollection services) { + DefaultCulture = new CultureInfo(Configuration["General:DefaultCulture"]); + services.AddDataProtection() + .PersistKeysToFileSystem(new DirectoryInfo(AppPaths.DataProtectionKeys.HostPath)); + + services.Configure(_jsonSettings); + + services.AddCors(); + + services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) + .AddCookie(options => { + options.LoginPath = new PathString("/logginn"); + options.Cookie.Name = AppCookies.Session.Name; + options.Cookie.SameSite = SameSiteMode.Strict; + options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; + }); + + services.AddVippsEcommerceService(o => { + o.ApiUrl = "https://example.org"; + o.PrimarySubscriptionKey = "1234"; + o.ClientSecret = "1234"; + o.ClientId = "1234"; + }); + + services.AddAntiforgery(options => { + options.HeaderName = "XSRF-TOKEN"; + options.FormFieldName = "xsrf"; + options.Cookie.Name = AppCookies.Xsrf.Name; + options.Cookie.SameSite = SameSiteMode.Strict; + options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; + }); + + services.AddDbContext<MainDbContext>(options => { + options.UseNpgsql(GetConnectionStringFromEnvironment(), + builder => { + builder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); + builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), default); + }) + .UseSnakeCaseNamingConvention(); + if (Environment.IsDevelopment()) + options.EnableSensitiveDataLogging(); + }); + + services.Configure(_appLocalizationOptions); + services.AddLocalization(options => { + options.ResourcesPath = "Resources"; + }); + + services.AddScoped<OrderService>(); + services.AddScoped<AssetsService>(); + services.AddSingleton<EmailService>(); + services.AddHostedService<StartupTasksBackgroundService>(); + services.AddHostedService<VippsOrderStatusCheckerBackgroundService>(); + services.Configure<AppSettings.GeneralConfiguration>(Configuration.GetSection(AppSettings.GeneralConfiguration.Name)); + services.AddRazorPages(options => { + options.Conventions.AuthorizeFolder("/kontoret"); + }) + .AddRazorRuntimeCompilation() + .AddJsonOptions(_jsonSettings); + + services.Configure<RouteOptions>(options => { + options.LowercaseUrls = true; + options.LowercaseQueryStrings = true; + }); + services.AddControllers().AddJsonOptions(_jsonSettings); + } + + public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + if (env.IsDevelopment()) { + app.UseDeveloperExceptionPage(); + } else { + app.UseExceptionHandler("/errors/500"); + } + + CultureInfo.DefaultThreadCurrentCulture = DefaultCulture; + CultureInfo.DefaultThreadCurrentUICulture = DefaultCulture; + + app.UseStatusCodePagesWithReExecute("/errors/{0}") + .UseStaticFiles() + .UseRouting() + .UseCors(builder => { + builder.WithOrigins("http://localhost:8080") + .AllowCredentials() + .AllowAnyHeader() + .AllowAnyMethod(); + }) + .UseRequestLocalization(_appLocalizationOptions) + .UseAuthentication() + .UseAuthorization() + .UseEndpoints(endpoints => { + endpoints.MapControllers(); + endpoints.MapRazorPages(); + }); + } +} diff --git a/src/Utilities/ConfigurationExtensions.cs b/src/Utilities/ConfigurationExtensions.cs new file mode 100644 index 0000000..9205567 --- /dev/null +++ b/src/Utilities/ConfigurationExtensions.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.IO; +using Microsoft.Extensions.Configuration; +using VSH.Data.Static; + +namespace VSH.Utilities; + +public static class ConfigurationExtensions +{ + public static string GetVersion(this IConfiguration configuration) { + var versionFilePath = Path.Combine(AppPaths.WwwRoot.HostPath, "version.txt"); + if (!File.Exists(versionFilePath)) + return "unknown-" + configuration.GetValue<string>("ASPNETCORE_ENVIRONMENT"); + var versionText = File.ReadAllText(versionFilePath); + return versionText + "-" + configuration.GetValue<string>("ASPNETCORE_ENVIRONMENT"); + } + + public static IEnumerable<string> GetOrderStatusEmailRecipients(this IConfiguration configuration) { + var orderEmailRecipientsFilePath = + Path.Combine(AppPaths.AppData.HostPath, "settings", "order_email_addresses"); + if (!File.Exists(orderEmailRecipientsFilePath)) + return default; + var fileContent = File.ReadAllText(orderEmailRecipientsFilePath); + return fileContent.Split(";"); + } +}
\ No newline at end of file diff --git a/src/Utilities/EnumName.cs b/src/Utilities/EnumName.cs new file mode 100644 index 0000000..0bd871d --- /dev/null +++ b/src/Utilities/EnumName.cs @@ -0,0 +1,38 @@ +using System; +using VSH.Data.Enums; + +namespace VSH.Utilities; + +public static class EnumName +{ + public static string ForDocumentType(DocumentType type) => type switch { + DocumentType.SALES_TERMS => "Salsvilkår", + DocumentType.CONTACT_PAGE => "Kontaktside", + DocumentType.PRIVACY_POLICY => "Personvernerklæring", + DocumentType.ABOUT_PAGE => "Om oss", + DocumentType.DEALERS_PAGE => "Leverandørar", + _ => throw new ArgumentException("Unknown DocumentType " + type) + }; + + public static string ForOrderStatus(OrderStatus type) => type switch { + OrderStatus.FAILED => "Feila", + OrderStatus.CANCELLED => "Kansellert", + OrderStatus.COMPLETED => "Fullført", + OrderStatus.IN_PROGRESS => "Pågåande", + OrderStatus.AWAITING_VIPPS => "Ventar på vipps", + OrderStatus.AWAITING_INVOICE => "Ventar på faktura", + _ => throw new ArgumentException("Unknown OrderStatus " + type) + }; + + public static string ForPriceSuffix(PriceSuffix type) => type switch { + PriceSuffix.PER => ",-", + PriceSuffix.KILOS => ",- kg", + _ => throw new ArgumentException("Unknown PriceSuffix " + type) + }; + + public static string ForPaymentType(OrderPaymentType type) => type switch { + OrderPaymentType.VIPPS => "Vipps", + OrderPaymentType.INVOICE_BY_EMAIL => "Faktura på mail", + _ => throw new ArgumentException("Unknown OrderPaymentType " + type) + }; +}
\ No newline at end of file diff --git a/src/Utilities/ImageFunctions.cs b/src/Utilities/ImageFunctions.cs new file mode 100644 index 0000000..dd2e07c --- /dev/null +++ b/src/Utilities/ImageFunctions.cs @@ -0,0 +1,61 @@ +using System; +using System.Diagnostics; +using System.IO; +using ImageMagick; +using IOL.Helpers; +using VSH.Data.Static; + +namespace VSH.Utilities; + +public static class ImageFunctions +{ + private static MagickGeometry SmallGeometry => new(300); + private static MagickGeometry MiniGeometry => new(150); + private static MagickGeometry NormalGeometry => new(1280, 720); + + public static void CreateProductImageCollection(FileInfo path) { + try { + using var image = new MagickImage(path); + if (image.Width > NormalGeometry.Width) { + image.Resize(NormalGeometry); + image.Write(path); + } + + Debug.WriteLine(path.Name); + + if (image.Width > SmallGeometry.Width) { + var fileName = Path.Combine(path.DirectoryName ?? AppPaths.ProductImages.HostPath, + path.Name.ExtractFileName() + "-300" + path.Extension); + if (!File.Exists(fileName)) { + image.Resize(SmallGeometry); + image.Write(fileName); + } + } + + if (image.Width > MiniGeometry.Width) { + var fileName = Path.Combine(path.DirectoryName ?? AppPaths.ProductImages.HostPath, + path.Name.ExtractFileName() + "-150" + path.Extension); + if (!File.Exists(fileName)) { + image.Resize(MiniGeometry); + image.Write(fileName); + } + } + } catch (Exception e) { + Console.WriteLine(e); + throw; + } + } + + public static void EnsureNormalOrLessImageResolution(FileInfo path) { + try { + using var image = new MagickImage(path); + if (image.Width <= NormalGeometry.Width) + return; + image.Resize(NormalGeometry); + image.Write(path); + } catch (Exception e) { + Console.WriteLine(e); + throw; + } + } +}
\ No newline at end of file diff --git a/src/VSH.csproj b/src/VSH.csproj new file mode 100644 index 0000000..33e374a --- /dev/null +++ b/src/VSH.csproj @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project Sdk="Microsoft.NET.Sdk.Web"> + <PropertyGroup> + <TargetFramework>net6.0</TargetFramework> + <UserSecretsId>c0ee06d5-7110-4457-8e58-8ccf3857b533</UserSecretsId> + <RuntimeIdentifier>linux-x64</RuntimeIdentifier> + <IsPackable>false</IsPackable> + </PropertyGroup> + <ItemGroup> + <PackageReference Include="EFCore.NamingConventions" Version="6.0.0" /> + <PackageReference Include="IOL.Helpers" Version="2.0.0" /> + <PackageReference Include="IOL.VippsEcommerce" Version="2.0.0" /> + <PackageReference Include="Magick.NET-Q8-x64" Version="9.0.0" /> + <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.1" /> + <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.1"> + <PrivateAssets>all</PrivateAssets> + <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> + </PackageReference> + <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3" /> + <PackageReference Include="Serilog.AspNetCore" Version="4.1.0" /> + <PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" /> + <PackageReference Include="Serilog.Sinks.Seq" Version="5.1.1" /> + </ItemGroup> + <ItemGroup> + <Content Update="wwwroot/styles/**" CopyToPublishDirectory="Never" /> + <Content Update="wwwroot/scripts/**" CopyToPublishDirectory="Never" /> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Update="Resources\SharedPageResources.nb.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>SharedPageResources.nb.Designer.cs</LastGenOutput> + </EmbeddedResource> + <EmbeddedResource Update="Resources\SharedControllerResources.nb.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>SharedControllerResources.nb.Designer.cs</LastGenOutput> + </EmbeddedResource> + <EmbeddedResource Update="Resources\SharedServiceResources.nb.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>SharedServiceResources.nb.Designer.cs</LastGenOutput> + </EmbeddedResource> + </ItemGroup> + <Target Name="MakeAppDataFoler" AfterTargets="Build"> + <MakeDir Directories="$(OutDir)/AppData" Condition="!Exists('$(OutDir)/AppData')" /> + </Target> +</Project> diff --git a/src/appsettings.json b/src/appsettings.json new file mode 100644 index 0000000..6bb8d41 --- /dev/null +++ b/src/appsettings.json @@ -0,0 +1,10 @@ +{ + "General": { + "StoreName": "Vinjesvingen Handel", + "LegalName": "Vinjesvingen Handel AS", + "ShortStoreName": "VSH", + "DefaultCulture": "nn", + "DefaultDescription": "Shopping og detaljhandel i Vinjesvingen", + "GoogleMapsUrl": "https://www.google.com/maps/place/Vinjesvingen+Handel/@59.6219662,7.821985,17z/data=!3m1!4b1!4m5!3m4!1s0x463f3346fe5a04e1:0x459ef21e0d098697!8m2!3d59.6219662!4d7.824179" + } +} diff --git a/src/wwwroot/assets/profile/header.min.new.svg b/src/wwwroot/assets/profile/header.min.new.svg new file mode 100644 index 0000000..505f81c --- /dev/null +++ b/src/wwwroot/assets/profile/header.min.new.svg @@ -0,0 +1,303 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + id="Layer_1" + viewBox="0 0 1283 471.46" + version="1.1"> + <defs + id="defs3930"> + <style + id="style3928">.cls-12,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-8,.cls-9{fill:none;stroke:#ee741e;stroke-miterlimit:10}.cls-2{stroke-width:.93px}.cls-8,.cls-9{stroke-width:.94px}.cls-12,.cls-14,.cls-15{stroke-width:.95px}.cls-16{stroke-width:.98px}.cls-17{stroke-width:1px}.cls-18{fill:#ee741e}</style> + </defs> + <path + class="cls-2" + d="M561.56 286.96l394.6-2.79M561.56 295.34l395.53-.93M235.82 418.65v6.52l155.42 4.65v-6.58l-155.42-4.59zM325.16 396.32l-89.34 22.33M391.24 422.96l89.81-34.55M391.71 429.36l72.59-28.85M464.72 396.32v7.83h63.77v-7l-63.77-.83zM482.91 383.75v8.71M392.17 387.48l88.49.63" + id="path3934" /> + <path + class="cls-2" + d="M351.91 375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12 0 010 .23L378 382.82l-33.5-4.65c-.16 0-.16-.9 0-.93l31.64-5.94" + transform="translate(1.64)" + id="path3936" /> + <path + class="cls-2" + d="M326.56 350.25v46.07h5.06v-2.31l9.83 1.84v3.72l3.72.93 8.38-2.79V379.31" + id="path3938" /> + <path + stroke-width=".89" + stroke-miterlimit="10" + stroke="#ee741e" + fill="none" + d="M340.99 369.79l-9.31-1.86v19.28l9.31 2.54v-19.96z" + id="path3940" /> + <path + class="cls-2" + d="M347.86 367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07 3.47-22.67 12 0 9.4 0 9.4z" + transform="translate(1.64)" + id="path3942" /> + <path + class="cls-2" + d="M352.45 365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63 2.62-17.08 9 0 7.14 0 7.14zM358.43 322.33V340s-25.13-3.72-37.23 7.45l20.47 3.79s17.49-17.82 44.11-4.76" + transform="translate(1.64)" + id="path3944" /> + <path + class="cls-2" + d="M368.82 322.33v19.38" + id="path3946" /> + <path + class="cls-2" + d="M355.63 314.88h13.54a.41.41 0 00.21-.76c-2.2-1.3-7.52-3.45-14.2.76" + transform="translate(1.64)" + id="path3948" /> + <path + class="cls-2" + d="M360.06 315.81l-1.91 6.52h12.06l-1.77-7.45" + id="path3950" /> + <path + class="cls-2" + d="M383.55 380s.53 2.27 4 7.18.67 23.53.67 23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28 1.89 1.57 7.46a108.72 108.72 0 01-.64 13.94l-4.65.78v-20.29c0-5.59-1.86-1.86-8.38 1.86-7.44 7.44-.93 21.4-.93 21.4s-5.58.93-6.51.93c-3.72-17.68 0-25.12 4.65-27s4.66-3.72 4.66-3.72" + transform="translate(1.64)" + id="path3952" /> + <path + class="cls-2" + d="M339.59 306.51l217.78-.93v1.86l-217.78.98v-1.91zM339.59 306.51l92.14-35.37 129.36-.93" + id="path3954" /> + <path + class="cls-2" + d="M562.95 217.16l-1.86 85.62h8.38l-4.16 3.73v5.89h-218.1v-3.98M407.53 370.72v-55.04h38.27l-1.06 55.04h-37.21z" + id="path3956" /> + <path + class="cls-2" + d="M402.41 373.05v-57.37h48.05l-1.34 57.37h-46.71zM547.13 378.17l-151.7-2.79M553.36 312.4v70.5l138.03 3.65M536.22 389.34l151.44 4.65-1.56 2.33 49.96.46-2.16-7.03 18.91.69M535.97 396.32l149.83 4.18.3-4.18" + id="path3958" /> + <path + class="cls-2" + d="M736.06 396.78l10-.46 2.78 9.36-218.46-7.97" + id="path3960" /> + <path + class="cls-2" + d="M748.84 405.68v6.88l-218.46-8.33v-6.52l5.59-1.39.25-6.98 10.91-5.23v-5.94l-18.64 6.42v9.66l-49.3-1.93M617.86 264.63h-19.54v-35.37h19.54v35.37zM639.27 264.63H619.72v-35.37h19.55v35.37zM629.7 229.73v34.43M619.72 240.87h19.08M619.87 252.44l18.93.01M608.3 229.73v34.43M598.32 240.87h19.08M598.32 252.44l19.08.01M591.8 224.61l.93 2.79h51.97l1.08-2.79H591.8zM594.33 227.4v39.52h2.88V227.4M640.87 227.4v39.52h2.88V227.4M591.8 266.92h53.98v2.24l-53.98.53v-2.77zM730.77 261.78h-20.32v-35.36h20.32v35.36zM753.02 261.78H732.7v-35.36h20.32v35.36zM743.07 226.88v34.44M732.7 238.03h19.83M732.85 249.59l19.68.02M720.82 226.88v34.44M710.45 238.03h19.83M710.45 249.59l19.83.02M703.68 221.76l.96 2.8h54.02l1.13-2.8h-56.11zM706.31 224.56v39.51h2.99v-39.51M754.68 224.56v39.51h2.99v-39.51M703.68 264.07h56.11v2.24l-56.11.54v-2.78zM858.65 260.7h-22v-36.42h22v36.42zM882.75 260.7h-22v-36.42h22v36.42zM871.98 224.76v35.46M860.75 236.24h21.48M860.92 248.15l21.31.01M847.88 224.76v35.46M836.65 236.24h21.48M836.65 248.15l21.48.01M829.32 219.49l1.05 2.87h58.49l1.23-2.87h-60.77zM832.16 222.36v40.7h3.25v-40.7M884.55 222.36v40.7h3.24v-40.7M829.32 263.06h60.77v2.31l-60.77.55v-2.86zM735.13 314.88h18.61v41.88h-18.61zM744.43 314.88l.35 41.88M735.13 325.28h18.61M735.13 335.31h18.61M735.13 345.13h18.61M755.6 314.88h18.61v41.88H755.6zM764.91 314.88l.35 41.88M755.6 325.28h18.62M755.6 335.31h18.62M755.6 345.13h18.62" + id="path3962" /> + <path + class="cls-2" + d="M732.34 313.02h44.67v45.6h-44.67zM596.23 314.75h16.39v38.89h-16.39zM604.43 314.75l.3 38.89M596.23 324.41h16.39M596.23 333.72h16.39M596.23 342.84h16.39M614.26 314.75h16.39v38.89h-16.39zM622.46 314.75l.3 38.89M614.26 324.41h16.39M614.26 333.72h16.39M614.26 342.84h16.39" + id="path3964" /> + <path + class="cls-2" + d="M594.6 313.02h37.69v42.35H594.6zM855.29 317.67h19.63v41.88h-19.63zM865.1 317.67l.36 41.89M855.29 328.08h19.62M855.29 338.11h19.62M855.29 347.92h19.62M876.87 317.67h19.63v41.88h-19.63zM886.69 317.67l.36 41.89M876.87 328.08h19.63M876.87 338.11h19.63M876.87 347.92h19.63" + id="path3966" /> + <path + class="cls-2" + d="M853.32 315.81h45.14v45.6h-45.14zM696.97 313.95h22.34v49.33h-22.34z" + id="path3968" /> + <path + class="cls-2" + d="M692.32 310.23h31.64v67.94h-31.64zM692.32 378.17h31.64v8.38h-31.64zM695.06 386.55l-3.67 4.78 27.92-.13-1.63-4.65M730.47 306.51h13.03v4.65h-13.03z" + id="path3970" /> + <circle + class="cls-2" + cx="722.1" + cy="340.01" + r=".93" + id="circle3972" /> + <path + class="cls-2" + d="m 720.46,342.8 v 1.87 c 0,0.51362 -0.41638,0.93 -0.93,0.93 h -4.65 l 0.0998,-0.94 H 720.46" + id="path3974" + transform="translate(1.64)" + style="fill:none;stroke:#ee741e;stroke-width:0.93000001px;stroke-miterlimit:10"/> + <path + class="cls-2" + d="M688.65 386.47v-79.96h39.27v82.43" + id="path3976" /> + <path + class="cls-2" + d="M751.3 373.52h14.34a.09.09 0 01.08.14c-.9 1.08-6.79 7.51-14.46-.05a.05.05 0 01.04-.09z" + transform="translate(1.64)" + id="path3978" /> + <path + class="cls-2" + d="M765.83 373.52s.23 1.86-.7 18.61c-8.37 4.65-14-1.69-14-1.69v-16.92" + transform="translate(1.64)" + id="path3980" /> + <path + class="cls-2" + d="M385.26 346.49v24.91M345.17 351.18v48.86" + id="path3982" /> + <path + class="cls-2" + d="M749.31 185.52L904.73 179l79.11 14.89L816 199.48l-294.52 8.37 52-16.7 157.81-4.6" + transform="translate(1.64)" + id="path3984" /> + <path + stroke-width="1.03" + stroke-miterlimit="10" + stroke="#ee741e" + fill="none" + d="M732.8 156.42l17.02.25 1.13 32.57H732.8v-32.82z" + id="path3986" /> + <path + class="cls-2" + d="M526.66 210.65v4.73l458.82-14.08v-4.27l-458.82 13.62z" + id="path3988" /> + <path + class="cls-2" + d="M961.16 202.04l24.32 5.81 6.52-13.02-9.64-1.52M522.93 207.85v8.95l3.73 1.57v4.55l18.94-7.53M569.47 302.78l387.16-.93-1.86-99.58" + id="path3990" /> + <path + class="cls-2" + d="M947.54 301.85c.39.93-.38 94.93-.38 94.93l-182-4.65" + transform="translate(1.64)" + id="path3992" /> + <path + class="cls-2" + d="M939.88 396.78l.93 13.03-165.11-3.43M956.69 288.36l103.93 27.45-2.99 8.6-101.13-28.37M1028.18 316.74l6.63 89.35-49.33 1.78M1031.15 405.84v10.14M562.84 222.36l391.86-9.53M561.56 275.79l394.07-2.47M562.68 229.73l31.45-.47M643.75 229.26l62.99-.93M757.67 226.88l73.91-2.12M887.79 224.28l66.91-1.92M562.68 239.03l31.45-.46M643.75 238.57l62.99-.93M757.67 236.19l73.91-2.12M887.79 233.59l66.91-1.92M562.68 250.2l31.45-.46M643.75 249.74l62.99-.94M757.67 247.36l73.91-2.13M887.79 244.76l66.91-1.92M562.68 260.44l31.45-.47M643.75 259.97l62.99-.93M757.67 257.6l73.91-2.13M887.79 254.99l66.91-1.91" + id="path3994" /> + <path + stroke-width=".92" + stroke-miterlimit="10" + stroke="#ee741e" + fill="none" + d="M561.75 268.81l30.52-.46M645.32 268.35l184.27-2.79" + id="path3996" /> + <path + stroke-width=".91" + stroke-miterlimit="10" + stroke="#ee741e" + fill="none" + d="M890.09 263.37l64.61-1.92" + id="path3998" /> + <path + class="cls-2" + d="M574.06 302.78v80.62M580.32 302.78v80.47M587.43 302.74v80.66M559.84 312.56v70.69M566.96 305.11v78.29M634.55 302.78l.06 82.37M640.81 302.78v82.37M647.93 302.74v82.41M655.03 302.78v83.3M661.29 302.78v83.3M668.4 302.74v83.34M674.57 302.78v83.3M680.83 302.78v83.3M594.53 355.38v28.84M600.79 355.38v28.78M607.91 355.37v28.85M615.01 355.38v28.84M621.27 355.38v28.78M628.1 355.37v29.78M594.53 302.75v9.81M600.79 302.75v9.79M607.91 302.74v9.82M615.01 302.75v9.81M621.27 302.75v9.79M628.38 302.74v9.82M802.07 301.86v90.73" + id="path4000" /> + <path + class="cls-8" + d="M808.33 301.86v91.49M815.45 301.81v91.72M822.55 301.86v91.67" + id="path4002" /> + <path + class="cls-9" + d="M828.81 301.86v91.67" + id="path4004" /> + <path + class="cls-8" + d="M835.92 301.81v91.72" + id="path4006" /> + <path + stroke-width=".94" + stroke-miterlimit="10" + stroke="#ee741e" + fill="none" + d="M842.09 301.86v91.67" + id="path4008" /> + <path + class="cls-9" + d="M848.35 301.86v91.67" + id="path4010" /> + <path + class="cls-2" + d="M855.47 301.81v13.54M780.67 302.32v90.27M787.86 302.32v90.11M794.97 302.32v90.27M755.54 358.16v14.89M762.73 358.18v14.87M769.84 359.09v32.57M775.08 359.11v33.48M734.14 359.09v30.71M741.33 359.09v30.66M748.44 358.16v31.64M757.4 302.32v10.24M764.59 302.32v10.24M771.71 302.62v10.57M736 302.62v3.42M743.19 302.62v4.35M750.3 302.32v10.26M882.11 301.82v13.53M888.37 301.82v13.5M895.49 301.81v13.54M902.59 301.86v93.53M908.85 301.86v93.35M915.96 301.81v93.58M922.13 301.86v94.46M928.39 301.86v94.28M935.51 301.81v94.51M943.88 301.81v94.51M861.64 301.96v13.39M867.9 301.96v13.36M875.01 301.95v13.4" + id="path4012" /> + <path + stroke-width=".95" + stroke-miterlimit="10" + stroke="#ee741e" + fill="none" + d="M855.47 360.95v33.51" + id="path4014" /> + <path + class="cls-12" + d="M882.11 361.9v33.49" + id="path4016" /> + <path + stroke-width=".95" + stroke-miterlimit="10" + stroke="#ee741e" + fill="none" + d="M888.37 361.88v33.45" + id="path4018" /> + <path + class="cls-12" + d="M895.49 361.88v33.51" + id="path4020" /> + <path + class="cls-14" + d="M861.64 360.97v33.49M867.9 360.97v33.42M875.01 360.95v33.51" + id="path4022" /> + <path + class="cls-2" + d="M516.82 364.18v-7.39s3.72-4.71 7.45-4.71 6.51 2.79 5.58 4.66-.93 7.44-.93 7.44a15.35 15.35 0 01-12.1 0z" + transform="translate(1.64)" + id="path4024" /> + <path + class="cls-2" + d="M516.82 365.42V377s6.52 2.09 12.1.23v-13M523.43 363s2.7.3 2.7-.63-1.68-2.49-2.7-1.71 0 2.34 0 2.34z" + transform="translate(1.64)" + id="path4026" /> + <path + class="cls-15" + d="M407.53 358.53h37.44M374.65 313.02v29.24M382.56 312.4v32.03M390.91 312.56v58.9M399.29 312.56v58.9" + id="path4028" /> + <path + class="cls-2" + d="M454.99 312.09l-1.72 63.75M463.37 313.02l-1.73 63.75" + id="path4030" /> + <path + class="cls-16" + d="M480.12 313.02l-1.72 63.75M471.75 313.02l-1.73 63.75M489.43 313.02l-1.73 63.75" + id="path4032" /> + <path + class="cls-17" + d="M497.81 312.56l-1.73 65.14M514.56 312.56l-1.73 65.14M506.18 312.56l-1.73 65.14" + id="path4034" /> + <path + class="cls-2" + d="M521.7 312.4v41.24M530.38 312.4l-.5 40.88M537.35 312.4l-1.13 65.3M545.89 312.09l-1.71 66.02M552.01 312.4v70.85l1.99-.33M960.96 297.29l1.25 87.86M975.68 301.42l-.44 93.04M990.45 305.56v102.31M1004.09 309.3l1.87 98.19M1016.51 313.01l3.41 94.01" + id="path4036" /> + <path + class="cls-2" + d="M946 414.88q-3.35-10.53-6.36-21.17c4.91 5.55 5.88 13.66 10.36 19.56l-3.44-19.6a3.29 3.29 0 01.27-2.59c1.35 1.32 1.7 3.33 2.06 5.18a82.64 82.64 0 004.21 14.63 3 3 0 001.51 1.94c1.26-7.83-.92-15.83-.32-23.74.55 7.4 1.13 14.89 3.38 22a6.86 6.86 0 00.91-2.43l3-12.65a142 142 0 01-1.91 16.43l5.72-13c.82 4.36-1.47 8.78-1.09 13.21 1.13-1 1.53-2.57 2-4a25.27 25.27 0 014.37-8L967.14 415q4.1-5.27 8.52-10.26c.77 3.36-2 6.57-2 10l6.72-7.18c.75 1.66-.51 3.5-.8 5.3a1.58 1.58 0 000 .78c.35.94 1.73.7 2.68.35a13 13 0 016.58-.85c1.41.23 2.76.77 4.16 1.05a5.59 5.59 0 004.16-.49M944.75 412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73 1.14-.71 1.85l.08 2.86c0 .54 0 1.17-.48 1.45a1.19 1.19 0 01-.79.1 6.29 6.29 0 01-1.59-.66 2.57 2.57 0 00-1.66-.32 1.12 1.12 0 00-.9 1.26 1.54 1.54 0 001.14.86 14.76 14.76 0 005.18.22c-1.48.42-3.07.25-4.56.61a30.28 30.28 0 00-2.93 1.09c-2.94 1-6.17.74-9.27.44" + transform="translate(1.64)" + id="path4038" /> + <path + class="cls-2" + d="M947.83 414.31a33.48 33.48 0 01-1.49-6.59l-1.42-9.13c.32 0 .56.29.73.58a25.08 25.08 0 012.5 5.16c.41 1.35.59 2.77 1 4.11.54 1.66 1.48 3.2 1.73 4.93.29-5.67.6-11.35 1.38-17q1.37 5.67 2.47 11.4c.35 1.82.73 3.74 2 5.1 2-4.4 2.17-9.35 2.35-14.17.29 2.29.2 4.62.33 6.92a14.84 14.84 0 001.68 6.66 27.13 27.13 0 003.15-9.25l-.47 7.9a9.64 9.64 0 00.09 2.63 3.53 3.53 0 001.77-1.76c1.25-2.22 2-4.8 3.77-6.6a59.09 59.09 0 00-1.52 9.25 6.7 6.7 0 002-2.44q1.43-2.43 2.82-4.87a55.44 55.44 0 01-1 7.48M977.47 408.1a30.9 30.9 0 004.12-7.81c.46.54.94 1.06 1.45 1.55a2.82 2.82 0 001.11.74 1.67 1.67 0 001.89-1.21 2.37 2.37 0 00-.73-2.25 4.14 4.14 0 00-2.23-1 5.93 5.93 0 002.69-1.92 2 2 0 00-.55-2.91 2.22 2.22 0 00-2.24.53 4.05 4.05 0 00-1.4 2.76 3.16 3.16 0 00-1.69-1.44 2.62 2.62 0 00-2.58 1.51 2.39 2.39 0 00-.41 1.36 2 2 0 001.59 1.59 5.74 5.74 0 002.4-.14" + transform="translate(1.64)" + id="path4040" /> + <path + class="cls-2" + d="M971.64 406.82a43.28 43.28 0 003.46-8.65 4.59 4.59 0 01.75-1.93c.22-.26.49-.46.72-.7a2.81 2.81 0 00.78-2 1.32 1.32 0 00-.14-.65c-.4-.65-1.4-.42-2 0a5.88 5.88 0 00-2 2.5 3.57 3.57 0 00-2.72-1.69 1.63 1.63 0 00-1.62.65c-.39.71.16 1.59.81 2.07a4.73 4.73 0 003.82.81" + transform="translate(1.64)" + id="path4042" /> + <path + class="cls-2" + d="M963.59 401.9c.53-2.47 2.15-4.58 2.73-7a22.71 22.71 0 01.71-3.17c.31-.76.83-1.57.56-2.35a1.6 1.6 0 00-2.39-.56 2.69 2.69 0 00-.88 2.57 2.07 2.07 0 00-2.62-.2 1.6 1.6 0 000 2.46c.83.56 1.94.07 2.82-.42l3.11-1.75a4.1 4.1 0 011.33-.56 1.39 1.39 0 011.31.43c.54.7 0 1.71-.7 2.25a3 3 0 01-2 .72A1.76 1.76 0 01966 393M959 400.58l.28-10a2.13 2.13 0 002.34-1.35 6.17 6.17 0 00.29-2.9 2.41 2.41 0 00-.22-1 .83.83 0 00-.86-.46 1.07 1.07 0 00-.53.41 5.66 5.66 0 00-.66 3.71 6.35 6.35 0 00-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81 0 00-.13.63 6 6 0 001.75 3.57 1.37 1.37 0 00-1.49-1.16 2.6 2.6 0 00-1.75 1.07 1 1 0 00-.27.94 1 1 0 00.73.48 6.5 6.5 0 003.19 0M749.35 407.26q-1.61-3.75-2.83-7.64a17.35 17.35 0 012.34 6.77c.72-2.11.18-4.69 1.58-6.43l.29 7.35a19.69 19.69 0 013-5.28 6.47 6.47 0 01-1.31 2.32 3.32 3.32 0 00-.77 2.49 27.28 27.28 0 015.82-2.08l-1.28 2.39a4.22 4.22 0 011.4-1.64 1.47 1.47 0 012 .31c.11.18.16.38.28.55.4.59 1.31.48 1.93.13a6.34 6.34 0 011.85-1c.89-.18 1.75.37 2.66.49 1.25.18 2.51-.47 3.77-.31.76.1 1.46.49 2.22.65 1.93.39 3.9-.78 5.86-.55a19.88 19.88 0 012.71.77 14.72 14.72 0 003 .38l5.11.29" + transform="translate(1.64)" + id="path4044" /> + <path + d="M683 282.77h60.29a.18.18 0 01.18.18v10.11a5.4 5.4 0 01-5.4 5.4H677.5a.18.18 0 01-.18-.18v-9.8a5.71 5.71 0 015.68-5.71z" + stroke-width="1.4" + stroke="#ed7320" + stroke-miterlimit="10" + fill="#fff" + id="path4094" /> + <path + class="cls-18" + d="M678.29 288.52h.76l1 3.19 1-3.19h.76l-1.45 4.39h-.61zM682.29 288.52h.71v.72h-.72zm0 1.26h.71v3.13h-.72zM683.87 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM686.91 293.5h.27a.2.2 0 00.15-.06.24.24 0 000-.18v-3.48h.73v3.58a.88.88 0 01-.2.61.74.74 0 01-.57.22h-.43zm.47-5h.73v.72h-.73zM689.55 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.78 1.78 0 01.16-.8 1.17 1.17 0 01.46-.5 1.54 1.54 0 01.73-.17 1.19 1.19 0 01.69.2 1.3 1.3 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.14v-.53h1.47a1 1 0 00-.18-.52.53.53 0 00-.42-.18.61.61 0 00-.5.21.84.84 0 00-.18.58v.4a.75.75 0 00.19.55.78.78 0 00.55.19 1.09 1.09 0 00.35-.07 1.08 1.08 0 00.31-.19l.48.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM692.93 292.91a2.36 2.36 0 01-.47-.16 1.6 1.6 0 01-.4-.25l.43-.54a1.89 1.89 0 00.49.25 1.46 1.46 0 00.49.09 1.09 1.09 0 00.5-.09.28.28 0 00.17-.26.24.24 0 00-.08-.19.4.4 0 00-.22-.09l-.36-.05h-.21a2.82 2.82 0 01-.54-.11.68.68 0 01-.36-.25.88.88 0 01-.14-.53 1 1 0 01.14-.54 1 1 0 01.42-.34 2 2 0 01.69-.11 1.83 1.83 0 01.47 0 2.23 2.23 0 01.44.13 3.11 3.11 0 01.4.22l-.44.53a1.58 1.58 0 00-.44-.2 1.39 1.39 0 00-.44-.07 1 1 0 00-.43.08.27.27 0 00-.15.24.19.19 0 00.08.16.44.44 0 00.21.07l.35.05h.14a2.66 2.66 0 01.58.1.77.77 0 01.39.26.89.89 0 01.16.58 1 1 0 01-.15.56.88.88 0 01-.45.34 2 2 0 01-.73.12 3.1 3.1 0 01-.54 0zM697.25 289.78h.75l-1.18 3.13h-.53l-1.18-3.13h.74l.7 2.1zM698.51 288.52h.72v.72h-.72zm0 1.26h.72v3.13h-.72zM700.09 289.78h.72v3.13h-.72zM702 291a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.84.84 0 01.5-.15 1 1 0 01.78.33 1.44 1.44 0 01.28.95v1.9H702zM704 292.81a1 1 0 01-.37-.45 1.88 1.88 0 01-.12-.71v-.6a1.94 1.94 0 01.12-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1 1 0 01.35.42l-.06.67a.59.59 0 00-.07-.31.37.37 0 00-.18-.19.62.62 0 00-.71.1.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.62.62 0 00.71.1.41.41 0 00.18-.19.62.62 0 00.07-.31v.69a.82.82 0 01-.8.55 1.07 1.07 0 01-.54-.16zm0 1.25a1.1 1.1 0 01-.45-.37l.49-.45a.71.71 0 00.27.22.8.8 0 00.33.08.69.69 0 00.49-.17.61.61 0 00.18-.47v-3.12h.69v3a1.53 1.53 0 01-.16.74 1.12 1.12 0 01-.47.47 1.6 1.6 0 01-.75.16 1.51 1.51 0 01-.62-.09zM707.45 292.8a1.14 1.14 0 01-.49-.48 1.65 1.65 0 01-.16-.77v-.35a1.78 1.78 0 01.16-.8 1.12 1.12 0 01.46-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.69.2 1.29 1.29 0 01.43.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a.9.9 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.89.89 0 00-.17.58v.4a.75.75 0 00.19.55.77.77 0 00.54.19 1.15 1.15 0 00.36-.07 1.23 1.23 0 00.31-.19l.47.44a1.73 1.73 0 01-.54.35 1.53 1.53 0 01-.6.12 1.57 1.57 0 01-.75-.19zM710.21 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM718.72 288.52h.73v4.39h-.73zm.39 1.88h2.5v.69h-2.5zm2.07-1.88h.72v4.39h-.72zM723 292.72a.92.92 0 01-.27-.73.88.88 0 01.27-.7 1.25 1.25 0 01.82-.23h.84v.56h-.88a.47.47 0 00-.32.09.32.32 0 00-.11.28.33.33 0 00.14.29.76.76 0 00.42.1 1.29 1.29 0 00.51-.08.25.25 0 00.17-.23l.06.44a.49.49 0 01-.18.25.75.75 0 01-.31.15 1.6 1.6 0 01-.39 0 1.17 1.17 0 01-.77-.19zm1.63-1.8a.49.49 0 00-.16-.4.6.6 0 00-.44-.15 1 1 0 00-.35.06 1.07 1.07 0 00-.32.16l-.48-.41a1.21 1.21 0 01.48-.33 1.81 1.81 0 01.67-.12 1.55 1.55 0 01.68.14 1 1 0 01.44.4 1.22 1.22 0 01.15.63v2h-.67zM726.16 289.78h.73v3.13h-.73zM728 291a.6.6 0 00-.16-.43.54.54 0 00-.43-.16.5.5 0 00-.55.55l-.07-.65a1.24 1.24 0 01.36-.44.9.9 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.28.95v1.9H728zM730 292.81a.93.93 0 01-.37-.45 1.87 1.87 0 01-.13-.71v-.6a1.93 1.93 0 01.13-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1.13 1.13 0 01.35.42l-.07.67a.71.71 0 00-.06-.31.37.37 0 00-.18-.19.56.56 0 00-.3-.07.51.51 0 00-.41.17.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.51.51 0 00.41.17.56.56 0 00.3-.07.41.41 0 00.18-.19.75.75 0 00.06-.31v.69a1 1 0 01-.3.4.84.84 0 01-.5.15 1.07 1.07 0 01-.53-.16zm1.33-4.29h.73v4.39h-.73zM733.52 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.93 1.93 0 01.16-.8 1.14 1.14 0 01.47-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.68.2 1.24 1.24 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a1 1 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.84.84 0 00-.18.58v.4a.76.76 0 00.2.55.77.77 0 00.54.19 1 1 0 00.35-.07 1.29 1.29 0 00.32-.19l.47.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM737 292a.24.24 0 00.06.18.21.21 0 00.16.06h.22v.69h-.4a.73.73 0 01-.56-.21.86.86 0 01-.2-.62v-3.57h.72z" + transform="translate(1.64)" + id="path4096" /> + <path + d="M720.79 282.77c-.18.63-.55 1.78-1.29 3.67-1.24 3.19-3 5.09-2.47 7.14s2 3 4.82 3.84a45.51 45.51 0 004.73 1.05l-.74-.13" + stroke="#ed7320" + stroke-width=".93" + stroke-miterlimit="10" + fill="none" + id="path4098" /> + <rect + style="fill:#ffffff" + id="rect4643" + width="49.513657" + height="86.249596" + x="117.39529" + y="36.21896" /> +</svg> diff --git a/src/wwwroot/assets/profile/header.min.svg b/src/wwwroot/assets/profile/header.min.svg new file mode 100644 index 0000000..a8f13d2 --- /dev/null +++ b/src/wwwroot/assets/profile/header.min.svg @@ -0,0 +1 @@ +<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1283 471.46"><defs><style>.cls-12,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-8,.cls-9{fill:none;stroke:#ee741e;stroke-miterlimit:10}.cls-2{stroke-width:.93px}.cls-8,.cls-9{stroke-width:.94px}.cls-12,.cls-14,.cls-15{stroke-width:.95px}.cls-16{stroke-width:.98px}.cls-17{stroke-width:1px}.cls-18{fill:#ee741e}</style></defs><path fill="#fff" d="M0 0h1283v471.46H0z"/><path class="cls-2" d="M561.56 286.96l394.6-2.79M561.56 295.34l395.53-.93M235.82 418.65v6.52l155.42 4.65v-6.58l-155.42-4.59zM325.16 396.32l-89.34 22.33M391.24 422.96l89.81-34.55M391.71 429.36l72.59-28.85M464.72 396.32v7.83h63.77v-7l-63.77-.83zM482.91 383.75v8.71M392.17 387.48l88.49.63"/><path class="cls-2" d="M351.91 375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12 0 010 .23L378 382.82l-33.5-4.65c-.16 0-.16-.9 0-.93l31.64-5.94" transform="translate(1.64)"/><path class="cls-2" d="M326.56 350.25v46.07h5.06v-2.31l9.83 1.84v3.72l3.72.93 8.38-2.79V379.31"/><path stroke-width=".89" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M340.99 369.79l-9.31-1.86v19.28l9.31 2.54v-19.96z"/><path class="cls-2" d="M347.86 367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07 3.47-22.67 12 0 9.4 0 9.4z" transform="translate(1.64)"/><path class="cls-2" d="M352.45 365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63 2.62-17.08 9 0 7.14 0 7.14zM358.43 322.33V340s-25.13-3.72-37.23 7.45l20.47 3.79s17.49-17.82 44.11-4.76" transform="translate(1.64)"/><path class="cls-2" d="M368.82 322.33v19.38"/><path class="cls-2" d="M355.63 314.88h13.54a.41.41 0 00.21-.76c-2.2-1.3-7.52-3.45-14.2.76" transform="translate(1.64)"/><path class="cls-2" d="M360.06 315.81l-1.91 6.52h12.06l-1.77-7.45"/><path class="cls-2" d="M383.55 380s.53 2.27 4 7.18.67 23.53.67 23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28 1.89 1.57 7.46a108.72 108.72 0 01-.64 13.94l-4.65.78v-20.29c0-5.59-1.86-1.86-8.38 1.86-7.44 7.44-.93 21.4-.93 21.4s-5.58.93-6.51.93c-3.72-17.68 0-25.12 4.65-27s4.66-3.72 4.66-3.72" transform="translate(1.64)"/><path class="cls-2" d="M339.59 306.51l217.78-.93v1.86l-217.78.98v-1.91zM339.59 306.51l92.14-35.37 129.36-.93"/><path class="cls-2" d="M562.95 217.16l-1.86 85.62h8.38l-4.16 3.73v5.89h-218.1v-3.98M407.53 370.72v-55.04h38.27l-1.06 55.04h-37.21z"/><path class="cls-2" d="M402.41 373.05v-57.37h48.05l-1.34 57.37h-46.71zM547.13 378.17l-151.7-2.79M553.36 312.4v70.5l138.03 3.65M536.22 389.34l151.44 4.65-1.56 2.33 49.96.46-2.16-7.03 18.91.69M535.97 396.32l149.83 4.18.3-4.18"/><path class="cls-2" d="M736.06 396.78l10-.46 2.78 9.36-218.46-7.97"/><path class="cls-2" d="M748.84 405.68v6.88l-218.46-8.33v-6.52l5.59-1.39.25-6.98 10.91-5.23v-5.94l-18.64 6.42v9.66l-49.3-1.93M617.86 264.63h-19.54v-35.37h19.54v35.37zM639.27 264.63H619.72v-35.37h19.55v35.37zM629.7 229.73v34.43M619.72 240.87h19.08M619.87 252.44l18.93.01M608.3 229.73v34.43M598.32 240.87h19.08M598.32 252.44l19.08.01M591.8 224.61l.93 2.79h51.97l1.08-2.79H591.8zM594.33 227.4v39.52h2.88V227.4M640.87 227.4v39.52h2.88V227.4M591.8 266.92h53.98v2.24l-53.98.53v-2.77zM730.77 261.78h-20.32v-35.36h20.32v35.36zM753.02 261.78H732.7v-35.36h20.32v35.36zM743.07 226.88v34.44M732.7 238.03h19.83M732.85 249.59l19.68.02M720.82 226.88v34.44M710.45 238.03h19.83M710.45 249.59l19.83.02M703.68 221.76l.96 2.8h54.02l1.13-2.8h-56.11zM706.31 224.56v39.51h2.99v-39.51M754.68 224.56v39.51h2.99v-39.51M703.68 264.07h56.11v2.24l-56.11.54v-2.78zM858.65 260.7h-22v-36.42h22v36.42zM882.75 260.7h-22v-36.42h22v36.42zM871.98 224.76v35.46M860.75 236.24h21.48M860.92 248.15l21.31.01M847.88 224.76v35.46M836.65 236.24h21.48M836.65 248.15l21.48.01M829.32 219.49l1.05 2.87h58.49l1.23-2.87h-60.77zM832.16 222.36v40.7h3.25v-40.7M884.55 222.36v40.7h3.24v-40.7M829.32 263.06h60.77v2.31l-60.77.55v-2.86zM735.13 314.88h18.61v41.88h-18.61zM744.43 314.88l.35 41.88M735.13 325.28h18.61M735.13 335.31h18.61M735.13 345.13h18.61M755.6 314.88h18.61v41.88H755.6zM764.91 314.88l.35 41.88M755.6 325.28h18.62M755.6 335.31h18.62M755.6 345.13h18.62"/><path class="cls-2" d="M732.34 313.02h44.67v45.6h-44.67zM596.23 314.75h16.39v38.89h-16.39zM604.43 314.75l.3 38.89M596.23 324.41h16.39M596.23 333.72h16.39M596.23 342.84h16.39M614.26 314.75h16.39v38.89h-16.39zM622.46 314.75l.3 38.89M614.26 324.41h16.39M614.26 333.72h16.39M614.26 342.84h16.39"/><path class="cls-2" d="M594.6 313.02h37.69v42.35H594.6zM855.29 317.67h19.63v41.88h-19.63zM865.1 317.67l.36 41.89M855.29 328.08h19.62M855.29 338.11h19.62M855.29 347.92h19.62M876.87 317.67h19.63v41.88h-19.63zM886.69 317.67l.36 41.89M876.87 328.08h19.63M876.87 338.11h19.63M876.87 347.92h19.63"/><path class="cls-2" d="M853.32 315.81h45.14v45.6h-45.14zM696.97 313.95h22.34v49.33h-22.34z"/><path class="cls-2" d="M692.32 310.23h31.64v67.94h-31.64zM692.32 378.17h31.64v8.38h-31.64zM695.06 386.55l-3.67 4.78 27.92-.13-1.63-4.65M730.47 306.51h13.03v4.65h-13.03z"/><circle class="cls-2" cx="722.1" cy="340.01" r=".93"/><path class="cls-2" d="M720.46 342.8v1.87a.93.93 0 01-.93.93h-4.65v-.94h5.58" transform="translate(1.64)"/><path class="cls-2" d="M688.65 386.47v-79.96h39.27v82.43"/><path class="cls-2" d="M751.3 373.52h14.34a.09.09 0 01.08.14c-.9 1.08-6.79 7.51-14.46-.05a.05.05 0 01.04-.09z" transform="translate(1.64)"/><path class="cls-2" d="M765.83 373.52s.23 1.86-.7 18.61c-8.37 4.65-14-1.69-14-1.69v-16.92" transform="translate(1.64)"/><path class="cls-2" d="M385.26 346.49v24.91M345.17 351.18v48.86"/><path class="cls-2" d="M749.31 185.52L904.73 179l79.11 14.89L816 199.48l-294.52 8.37 52-16.7 157.81-4.6" transform="translate(1.64)"/><path stroke-width="1.03" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M732.8 156.42l17.02.25 1.13 32.57H732.8v-32.82z"/><path class="cls-2" d="M526.66 210.65v4.73l458.82-14.08v-4.27l-458.82 13.62z"/><path class="cls-2" d="M961.16 202.04l24.32 5.81 6.52-13.02-9.64-1.52M522.93 207.85v8.95l3.73 1.57v4.55l18.94-7.53M569.47 302.78l387.16-.93-1.86-99.58"/><path class="cls-2" d="M947.54 301.85c.39.93-.38 94.93-.38 94.93l-182-4.65" transform="translate(1.64)"/><path class="cls-2" d="M939.88 396.78l.93 13.03-165.11-3.43M956.69 288.36l103.93 27.45-2.99 8.6-101.13-28.37M1028.18 316.74l6.63 89.35-49.33 1.78M1031.15 405.84v10.14M562.84 222.36l391.86-9.53M561.56 275.79l394.07-2.47M562.68 229.73l31.45-.47M643.75 229.26l62.99-.93M757.67 226.88l73.91-2.12M887.79 224.28l66.91-1.92M562.68 239.03l31.45-.46M643.75 238.57l62.99-.93M757.67 236.19l73.91-2.12M887.79 233.59l66.91-1.92M562.68 250.2l31.45-.46M643.75 249.74l62.99-.94M757.67 247.36l73.91-2.13M887.79 244.76l66.91-1.92M562.68 260.44l31.45-.47M643.75 259.97l62.99-.93M757.67 257.6l73.91-2.13M887.79 254.99l66.91-1.91"/><path stroke-width=".92" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M561.75 268.81l30.52-.46M645.32 268.35l184.27-2.79"/><path stroke-width=".91" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M890.09 263.37l64.61-1.92"/><path class="cls-2" d="M574.06 302.78v80.62M580.32 302.78v80.47M587.43 302.74v80.66M559.84 312.56v70.69M566.96 305.11v78.29M634.55 302.78l.06 82.37M640.81 302.78v82.37M647.93 302.74v82.41M655.03 302.78v83.3M661.29 302.78v83.3M668.4 302.74v83.34M674.57 302.78v83.3M680.83 302.78v83.3M594.53 355.38v28.84M600.79 355.38v28.78M607.91 355.37v28.85M615.01 355.38v28.84M621.27 355.38v28.78M628.1 355.37v29.78M594.53 302.75v9.81M600.79 302.75v9.79M607.91 302.74v9.82M615.01 302.75v9.81M621.27 302.75v9.79M628.38 302.74v9.82M802.07 301.86v90.73"/><path class="cls-8" d="M808.33 301.86v91.49M815.45 301.81v91.72M822.55 301.86v91.67"/><path class="cls-9" d="M828.81 301.86v91.67"/><path class="cls-8" d="M835.92 301.81v91.72"/><path stroke-width=".94" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M842.09 301.86v91.67"/><path class="cls-9" d="M848.35 301.86v91.67"/><path class="cls-2" d="M855.47 301.81v13.54M780.67 302.32v90.27M787.86 302.32v90.11M794.97 302.32v90.27M755.54 358.16v14.89M762.73 358.18v14.87M769.84 359.09v32.57M775.08 359.11v33.48M734.14 359.09v30.71M741.33 359.09v30.66M748.44 358.16v31.64M757.4 302.32v10.24M764.59 302.32v10.24M771.71 302.62v10.57M736 302.62v3.42M743.19 302.62v4.35M750.3 302.32v10.26M882.11 301.82v13.53M888.37 301.82v13.5M895.49 301.81v13.54M902.59 301.86v93.53M908.85 301.86v93.35M915.96 301.81v93.58M922.13 301.86v94.46M928.39 301.86v94.28M935.51 301.81v94.51M943.88 301.81v94.51M861.64 301.96v13.39M867.9 301.96v13.36M875.01 301.95v13.4"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M855.47 360.95v33.51"/><path class="cls-12" d="M882.11 361.9v33.49"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M888.37 361.88v33.45"/><path class="cls-12" d="M895.49 361.88v33.51"/><path class="cls-14" d="M861.64 360.97v33.49M867.9 360.97v33.42M875.01 360.95v33.51"/><path class="cls-2" d="M516.82 364.18v-7.39s3.72-4.71 7.45-4.71 6.51 2.79 5.58 4.66-.93 7.44-.93 7.44a15.35 15.35 0 01-12.1 0z" transform="translate(1.64)"/><path class="cls-2" d="M516.82 365.42V377s6.52 2.09 12.1.23v-13M523.43 363s2.7.3 2.7-.63-1.68-2.49-2.7-1.71 0 2.34 0 2.34z" transform="translate(1.64)"/><path class="cls-15" d="M407.53 358.53h37.44M374.65 313.02v29.24M382.56 312.4v32.03M390.91 312.56v58.9M399.29 312.56v58.9"/><path class="cls-2" d="M454.99 312.09l-1.72 63.75M463.37 313.02l-1.73 63.75"/><path class="cls-16" d="M480.12 313.02l-1.72 63.75M471.75 313.02l-1.73 63.75M489.43 313.02l-1.73 63.75"/><path class="cls-17" d="M497.81 312.56l-1.73 65.14M514.56 312.56l-1.73 65.14M506.18 312.56l-1.73 65.14"/><path class="cls-2" d="M521.7 312.4v41.24M530.38 312.4l-.5 40.88M537.35 312.4l-1.13 65.3M545.89 312.09l-1.71 66.02M552.01 312.4v70.85l1.99-.33M960.96 297.29l1.25 87.86M975.68 301.42l-.44 93.04M990.45 305.56v102.31M1004.09 309.3l1.87 98.19M1016.51 313.01l3.41 94.01"/><path class="cls-2" d="M946 414.88q-3.35-10.53-6.36-21.17c4.91 5.55 5.88 13.66 10.36 19.56l-3.44-19.6a3.29 3.29 0 01.27-2.59c1.35 1.32 1.7 3.33 2.06 5.18a82.64 82.64 0 004.21 14.63 3 3 0 001.51 1.94c1.26-7.83-.92-15.83-.32-23.74.55 7.4 1.13 14.89 3.38 22a6.86 6.86 0 00.91-2.43l3-12.65a142 142 0 01-1.91 16.43l5.72-13c.82 4.36-1.47 8.78-1.09 13.21 1.13-1 1.53-2.57 2-4a25.27 25.27 0 014.37-8L967.14 415q4.1-5.27 8.52-10.26c.77 3.36-2 6.57-2 10l6.72-7.18c.75 1.66-.51 3.5-.8 5.3a1.58 1.58 0 000 .78c.35.94 1.73.7 2.68.35a13 13 0 016.58-.85c1.41.23 2.76.77 4.16 1.05a5.59 5.59 0 004.16-.49M944.75 412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73 1.14-.71 1.85l.08 2.86c0 .54 0 1.17-.48 1.45a1.19 1.19 0 01-.79.1 6.29 6.29 0 01-1.59-.66 2.57 2.57 0 00-1.66-.32 1.12 1.12 0 00-.9 1.26 1.54 1.54 0 001.14.86 14.76 14.76 0 005.18.22c-1.48.42-3.07.25-4.56.61a30.28 30.28 0 00-2.93 1.09c-2.94 1-6.17.74-9.27.44" transform="translate(1.64)"/><path class="cls-2" d="M947.83 414.31a33.48 33.48 0 01-1.49-6.59l-1.42-9.13c.32 0 .56.29.73.58a25.08 25.08 0 012.5 5.16c.41 1.35.59 2.77 1 4.11.54 1.66 1.48 3.2 1.73 4.93.29-5.67.6-11.35 1.38-17q1.37 5.67 2.47 11.4c.35 1.82.73 3.74 2 5.1 2-4.4 2.17-9.35 2.35-14.17.29 2.29.2 4.62.33 6.92a14.84 14.84 0 001.68 6.66 27.13 27.13 0 003.15-9.25l-.47 7.9a9.64 9.64 0 00.09 2.63 3.53 3.53 0 001.77-1.76c1.25-2.22 2-4.8 3.77-6.6a59.09 59.09 0 00-1.52 9.25 6.7 6.7 0 002-2.44q1.43-2.43 2.82-4.87a55.44 55.44 0 01-1 7.48M977.47 408.1a30.9 30.9 0 004.12-7.81c.46.54.94 1.06 1.45 1.55a2.82 2.82 0 001.11.74 1.67 1.67 0 001.89-1.21 2.37 2.37 0 00-.73-2.25 4.14 4.14 0 00-2.23-1 5.93 5.93 0 002.69-1.92 2 2 0 00-.55-2.91 2.22 2.22 0 00-2.24.53 4.05 4.05 0 00-1.4 2.76 3.16 3.16 0 00-1.69-1.44 2.62 2.62 0 00-2.58 1.51 2.39 2.39 0 00-.41 1.36 2 2 0 001.59 1.59 5.74 5.74 0 002.4-.14" transform="translate(1.64)"/><path class="cls-2" d="M971.64 406.82a43.28 43.28 0 003.46-8.65 4.59 4.59 0 01.75-1.93c.22-.26.49-.46.72-.7a2.81 2.81 0 00.78-2 1.32 1.32 0 00-.14-.65c-.4-.65-1.4-.42-2 0a5.88 5.88 0 00-2 2.5 3.57 3.57 0 00-2.72-1.69 1.63 1.63 0 00-1.62.65c-.39.71.16 1.59.81 2.07a4.73 4.73 0 003.82.81" transform="translate(1.64)"/><path class="cls-2" d="M963.59 401.9c.53-2.47 2.15-4.58 2.73-7a22.71 22.71 0 01.71-3.17c.31-.76.83-1.57.56-2.35a1.6 1.6 0 00-2.39-.56 2.69 2.69 0 00-.88 2.57 2.07 2.07 0 00-2.62-.2 1.6 1.6 0 000 2.46c.83.56 1.94.07 2.82-.42l3.11-1.75a4.1 4.1 0 011.33-.56 1.39 1.39 0 011.31.43c.54.7 0 1.71-.7 2.25a3 3 0 01-2 .72A1.76 1.76 0 01966 393M959 400.58l.28-10a2.13 2.13 0 002.34-1.35 6.17 6.17 0 00.29-2.9 2.41 2.41 0 00-.22-1 .83.83 0 00-.86-.46 1.07 1.07 0 00-.53.41 5.66 5.66 0 00-.66 3.71 6.35 6.35 0 00-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81 0 00-.13.63 6 6 0 001.75 3.57 1.37 1.37 0 00-1.49-1.16 2.6 2.6 0 00-1.75 1.07 1 1 0 00-.27.94 1 1 0 00.73.48 6.5 6.5 0 003.19 0M749.35 407.26q-1.61-3.75-2.83-7.64a17.35 17.35 0 012.34 6.77c.72-2.11.18-4.69 1.58-6.43l.29 7.35a19.69 19.69 0 013-5.28 6.47 6.47 0 01-1.31 2.32 3.32 3.32 0 00-.77 2.49 27.28 27.28 0 015.82-2.08l-1.28 2.39a4.22 4.22 0 011.4-1.64 1.47 1.47 0 012 .31c.11.18.16.38.28.55.4.59 1.31.48 1.93.13a6.34 6.34 0 011.85-1c.89-.18 1.75.37 2.66.49 1.25.18 2.51-.47 3.77-.31.76.1 1.46.49 2.22.65 1.93.39 3.9-.78 5.86-.55a19.88 19.88 0 012.71.77 14.72 14.72 0 003 .38l5.11.29" transform="translate(1.64)"/><path class="cls-2" d="M780.12 407.83c-1.9-.75-4-.4-6.06-.51a29.3 29.3 0 00-3.37-.2 18.26 18.26 0 00-4.33 1.11 26.24 26.24 0 01-4.87 1M749.51 404.89a26.24 26.24 0 01-.52-7.29 2.83 2.83 0 01.9-2.22c1.15-.78 3 .28 4-.65a1.56 1.56 0 000-2.2 2.12 2.12 0 00-2.3-.33 3.49 3.49 0 00-1.68 1.75 7.58 7.58 0 00-.31-2.68 3.26 3.26 0 00-.81-1.48 1.58 1.58 0 00-1.56-.44 2 2 0 00-1 2.27 4.37 4.37 0 002.12 3.1 5.29 5.29 0 00-3.34-1.07 2.68 2.68 0 00-1.92.73 1.39 1.39 0 00-.07 1.89 2 2 0 001.35.42 11.89 11.89 0 003.36-.39M458.36 408.52a15.77 15.77 0 003.21-8.77 37.41 37.41 0 01-3.36 6.19l-.72-2.9c-.89 1-.64 3-1.88 3.52-1 .48-2.58-.37-3.27.54-.5.65-.12 1.09-.92 1.25-.41.08-1.62-.74-2-.92l-4-1.85c-.48-.22-1.05-.64-.88-1.14a.84.84 0 01.4-.43c1.17-.67 2.62.11 3.69.93s2.33 1.76 3.63 1.4a.75.75 0 00.35-.19.92.92 0 00.13-.7 12.83 12.83 0 01.54-4.69c.78 2.07.48 6.29-1.26 7.9s-5.39 2-7.44 2.76l-6.69 2.37a31.42 31.42 0 01-4.74 1.4M280 432.39c-2.64-1.48-5.84-1.64-8.86-1.36s-6 1-9 1.09c-5.8.2-11.55-1.81-17.34-1.36a38.31 38.31 0 005.2-5.86l-5.31 5.16a17 17 0 01-.64-4.85q-.19 2.55-.6 5.07l-2.78-3.41.82 4.41c-2.08-.84-2.37-4.53-4.62-4.53l1.58 4.85a10.65 10.65 0 01-2.43-3.26c-.48.45-.45 1.21-.69 1.81s-1.23 1-1.49.41a1.37 1.37 0 010-.67c.09-1.3-1-2.33-1.6-3.48a10.37 10.37 0 01-.91-3.94l-.84-8.84c-1.54 5.31 1.21 11 .6 16.46a57.61 57.61 0 00-7.24-11.28c-.44-.54-1.15-1.11-1.74-.75.07 1.62 1.23 2.95 2.33 4.13q4.26 4.53 8.74 8.84a42.88 42.88 0 00-13.46-7.47 67.92 67.92 0 0010.92 9 37 37 0 00-7.24-3.05 12.59 12.59 0 00-7.73.19 92.59 92.59 0 0017.24 2.07c0 .73-.77 1.19-1.45 1.45-5.14 1.94-10.88 1.41-16.23 2.67a48.81 48.81 0 00-8.16 2.95M286 310.43h16.58a6.28 6.28 0 001.63-.21c2.61-.68 9.65-3.19 2-9a19.15 19.15 0 00-17.4-3.23c-3.95 1.18-7 3.41-8.27 5.38-1.47 2.3-1 3.06-.63 4.13s2.55 2.6 6.31 2.92M288.64 286.67s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M293.54 286.26s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M298 285.89s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M289.33 298.21a3.74 3.74 0 00-1.41 4.21M295.48 297.17s-3.65 1.81-2.71 5.25M300.67 298s-3.13 1.35-2.58 4.4M352.84 77.37V85l20.25-8.78v-8c-4.46-4.15-13.71-3.19-13.71-3.19l-6.54 12.28 20.09-8.93" transform="translate(1.64)"/><ellipse class="cls-2" cx="367.39" cy="67.8" rx="1.43" ry=".64"/><ellipse class="cls-2" cx="366.09" cy="75.88" rx="1.59" ry="1.43"/><ellipse class="cls-2" cx="359.58" cy="72.74" rx="1.28" ry=".48"/><path class="cls-2" d="M435.69 33.88s0 1.31-1.31 0 1.31-3.88 2.62-2.61l1.31 1.3M463.78 33.23l-6.62-2.32s-7.76-1.6-14.54 0-6.28 7.54-5 8.85l2.22 2.24c-1.73 3.5.42 7 .42 7h3.92a5.73 5.73 0 01-1.31-4 2.56 2.56 0 012.61-2.62l1.31 1.31c1.31 1.31 7.84 0 7.84 0-1.31 2.61 2.61 5.23 2.61 5.23h2.62c-1.31-1.31-1.31-9.15.74-6.54s6.87 0 6.87 0l1.53-2.62c-2.61 0-3.92-3.92-3.92-3.92" transform="translate(1.64)"/><path class="cls-2" d="M463.36 37.53s-2.44-3.51 2.71-5.45l1.52.32s-.59 2.88-2.11 2.6M564.42 35a2.56 2.56 0 01-2.62-2.61c0-1.31 1.31-2.61 3.27.65h1.31c1.3 0 1.3 0 3.91 1.84s0 3.39 0 3.39a11.48 11.48 0 00-3.91.65c-1.31.65.17 4.06-.66 6.53-.65 2-3.26 3.27-3.26 3.27s-1 5.88-.31 7.19c1 .65 1.31 3.26 1.31 3.26h-3.62v-2.64a1.28 1.28 0 01-1.3-1.31c0-1.3-1.15-5.88-1.47-5.88-4.09 2-10.29-.65-10.29-.65" transform="translate(1.64)"/><path class="cls-2" d="M546.78 49l-2 3v2.61a4.58 4.58 0 011.3 2.61 5.24 5.24 0 00.29 2l-2.9-.65s0-2.61-1.31-2.61v-2.7L540.9 52l1.3-2.62s.71-3.35-.3-4.94a4.75 4.75 0 012.92-6.81c2.48-.83 11.76 1.3 14.37 0S561.8 35 561.8 35" transform="translate(1.64)"/><rect class="cls-2" x="625.42" y="67.29" width="5.69" height="1.81" rx=".62"/><path class="cls-2" d="M623.31 76.87a2.19 2.19 0 00-2 2.17v14a2.19 2.19 0 002.18 2.18h6.26a2.19 2.19 0 002.18-2.18V79a2.19 2.19 0 00-1.57-2" transform="translate(1.64)"/><path class="cls-2" d="M633.58 93.17v-.11M626.23 69.1l-1.52 7.76M630.41 69.1l1.51 7.74.01.02M631.92 76.84l.12.12M625.47 72.98l5.31-1.98M622.96 81.68h10.63M622.96 91.93h10.62M630.48 65.22v-2.85M632.55 65.82l2.21-2M633.33 67.61l3.1.15"/><path class="cls-2" d="M654.59 155.68s3.63 5.23 8.59 2.35a3.63 3.63 0 01-2.67 4.69s-5.73-1.81-6.49-6.49-.38-12.27 9.92-14.07a17.64 17.64 0 018.33.25h.14a10.27 10.27 0 015.66 4.4c.76 1.08 1.91 5.77 1.91 5.77s-6.49 3.61-13.36.36c-7.26-2.49-8.78-3.21-12.03 2.74zM672.27 142.41s-6.37 2.91-2.58 11.61" transform="translate(1.64)"/><path class="cls-2" d="M664.15 142.12a19 19 0 00-2.09-2l-1.44-1.12s6.62-1.32 8.2 2.77" transform="translate(1.64)"/><ellipse class="cls-2" cx="676.08" cy="147.75" rx=".76" ry=".72"/><path class="cls-2" d="M275.58 202.46l.16 2.55 14.45-.72-.18-2.75-14.16.9-.27.02zM274.09 227.75l6.32 1.66-.94-14.66-3.73-9.74-1.89 8.26.24 14.48z"/><path class="cls-2" d="M274.09 227.75l3.3-2.28 2.77 3.88M276.65 213.78l.74 11.69M279.45 214.52l13.86-.89-2.92-9.36"/><path class="cls-2" d="M280.41 229.41l14.39-1.6-1.49-14.18M280.93 202.12l.17 2.55 2.84 4.5 3.44-.22-2.37-4.68.08-2.42M280.25 226.99l14.26-1.89"/><path class="cls-2" d="M284.91 218.44a2.89 2.89 0 00-3.18-.13 2.45 2.45 0 102.33 4.22 3.11 3.11 0 001.49-1.75" transform="translate(1.64)"/><ellipse class="cls-2" cx="287.66" cy="219.43" rx="2.41" ry="2.86" transform="rotate(-48.66 288.45921753 217.6128333)"/><path class="cls-2" d="M287.32 217.37l4.13 3.95M282.03 221.8l4.64-3.24"/><path class="cls-2" d="M304.82 114.56s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15M309.27 114.19s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15" transform="translate(1.64)"/><path class="cls-2" d="M302.55 124.63h12.66a.65.65 0 01.65.65v2.45h-14v-2.45a.65.65 0 01.69-.65zM303.59 123.08h10.28a.53.53 0 01.53.53v1h-11.34v-1a.53.53 0 01.53-.53z"/><path class="cls-2" d="M300.75 127.73l.28 2.52 1.36 12a.5.5 0 00.49.44h8.61a.5.5 0 00.49-.44l1.7-14.54" transform="translate(1.64)"/><path class="cls-2" d="M315.03 130.26h-12.36M303.42 136.91h10.83"/><path class="cls-18" d="M394.18 150.93h1.24l3.43 10.23 3.43-10.23h1.24l-4.12 11.9h-1.1zM405.32 150.93h1.18v11.9h-1.18zm.81 0H413V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36H413v1.1h-6.83zM415.33 150.93h1.18v11.9h-1.18zm.84 10.8H423v1.1h-6.8zM424.94 150.93h1.17v11.9h-1.17zm.57 8.27l6.52-8.27h1.52l-7.55 9.18zm3.35-2.72l.68-1.22 4.51 7.57h-1.41zM436.86 162.44a3.43 3.43 0 01-1.42-1.5 5.25 5.25 0 01-.49-2.37v-3.37a5.26 5.26 0 01.49-2.38 3.36 3.36 0 011.42-1.49 5.19 5.19 0 014.53 0 3.43 3.43 0 011.43 1.49 5.4 5.4 0 01.49 2.38v3.37a5.38 5.38 0 01-.49 2.37 3.51 3.51 0 01-1.43 1.5 5.28 5.28 0 01-4.53 0zm3.89-1a2.5 2.5 0 001-1.1 4 4 0 00.35-1.75v-3.48a4 4 0 00-.35-1.75 2.5 2.5 0 00-1-1.1 3.66 3.66 0 00-3.25 0 2.42 2.42 0 00-1 1.1 3.9 3.9 0 00-.36 1.75v3.48a3.87 3.87 0 00.36 1.75 2.42 2.42 0 001 1.1 3.66 3.66 0 003.25 0zM454.72 150.93H456v11.9h-1.18v-10.22l.13.52-3.59 8.05h-.83l-3.58-7.88.12-.69v10.22h-1.18v-11.9h1.24l3.82 8.59zM467.77 150.93H469v11.9h-1.18v-10.22l.12.52-3.58 8.05h-.84L460 153.3l.12-.69v10.22h-1.22v-11.9h1.23l3.82 8.59zM472 150.93h1.18v11.9H472zm.81 0h6.83V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36h6.83v1.1h-6.83zM482 150.93h1.19l6.9 10.72-.48-.33v-10.39h1.18v11.89h-1.2L482.5 152l.64.47v10.33H482zM493.82 161.49h1.34v1.34h-1.34zm.08-10.56h1.17v9.17h-1.17zM394.91 180.47h.79v7.92h-.79zm.55 0h4.44v.73h-4.44zm0 3.69h3.84v.73h-3.84zM401.27 180.46h.78v7.93h-.78zm.48 3.85h2.71a1.67 1.67 0 00.78-.19 1.35 1.35 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.38 1.38 0 00-.52-.55 1.61 1.61 0 00-.78-.19h-2.71v-.73h2.66a2.46 2.46 0 011.21.28 2 2 0 01.81.81 2.48 2.48 0 01.29 1.2 2.45 2.45 0 01-.29 1.2 2 2 0 01-.81.81 2.49 2.49 0 01-1.21.28h-2.66zm2.54.49l.73-.26 2 3.85h-.94zM408.55 180.47h.78v7.92h-.78zm.54 0h4.55v.73h-4.55zm0 3.62h4v.73h-4zm0 3.57h4.55v.73h-4.55zM415.22 180.47h.78v7.92h-.79zm.76 7.19h1.79a2.36 2.36 0 001.65-.51 2.06 2.06 0 00.55-1.55v-2.34a2.06 2.06 0 00-.55-1.55 2.36 2.36 0 00-1.65-.51H416v-.73h1.76a4 4 0 011.68.31 2.1 2.1 0 011 .95 3.36 3.36 0 01.33 1.58v2.24a3.36 3.36 0 01-.33 1.58 2.17 2.17 0 01-1 1 4 4 0 01-1.68.31H416zM424.38 180.47h.95l2.93 7.92h-.88l-2.52-7.1-2.53 7.1h-.87zm-1.57 5.27H427v.73h-4.17zM434.44 184.34v1.17a3.83 3.83 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.32 2 2 0 01-.93-.92 3.44 3.44 0 01-.31-1.56v-2.34a3.91 3.91 0 01.3-1.64 2.13 2.13 0 01.93-1 3.22 3.22 0 011.54-.33 3 3 0 011.33.27 2.21 2.21 0 01.91.78 3.55 3.55 0 01.5 1.31h-.85a2.72 2.72 0 00-.39-.91 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.33 2.33 0 00-1.11.25 1.64 1.64 0 00-.66.74 3 3 0 00-.22 1.24v2.34a2.71 2.71 0 00.22 1.15 1.51 1.51 0 00.68.69 2.48 2.48 0 001.12.22 2.2 2.2 0 001.09-.23 1.52 1.52 0 00.65-.72 3.25 3.25 0 00.21-1.26v-.46h-1.92v-.73zM441 188.39h-.79v-7.26l-1.45.91v-.82l1.13-.75H441zM442.67 187.76l3-3.91a3.37 3.37 0 00.46-.75 1.76 1.76 0 00.16-.65 1.27 1.27 0 00-.37-1 1.43 1.43 0 00-1-.35 1.41 1.41 0 00-1 .38 1.71 1.71 0 00-.47 1h-.82a3.11 3.11 0 01.4-1.17 2 2 0 01.78-.73 2.33 2.33 0 011.11-.26 2.64 2.64 0 011.21.25 1.62 1.62 0 01.76.7 2.19 2.19 0 01.27 1.12 2.23 2.23 0 01-.22.85 4.79 4.79 0 01-.6 1l-2.63 3.37h3.49v.73h-4.47zM452.28 185.19v.73h-3.67v-.73zM455.66 188.39h-.78v-7.26l-1.46.91v-.82l1.13-.75h1.11zM460.6 184.46v.19a.74.74 0 01-.45.37 2.26 2.26 0 01-.77.12 2.06 2.06 0 01-1.09-.29 1.89 1.89 0 01-.72-.81 2.8 2.8 0 01-.26-1.22 3.06 3.06 0 01.26-1.31 1.76 1.76 0 01.76-.83 2.61 2.61 0 012.39 0 1.91 1.91 0 01.75.84 3 3 0 01.26 1.33 3.7 3.7 0 01-.11.91 5.1 5.1 0 01-.31 1l-.06.14a1 1 0 00-.07.15l-1.69 3.39h-.88zm0-.49a1.79 1.79 0 00.37-1.2 1.77 1.77 0 00-.38-1.21 1.47 1.47 0 00-2.1 0 1.77 1.77 0 00-.38 1.21 1.73 1.73 0 00.38 1.19 1.51 1.51 0 002.11 0zM394.91 193.87h.79v7.93h-.79zm.56 7.2H400v.73h-4.54zM403.59 193.87h.94l2.93 7.93h-.87l-2.53-7.11-2.52 7.11h-.88zm-1.59 5.27h4.17v.73H402zM409.34 201.56a2.06 2.06 0 01-.92-1 3.61 3.61 0 01-.31-1.61v-5.11h.79V199a2.18 2.18 0 00.49 1.56 2 2 0 001.5.52 2 2 0 001.51-.52 2.18 2.18 0 00.5-1.56v-5.15h.78V199a3.76 3.76 0 01-.3 1.61 2.13 2.13 0 01-.93 1 3.47 3.47 0 01-1.56.32 3.39 3.39 0 01-1.55-.37zM415.43 193.86h.78v7.94h-.78zm.48 3.85h2.71a1.55 1.55 0 00.78-.19 1.29 1.29 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.23 1.23 0 00-.52-.54 1.51 1.51 0 00-.78-.2h-2.71v-.73h2.67a2.45 2.45 0 011.2.29 1.89 1.89 0 01.81.8 2.48 2.48 0 01.29 1.2 2.42 2.42 0 01-.29 1.2 2 2 0 01-.81.81 2.47 2.47 0 01-1.2.28h-2.67zm2.55.49l.72-.25 2 3.85h-.94zM422.71 193.87h.78v7.93h-.78zm.75 7.2h1.8a2.36 2.36 0 001.65-.52 2 2 0 00.54-1.55v-2.34a2.06 2.06 0 00-.54-1.55 2.36 2.36 0 00-1.65-.51h-1.8v-.73h1.76a3.91 3.91 0 011.68.31 2.08 2.08 0 011 .95 3.39 3.39 0 01.33 1.58V199a3.24 3.24 0 01-.34 1.58 2.1 2.1 0 01-1 .95 4 4 0 01-1.68.32h-1.76zM431.87 193.87h.95l2.92 7.93h-.87l-2.52-7.11-2.53 7.11H429zm-1.57 5.27h4.17v.73h-4.17zM441.93 197.74v1.17a4 4 0 01-.31 1.65 2.11 2.11 0 01-.92 1 3.29 3.29 0 01-1.55.33 3.61 3.61 0 01-1.56-.31 2.06 2.06 0 01-.94-.93 3.56 3.56 0 01-.31-1.55v-2.34a4 4 0 01.31-1.65 2.08 2.08 0 01.93-1 3.23 3.23 0 011.54-.32 3 3 0 011.32.26 2.09 2.09 0 01.91.78 3.39 3.39 0 01.51 1.31H441a2.87 2.87 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.45 2.45 0 001.12.23 2.23 2.23 0 001.09-.24 1.42 1.42 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.46h-1.92v-.73zM448.48 201.8h-.79v-7.27l-1.45.91v-.82l1.12-.75h1.12zM450.16 201.16l3-3.91a3.31 3.31 0 00.45-.75 1.58 1.58 0 00.16-.65 1.3 1.3 0 00-.36-1 1.44 1.44 0 00-1-.34 1.38 1.38 0 00-1 .37 1.71 1.71 0 00-.47 1.05h-.82a2.85 2.85 0 01.4-1.16 2 2 0 01.78-.74 2.33 2.33 0 011.11-.25 2.81 2.81 0 011.21.24 1.67 1.67 0 01.76.7 2.21 2.21 0 01.26 1.12 2.19 2.19 0 01-.21.85 5.5 5.5 0 01-.6 1l-2.63 3.38h3.49v.73h-4.47zM459.76 198.59v.73h-3.66v-.73zM463.15 201.8h-.78v-7.27l-1.46.91v-.82l1.13-.75h1.11zM469.05 194.53L467 201.8h-.86l2.09-7.2h-2.71v1.46h-.79v-2.19h4.32zM396.21 215.17a3.68 3.68 0 01-.95-.33 3.75 3.75 0 01-.84-.54l.48-.62a3.47 3.47 0 001.09.65 3.71 3.71 0 001.31.22 2.67 2.67 0 001.58-.41 1.3 1.3 0 00.56-1.13 1 1 0 00-.25-.72 1.5 1.5 0 00-.62-.41 7.84 7.84 0 00-1-.25h-.24a8.26 8.26 0 01-1.33-.33 1.94 1.94 0 01-.86-.58 1.75 1.75 0 01-.35-1.15 2.32 2.32 0 01.33-1.26 2.1 2.1 0 011-.79 3.86 3.86 0 011.52-.27 4 4 0 01.84.09 4.28 4.28 0 01.81.27 5 5 0 01.79.47l-.46.61a4.34 4.34 0 00-1-.54 3 3 0 00-1-.17 2.39 2.39 0 00-1.5.41 1.35 1.35 0 00-.54 1.15.93.93 0 00.27.71 1.66 1.66 0 00.66.38 9.36 9.36 0 001.09.26h.18a8.4 8.4 0 011.24.35 2 2 0 01.83.62 1.74 1.74 0 01.33 1.12 2.15 2.15 0 01-.34 1.24 2.1 2.1 0 01-1 .79 4.09 4.09 0 01-1.57.27 5.44 5.44 0 01-1.06-.11zM402.7 215a2.13 2.13 0 01-.93-1 3.75 3.75 0 01-.31-1.61v-5.11h.79v5.15a2.12 2.12 0 00.5 1.56 2 2 0 001.49.52 2 2 0 001.51-.52 2.16 2.16 0 00.5-1.56v-5.15h.75v5.11a3.75 3.75 0 01-.31 1.61 2.13 2.13 0 01-.93 1 3.44 3.44 0 01-1.56.32 3.35 3.35 0 01-1.5-.32zM408.78 207.27h.79l4.61 7.14-.33-.22v-6.92h.79v7.92h-.8l-4.7-7.2.43.31v6.89h-.79zM416.6 207.27h.79v7.93h-.79zm.76 7.2h1.79a2.36 2.36 0 001.65-.52 2 2 0 00.55-1.55v-2.33a2.07 2.07 0 00-.55-1.56 2.36 2.36 0 00-1.65-.51h-1.79v-.73h1.76a4 4 0 011.68.31 2.14 2.14 0 011 .95 3.39 3.39 0 01.33 1.58v2.25a3.35 3.35 0 01-.33 1.57 2.17 2.17 0 01-1 .95 4 4 0 01-1.68.32h-1.75zM425.76 207.27h.95l2.93 7.93h-.88l-2.52-7.11-2.53 7.11h-.87zm-1.57 5.27h4.17v.73h-4.17zM435.82 211.15v1.16a3.8 3.8 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.31 2 2 0 01-.93-.93 3.4 3.4 0 01-.31-1.55v-2.34a4 4 0 01.3-1.65 2.13 2.13 0 01.93-1 3.35 3.35 0 011.54-.32 3.07 3.07 0 011.33.26 2.21 2.21 0 01.91.78 3.62 3.62 0 01.5 1.31h-.85a2.66 2.66 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.48 2.48 0 001.12.23 2.2 2.2 0 001.09-.24 1.38 1.38 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.45h-1.92v-.73zM442.37 215.2h-.79v-7.27l-1.45.91V208l1.12-.75h1.12zM445.05 215a1.94 1.94 0 01-.82-.68 2.33 2.33 0 01-.39-1.08h.79a1.65 1.65 0 00.27.68 1.31 1.31 0 00.55.43 1.86 1.86 0 00.77.15 1.53 1.53 0 001.1-.38 1.42 1.42 0 00.39-1.07v-.24a1.38 1.38 0 00-.38-1 1.43 1.43 0 00-1.06-.37h-.56v-.73h.56a1.38 1.38 0 001-.32 1.23 1.23 0 00.34-.91v-.24a1.28 1.28 0 00-.36-1 1.39 1.39 0 00-1-.34 1.59 1.59 0 00-.66.14 1.39 1.39 0 00-.5.41 1.76 1.76 0 00-.29.65h-.8a2.6 2.6 0 01.41-1 2 2 0 01.77-.66 2.29 2.29 0 011.06-.23 2.2 2.2 0 011.59.54 2 2 0 01.56 1.52v.24a1.83 1.83 0 01-.26 1 1.6 1.6 0 01-.75.6 1.36 1.36 0 01.84.6 2.17 2.17 0 01.3 1.19v.24a2.46 2.46 0 01-.27 1.19 1.72 1.72 0 01-.77.74 2.72 2.72 0 01-1.23.26 2.66 2.66 0 01-1.2-.33zM453.79 212v.73h-3.66V212zM457.18 215.2h-.78v-7.27l-1.46.91V208l1.13-.75h1.11zM463.07 207.93l-2 7.27h-.86l2.09-7.2h-2.71v1.47h-.79v-2.2h4.31z" transform="translate(1.64)"/><path d="M683 282.77h60.29a.18.18 0 01.18.18v10.11a5.4 5.4 0 01-5.4 5.4H677.5a.18.18 0 01-.18-.18v-9.8a5.71 5.71 0 015.68-5.71z" stroke-width="1.4" stroke="#ed7320" stroke-miterlimit="10" fill="#fff"/><path class="cls-18" d="M678.29 288.52h.76l1 3.19 1-3.19h.76l-1.45 4.39h-.61zM682.29 288.52h.71v.72h-.72zm0 1.26h.71v3.13h-.72zM683.87 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM686.91 293.5h.27a.2.2 0 00.15-.06.24.24 0 000-.18v-3.48h.73v3.58a.88.88 0 01-.2.61.74.74 0 01-.57.22h-.43zm.47-5h.73v.72h-.73zM689.55 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.78 1.78 0 01.16-.8 1.17 1.17 0 01.46-.5 1.54 1.54 0 01.73-.17 1.19 1.19 0 01.69.2 1.3 1.3 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.14v-.53h1.47a1 1 0 00-.18-.52.53.53 0 00-.42-.18.61.61 0 00-.5.21.84.84 0 00-.18.58v.4a.75.75 0 00.19.55.78.78 0 00.55.19 1.09 1.09 0 00.35-.07 1.08 1.08 0 00.31-.19l.48.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM692.93 292.91a2.36 2.36 0 01-.47-.16 1.6 1.6 0 01-.4-.25l.43-.54a1.89 1.89 0 00.49.25 1.46 1.46 0 00.49.09 1.09 1.09 0 00.5-.09.28.28 0 00.17-.26.24.24 0 00-.08-.19.4.4 0 00-.22-.09l-.36-.05h-.21a2.82 2.82 0 01-.54-.11.68.68 0 01-.36-.25.88.88 0 01-.14-.53 1 1 0 01.14-.54 1 1 0 01.42-.34 2 2 0 01.69-.11 1.83 1.83 0 01.47 0 2.23 2.23 0 01.44.13 3.11 3.11 0 01.4.22l-.44.53a1.58 1.58 0 00-.44-.2 1.39 1.39 0 00-.44-.07 1 1 0 00-.43.08.27.27 0 00-.15.24.19.19 0 00.08.16.44.44 0 00.21.07l.35.05h.14a2.66 2.66 0 01.58.1.77.77 0 01.39.26.89.89 0 01.16.58 1 1 0 01-.15.56.88.88 0 01-.45.34 2 2 0 01-.73.12 3.1 3.1 0 01-.54 0zM697.25 289.78h.75l-1.18 3.13h-.53l-1.18-3.13h.74l.7 2.1zM698.51 288.52h.72v.72h-.72zm0 1.26h.72v3.13h-.72zM700.09 289.78h.72v3.13h-.72zM702 291a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.84.84 0 01.5-.15 1 1 0 01.78.33 1.44 1.44 0 01.28.95v1.9H702zM704 292.81a1 1 0 01-.37-.45 1.88 1.88 0 01-.12-.71v-.6a1.94 1.94 0 01.12-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1 1 0 01.35.42l-.06.67a.59.59 0 00-.07-.31.37.37 0 00-.18-.19.62.62 0 00-.71.1.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.62.62 0 00.71.1.41.41 0 00.18-.19.62.62 0 00.07-.31v.69a.82.82 0 01-.8.55 1.07 1.07 0 01-.54-.16zm0 1.25a1.1 1.1 0 01-.45-.37l.49-.45a.71.71 0 00.27.22.8.8 0 00.33.08.69.69 0 00.49-.17.61.61 0 00.18-.47v-3.12h.69v3a1.53 1.53 0 01-.16.74 1.12 1.12 0 01-.47.47 1.6 1.6 0 01-.75.16 1.51 1.51 0 01-.62-.09zM707.45 292.8a1.14 1.14 0 01-.49-.48 1.65 1.65 0 01-.16-.77v-.35a1.78 1.78 0 01.16-.8 1.12 1.12 0 01.46-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.69.2 1.29 1.29 0 01.43.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a.9.9 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.89.89 0 00-.17.58v.4a.75.75 0 00.19.55.77.77 0 00.54.19 1.15 1.15 0 00.36-.07 1.23 1.23 0 00.31-.19l.47.44a1.73 1.73 0 01-.54.35 1.53 1.53 0 01-.6.12 1.57 1.57 0 01-.75-.19zM710.21 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM718.72 288.52h.73v4.39h-.73zm.39 1.88h2.5v.69h-2.5zm2.07-1.88h.72v4.39h-.72zM723 292.72a.92.92 0 01-.27-.73.88.88 0 01.27-.7 1.25 1.25 0 01.82-.23h.84v.56h-.88a.47.47 0 00-.32.09.32.32 0 00-.11.28.33.33 0 00.14.29.76.76 0 00.42.1 1.29 1.29 0 00.51-.08.25.25 0 00.17-.23l.06.44a.49.49 0 01-.18.25.75.75 0 01-.31.15 1.6 1.6 0 01-.39 0 1.17 1.17 0 01-.77-.19zm1.63-1.8a.49.49 0 00-.16-.4.6.6 0 00-.44-.15 1 1 0 00-.35.06 1.07 1.07 0 00-.32.16l-.48-.41a1.21 1.21 0 01.48-.33 1.81 1.81 0 01.67-.12 1.55 1.55 0 01.68.14 1 1 0 01.44.4 1.22 1.22 0 01.15.63v2h-.67zM726.16 289.78h.73v3.13h-.73zM728 291a.6.6 0 00-.16-.43.54.54 0 00-.43-.16.5.5 0 00-.55.55l-.07-.65a1.24 1.24 0 01.36-.44.9.9 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.28.95v1.9H728zM730 292.81a.93.93 0 01-.37-.45 1.87 1.87 0 01-.13-.71v-.6a1.93 1.93 0 01.13-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1.13 1.13 0 01.35.42l-.07.67a.71.71 0 00-.06-.31.37.37 0 00-.18-.19.56.56 0 00-.3-.07.51.51 0 00-.41.17.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.51.51 0 00.41.17.56.56 0 00.3-.07.41.41 0 00.18-.19.75.75 0 00.06-.31v.69a1 1 0 01-.3.4.84.84 0 01-.5.15 1.07 1.07 0 01-.53-.16zm1.33-4.29h.73v4.39h-.73zM733.52 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.93 1.93 0 01.16-.8 1.14 1.14 0 01.47-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.68.2 1.24 1.24 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a1 1 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.84.84 0 00-.18.58v.4a.76.76 0 00.2.55.77.77 0 00.54.19 1 1 0 00.35-.07 1.29 1.29 0 00.32-.19l.47.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM737 292a.24.24 0 00.06.18.21.21 0 00.16.06h.22v.69h-.4a.73.73 0 01-.56-.21.86.86 0 01-.2-.62v-3.57h.72z" transform="translate(1.64)"/><path d="M720.79 282.77c-.18.63-.55 1.78-1.29 3.67-1.24 3.19-3 5.09-2.47 7.14s2 3 4.82 3.84a45.51 45.51 0 004.73 1.05l-.74-.13" stroke="#ed7320" stroke-width=".93" stroke-miterlimit="10" fill="none"/></svg>
\ No newline at end of file diff --git a/src/wwwroot/assets/profile/header.svg b/src/wwwroot/assets/profile/header.svg new file mode 100644 index 0000000..1a3f1e9 --- /dev/null +++ b/src/wwwroot/assets/profile/header.svg @@ -0,0 +1,530 @@ +<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1283 471.46"> + <defs> + <style> + .cls-1,.cls-19{fill:#fff;}.cls-10,.cls-11,.cls-12,.cls-13,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-20,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7,.cls-8,.cls-9{fill:none;}.cls-10,.cls-11,.cls-12,.cls-13,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7,.cls-8,.cls-9{stroke:#ee741e;}.cls-10,.cls-11,.cls-12,.cls-13,.cls-14,.cls-15,.cls-16,.cls-17,.cls-19,.cls-2,.cls-20,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7,.cls-8,.cls-9{stroke-miterlimit:10;}.cls-2,.cls-20{stroke-width:0.93px;}.cls-3{stroke-width:0.89px;}.cls-4{stroke-width:1.03px;}.cls-5{stroke-width:0.92px;}.cls-6{stroke-width:0.92px;}.cls-7{stroke-width:0.91px;}.cls-8{stroke-width:0.94px;}.cls-9{stroke-width:0.94px;}.cls-10{stroke-width:0.94px;}.cls-11{stroke-width:0.95px;}.cls-12{stroke-width:0.95px;}.cls-13{stroke-width:0.95px;}.cls-14{stroke-width:0.95px;}.cls-15{stroke-width:0.95px;}.cls-16{stroke-width:0.98px;}.cls-17{stroke-width:1px;}.cls-18{fill:#ee741e;}.cls-19,.cls-20{stroke:#ed7320;}.cls-19{stroke-width:1.4px;} + </style> + </defs> + <rect class="cls-1" width="1283" height="471.46"/> + <line class="cls-2" x1="561.56" y1="286.96" x2="956.16" y2="284.17"/> + <line class="cls-2" x1="561.56" y1="295.34" x2="957.09" y2="294.41"/> + <polygon class="cls-2" points="235.82 418.65 235.82 425.17 391.24 429.82 391.24 423.24 235.82 418.65"/> + <line class="cls-2" x1="325.16" y1="396.32" x2="235.82" y2="418.65"/> + <line class="cls-2" x1="391.24" y1="422.96" x2="481.05" y2="388.41"/> + <line class="cls-2" x1="391.71" y1="429.36" x2="464.3" y2="400.51"/> + <polygon class="cls-2" points="464.72 396.32 464.72 404.15 528.49 404.15 528.49 397.15 464.72 396.32"/> + <line class="cls-2" x1="482.91" y1="383.75" x2="482.91" y2="392.46"/> + <path class="cls-2" d="M476.46,389.74" transform="translate(1.64)"/> + <line class="cls-2" x1="392.17" y1="387.48" x2="480.66" y2="388.11"/> + <path class="cls-2" + d="M351.91,375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12,0,0,1,0,.23L378,382.82l-33.5-4.65c-.16,0-.16-.9,0-.93l31.64-5.94" + transform="translate(1.64)"/> + <polyline class="cls-2" + points="326.56 350.25 326.56 396.32 331.62 396.32 331.62 394.01 341.45 395.85 341.45 399.57 345.17 400.5 353.55 397.71 353.55 394.94 353.55 379.31"/> + <polygon class="cls-3" points="340.99 369.79 331.68 367.93 331.68 387.21 340.99 389.75 340.99 369.79"/> + <path class="cls-2" + d="M347.86,367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07,3.47-22.67,12S347.86,367.93,347.86,367.93Z" + transform="translate(1.64)"/> + <path class="cls-2" + d="M352.45,365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63,2.62-17.08,9S352.45,365.14,352.45,365.14Z" + transform="translate(1.64)"/> + <path class="cls-2" d="M358.43,322.33V340s-25.13-3.72-37.23,7.45l20.47,3.79s17.49-17.82,44.11-4.76" + transform="translate(1.64)"/> + <line class="cls-2" x1="368.82" y1="322.33" x2="368.82" y2="341.71"/> + <path class="cls-2" d="M355.63,314.88h13.54a.41.41,0,0,0,.21-.76c-2.2-1.3-7.52-3.45-14.2.76" + transform="translate(1.64)"/> + <polyline class="cls-2" points="360.06 315.81 358.15 322.33 370.21 322.33 368.44 314.88"/> + <path class="cls-2" + d="M383.55,380s.53,2.27,4,7.18.67,23.53.67,23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28,1.89,1.57,7.46a108.72,108.72,0,0,1-.64,13.94l-4.65.78V388.41c0-5.59-1.86-1.86-8.38,1.86-7.44,7.44-.93,21.4-.93,21.4s-5.58.93-6.51.93c-3.72-17.68,0-25.12,4.65-27s4.66-3.72,4.66-3.72" + transform="translate(1.64)"/> + <polygon class="cls-2" points="339.59 306.51 557.37 305.58 557.37 307.44 339.59 308.42 339.59 306.51"/> + <polyline class="cls-2" points="339.59 306.51 431.73 271.14 561.09 270.21"/> + <polyline class="cls-2" + points="562.95 217.16 561.09 302.78 569.47 302.78 565.31 306.51 565.31 312.4 347.21 312.4 347.21 308.42"/> + <polygon class="cls-2" points="407.53 370.72 407.53 315.68 445.8 315.68 444.74 370.72 407.53 370.72"/> + <polygon class="cls-2" points="402.41 373.05 402.41 315.68 450.46 315.68 449.12 373.05 402.41 373.05"/> + <line class="cls-2" x1="547.13" y1="378.17" x2="395.43" y2="375.38"/> + <polyline class="cls-2" points="553.36 312.4 553.36 382.9 691.39 386.55"/> + <polyline class="cls-2" points="536.22 389.34 687.66 393.99 686.1 396.32 736.06 396.78 733.9 389.75 752.81 390.44"/> + <polyline class="cls-2" points="535.97 396.32 685.8 400.5 686.1 396.32"/> + <path class="cls-2" d="M734.42,395.28" transform="translate(1.64)"/> + <polyline class="cls-2" points="736.06 396.78 746.06 396.32 748.84 405.68 530.38 397.71"/> + <polyline class="cls-2" + points="748.84 405.68 748.84 412.56 530.38 404.23 530.38 397.71 535.97 396.32 536.22 389.34 547.13 384.11 547.13 378.17 528.49 384.59 528.49 394.25 479.19 392.32"/> + <polygon class="cls-2" + points="617.86 264.63 608.09 264.63 598.32 264.63 598.32 229.26 617.86 229.26 617.86 264.63"/> + <polygon class="cls-2" points="639.27 264.63 629.5 264.63 619.72 264.63 619.72 229.26 639.27 229.26 639.27 264.63"/> + <line class="cls-2" x1="629.7" y1="229.73" x2="629.7" y2="264.16"/> + <line class="cls-2" x1="619.72" y1="240.87" x2="638.8" y2="240.87"/> + <line class="cls-2" x1="619.87" y1="252.44" x2="638.8" y2="252.45"/> + <line class="cls-2" x1="608.3" y1="229.73" x2="608.3" y2="264.16"/> + <line class="cls-2" x1="598.32" y1="240.87" x2="617.4" y2="240.87"/> + <line class="cls-2" x1="598.32" y1="252.44" x2="617.4" y2="252.45"/> + <polygon class="cls-2" points="591.8 224.61 592.73 227.4 644.7 227.4 645.78 224.61 591.8 224.61"/> + <polyline class="cls-2" points="594.33 227.4 594.33 266.92 597.21 266.92 597.21 227.4"/> + <polyline class="cls-2" points="640.87 227.4 640.87 266.92 643.75 266.92 643.75 227.4"/> + <polygon class="cls-2" points="591.8 266.92 645.78 266.92 645.78 269.16 591.8 269.69 591.8 266.92"/> + <polygon class="cls-2" + points="730.77 261.78 720.61 261.78 710.45 261.78 710.45 226.42 730.77 226.42 730.77 261.78"/> + <polygon class="cls-2" points="753.02 261.78 742.86 261.78 732.7 261.78 732.7 226.42 753.02 226.42 753.02 261.78"/> + <line class="cls-2" x1="743.07" y1="226.88" x2="743.07" y2="261.32"/> + <line class="cls-2" x1="732.7" y1="238.03" x2="752.53" y2="238.03"/> + <line class="cls-2" x1="732.85" y1="249.59" x2="752.53" y2="249.61"/> + <line class="cls-2" x1="720.82" y1="226.88" x2="720.82" y2="261.32"/> + <line class="cls-2" x1="710.45" y1="238.03" x2="730.28" y2="238.03"/> + <line class="cls-2" x1="710.45" y1="249.59" x2="730.28" y2="249.61"/> + <polygon class="cls-2" points="703.68 221.76 704.64 224.56 758.66 224.56 759.79 221.76 703.68 221.76"/> + <polyline class="cls-2" points="706.31 224.56 706.31 264.07 709.3 264.07 709.3 224.56"/> + <polyline class="cls-2" points="754.68 224.56 754.68 264.07 757.67 264.07 757.67 224.56"/> + <polygon class="cls-2" points="703.68 264.07 759.79 264.07 759.79 266.31 703.68 266.85 703.68 264.07"/> + <polygon class="cls-2" points="858.65 260.7 847.65 260.7 836.65 260.7 836.65 224.28 858.65 224.28 858.65 260.7"/> + <polygon class="cls-2" points="882.75 260.7 871.75 260.7 860.75 260.7 860.75 224.28 882.75 224.28 882.75 260.7"/> + <line class="cls-2" x1="871.98" y1="224.76" x2="871.98" y2="260.22"/> + <line class="cls-2" x1="860.75" y1="236.24" x2="882.23" y2="236.24"/> + <line class="cls-2" x1="860.92" y1="248.15" x2="882.23" y2="248.16"/> + <line class="cls-2" x1="847.88" y1="224.76" x2="847.88" y2="260.22"/> + <line class="cls-2" x1="836.65" y1="236.24" x2="858.13" y2="236.24"/> + <line class="cls-2" x1="836.65" y1="248.15" x2="858.13" y2="248.16"/> + <polygon class="cls-2" points="829.32 219.49 830.37 222.36 888.86 222.36 890.09 219.49 829.32 219.49"/> + <polyline class="cls-2" points="832.16 222.36 832.16 263.06 835.41 263.06 835.41 222.36"/> + <polyline class="cls-2" points="884.55 222.36 884.55 263.06 887.79 263.06 887.79 222.36"/> + <polygon class="cls-2" points="829.32 263.06 890.09 263.06 890.09 265.37 829.32 265.92 829.32 263.06"/> + <rect class="cls-2" x="735.13" y="314.88" width="18.61" height="41.88"/> + <line class="cls-2" x1="744.43" y1="314.88" x2="744.78" y2="356.76"/> + <line class="cls-2" x1="735.13" y1="325.28" x2="753.74" y2="325.28"/> + <line class="cls-2" x1="735.13" y1="335.31" x2="753.74" y2="335.31"/> + <line class="cls-2" x1="735.13" y1="345.13" x2="753.74" y2="345.13"/> + <rect class="cls-2" x="755.6" y="314.88" width="18.61" height="41.88"/> + <line class="cls-2" x1="764.91" y1="314.88" x2="765.26" y2="356.76"/> + <line class="cls-2" x1="755.6" y1="325.28" x2="774.22" y2="325.28"/> + <line class="cls-2" x1="755.6" y1="335.31" x2="774.22" y2="335.31"/> + <line class="cls-2" x1="755.6" y1="345.13" x2="774.22" y2="345.13"/> + <rect class="cls-2" x="732.34" y="313.02" width="44.67" height="45.6"/> + <rect class="cls-2" x="596.23" y="314.75" width="16.39" height="38.89"/> + <line class="cls-2" x1="604.43" y1="314.75" x2="604.73" y2="353.64"/> + <line class="cls-2" x1="596.23" y1="324.41" x2="612.62" y2="324.41"/> + <line class="cls-2" x1="596.23" y1="333.72" x2="612.62" y2="333.72"/> + <line class="cls-2" x1="596.23" y1="342.84" x2="612.62" y2="342.84"/> + <rect class="cls-2" x="614.26" y="314.75" width="16.39" height="38.89"/> + <line class="cls-2" x1="622.46" y1="314.75" x2="622.76" y2="353.64"/> + <line class="cls-2" x1="614.26" y1="324.41" x2="630.65" y2="324.41"/> + <line class="cls-2" x1="614.26" y1="333.72" x2="630.65" y2="333.72"/> + <line class="cls-2" x1="614.26" y1="342.84" x2="630.65" y2="342.84"/> + <rect class="cls-2" x="594.6" y="313.02" width="37.69" height="42.35"/> + <rect class="cls-2" x="855.29" y="317.67" width="19.63" height="41.88"/> + <line class="cls-2" x1="865.1" y1="317.67" x2="865.46" y2="359.56"/> + <line class="cls-2" x1="855.29" y1="328.08" x2="874.91" y2="328.08"/> + <line class="cls-2" x1="855.29" y1="338.11" x2="874.91" y2="338.11"/> + <line class="cls-2" x1="855.29" y1="347.92" x2="874.91" y2="347.92"/> + <rect class="cls-2" x="876.87" y="317.67" width="19.63" height="41.88"/> + <line class="cls-2" x1="886.69" y1="317.67" x2="887.05" y2="359.56"/> + <line class="cls-2" x1="876.87" y1="328.08" x2="896.5" y2="328.08"/> + <line class="cls-2" x1="876.87" y1="338.11" x2="896.5" y2="338.11"/> + <line class="cls-2" x1="876.87" y1="347.92" x2="896.5" y2="347.92"/> + <rect class="cls-2" x="853.32" y="315.81" width="45.14" height="45.6"/> + <rect class="cls-2" x="696.97" y="313.95" width="22.34" height="49.33"/> + <rect class="cls-2" x="692.32" y="310.23" width="31.64" height="67.94"/> + <rect class="cls-2" x="692.32" y="378.17" width="31.64" height="8.38"/> + <polyline class="cls-2" points="695.06 386.55 691.39 391.33 719.31 391.2 717.68 386.55"/> + <rect class="cls-2" x="730.47" y="306.51" width="13.03" height="4.65"/> + <circle class="cls-2" cx="722.1" cy="340.01" r="0.93"/> + <path class="cls-2" d="M719.53,342.8" transform="translate(1.64)"/> + <path class="cls-2" d="M720.46,342.8v1.87a.93.93,0,0,1-.93.93h-4.65v-.94h5.58" transform="translate(1.64)"/> + <polyline class="cls-2" points="688.65 386.47 688.65 306.51 727.92 306.51 727.92 388.94"/> + <path class="cls-2" + d="M751.3,373.52h14.34a.09.09,0,0,1,.08.14c-.9,1.08-6.79,7.51-14.46-.05A.05.05,0,0,1,751.3,373.52Z" + transform="translate(1.64)"/> + <path class="cls-2" d="M765.83,373.52s.23,1.86-.7,18.61c-8.37,4.65-14-1.69-14-1.69V373.52" + transform="translate(1.64)"/> + <line class="cls-2" x1="385.26" y1="346.49" x2="385.26" y2="371.4"/> + <line class="cls-2" x1="345.17" y1="351.18" x2="345.17" y2="400.04"/> + <path class="cls-2" d="M749.31,185.52,904.73,179l79.11,14.89L816,199.48l-294.52,8.37s0,0,0,0l52-16.7,157.81-4.6" + transform="translate(1.64)"/> + <polygon class="cls-4" points="732.8 156.42 749.82 156.67 750.95 189.24 732.8 189.24 732.8 156.42"/> + <polygon class="cls-2" points="526.66 210.65 526.66 215.38 985.48 201.3 985.48 197.03 526.66 210.65"/> + <polyline class="cls-2" points="961.16 202.04 985.48 207.85 992 194.83 982.36 193.31"/> + <polyline class="cls-2" points="522.93 207.85 522.93 216.8 526.66 218.37 526.66 222.92 545.6 215.39"/> + <polyline class="cls-2" points="569.47 302.78 956.63 301.85 954.77 202.27"/> + <path class="cls-2" d="M947.54,301.85c.39.93-.38,94.93-.38,94.93l-182-4.65" transform="translate(1.64)"/> + <polyline class="cls-2" points="939.88 396.78 940.81 409.81 775.7 406.38"/> + <polyline class="cls-2" points="956.69 288.36 1060.62 315.81 1057.63 324.41 956.5 296.04"/> + <polyline class="cls-2" points="1028.18 316.74 1034.81 406.09 985.48 407.87"/> + <line class="cls-2" x1="1031.15" y1="405.84" x2="1031.15" y2="415.98"/> + <line class="cls-2" x1="562.84" y1="222.36" x2="954.7" y2="212.83"/> + <line class="cls-2" x1="561.56" y1="275.79" x2="955.63" y2="273.32"/> + <line class="cls-2" x1="562.68" y1="229.73" x2="594.13" y2="229.26"/> + <line class="cls-2" x1="643.75" y1="229.26" x2="706.74" y2="228.33"/> + <line class="cls-2" x1="757.67" y1="226.88" x2="831.58" y2="224.76"/> + <line class="cls-2" x1="887.79" y1="224.28" x2="954.7" y2="222.36"/> + <line class="cls-2" x1="562.68" y1="239.03" x2="594.13" y2="238.57"/> + <line class="cls-2" x1="643.75" y1="238.57" x2="706.74" y2="237.64"/> + <line class="cls-2" x1="757.67" y1="236.19" x2="831.58" y2="234.07"/> + <line class="cls-2" x1="887.79" y1="233.59" x2="954.7" y2="231.67"/> + <line class="cls-2" x1="562.68" y1="250.2" x2="594.13" y2="249.74"/> + <line class="cls-2" x1="643.75" y1="249.74" x2="706.74" y2="248.8"/> + <line class="cls-2" x1="757.67" y1="247.36" x2="831.58" y2="245.23"/> + <line class="cls-2" x1="887.79" y1="244.76" x2="954.7" y2="242.84"/> + <line class="cls-2" x1="562.68" y1="260.44" x2="594.13" y2="259.97"/> + <line class="cls-2" x1="643.75" y1="259.97" x2="706.74" y2="259.04"/> + <line class="cls-2" x1="757.67" y1="257.6" x2="831.58" y2="255.47"/> + <line class="cls-2" x1="887.79" y1="254.99" x2="954.7" y2="253.08"/> + <line class="cls-5" x1="561.75" y1="268.81" x2="592.27" y2="268.35"/> + <line class="cls-6" x1="645.32" y1="268.35" x2="829.59" y2="265.56"/> + <line class="cls-7" x1="890.09" y1="263.37" x2="954.7" y2="261.45"/> + <line class="cls-2" x1="574.06" y1="302.78" x2="574.06" y2="383.4"/> + <line class="cls-2" x1="580.32" y1="302.78" x2="580.32" y2="383.25"/> + <line class="cls-2" x1="587.43" y1="302.74" x2="587.43" y2="383.4"/> + <line class="cls-2" x1="559.84" y1="312.56" x2="559.84" y2="383.25"/> + <line class="cls-2" x1="566.96" y1="305.11" x2="566.96" y2="383.4"/> + <line class="cls-2" x1="634.55" y1="302.78" x2="634.61" y2="385.15"/> + <line class="cls-2" x1="640.81" y1="302.78" x2="640.81" y2="385.15"/> + <line class="cls-2" x1="647.93" y1="302.74" x2="647.93" y2="385.15"/> + <line class="cls-2" x1="655.03" y1="302.78" x2="655.03" y2="386.08"/> + <line class="cls-2" x1="661.29" y1="302.78" x2="661.29" y2="386.08"/> + <line class="cls-2" x1="668.4" y1="302.74" x2="668.4" y2="386.08"/> + <line class="cls-2" x1="674.57" y1="302.78" x2="674.57" y2="386.08"/> + <line class="cls-2" x1="680.83" y1="302.78" x2="680.83" y2="386.08"/> + <line class="cls-2" x1="594.53" y1="355.38" x2="594.53" y2="384.22"/> + <line class="cls-2" x1="600.79" y1="355.38" x2="600.79" y2="384.16"/> + <line class="cls-2" x1="607.91" y1="355.37" x2="607.91" y2="384.22"/> + <line class="cls-2" x1="615.01" y1="355.38" x2="615.01" y2="384.22"/> + <line class="cls-2" x1="621.27" y1="355.38" x2="621.27" y2="384.16"/> + <line class="cls-2" x1="628.1" y1="355.37" x2="628.1" y2="385.15"/> + <line class="cls-2" x1="594.53" y1="302.75" x2="594.53" y2="312.56"/> + <line class="cls-2" x1="600.79" y1="302.75" x2="600.79" y2="312.54"/> + <line class="cls-2" x1="607.91" y1="302.74" x2="607.91" y2="312.56"/> + <line class="cls-2" x1="615.01" y1="302.75" x2="615.01" y2="312.56"/> + <line class="cls-2" x1="621.27" y1="302.75" x2="621.27" y2="312.54"/> + <line class="cls-2" x1="628.38" y1="302.74" x2="628.38" y2="312.56"/> + <line class="cls-2" x1="802.07" y1="301.86" x2="802.07" y2="392.59"/> + <line class="cls-8" x1="808.33" y1="301.86" x2="808.33" y2="393.35"/> + <line class="cls-8" x1="815.45" y1="301.81" x2="815.45" y2="393.53"/> + <line class="cls-8" x1="822.55" y1="301.86" x2="822.55" y2="393.53"/> + <line class="cls-9" x1="828.81" y1="301.86" x2="828.81" y2="393.53"/> + <line class="cls-8" x1="835.92" y1="301.81" x2="835.92" y2="393.53"/> + <line class="cls-10" x1="842.09" y1="301.86" x2="842.09" y2="393.53"/> + <line class="cls-9" x1="848.35" y1="301.86" x2="848.35" y2="393.53"/> + <line class="cls-2" x1="855.47" y1="301.81" x2="855.47" y2="315.35"/> + <line class="cls-2" x1="780.67" y1="302.32" x2="780.67" y2="392.59"/> + <line class="cls-2" x1="787.86" y1="302.32" x2="787.86" y2="392.43"/> + <line class="cls-2" x1="794.97" y1="302.32" x2="794.97" y2="392.59"/> + <line class="cls-2" x1="755.54" y1="358.16" x2="755.54" y2="373.05"/> + <line class="cls-2" x1="762.73" y1="358.18" x2="762.73" y2="373.05"/> + <line class="cls-2" x1="769.84" y1="359.09" x2="769.84" y2="391.66"/> + <line class="cls-2" x1="775.08" y1="359.11" x2="775.08" y2="392.59"/> + <line class="cls-2" x1="734.14" y1="359.09" x2="734.14" y2="389.8"/> + <line class="cls-2" x1="741.33" y1="359.09" x2="741.33" y2="389.75"/> + <line class="cls-2" x1="748.44" y1="358.16" x2="748.44" y2="389.8"/> + <line class="cls-2" x1="757.4" y1="302.32" x2="757.4" y2="312.56"/> + <line class="cls-2" x1="764.59" y1="302.32" x2="764.59" y2="312.56"/> + <line class="cls-2" x1="771.71" y1="302.62" x2="771.71" y2="313.19"/> + <line class="cls-2" x1="736" y1="302.62" x2="736" y2="306.04"/> + <line class="cls-2" x1="743.19" y1="302.62" x2="743.19" y2="306.97"/> + <line class="cls-2" x1="750.3" y1="302.32" x2="750.3" y2="312.58"/> + <line class="cls-2" x1="882.11" y1="301.82" x2="882.11" y2="315.35"/> + <line class="cls-2" x1="888.37" y1="301.82" x2="888.37" y2="315.32"/> + <line class="cls-2" x1="895.49" y1="301.81" x2="895.49" y2="315.35"/> + <line class="cls-2" x1="902.59" y1="301.86" x2="902.59" y2="395.39"/> + <line class="cls-2" x1="908.85" y1="301.86" x2="908.85" y2="395.21"/> + <line class="cls-2" x1="915.96" y1="301.81" x2="915.96" y2="395.39"/> + <line class="cls-2" x1="922.13" y1="301.86" x2="922.13" y2="396.32"/> + <line class="cls-2" x1="928.39" y1="301.86" x2="928.39" y2="396.14"/> + <line class="cls-2" x1="935.51" y1="301.81" x2="935.51" y2="396.32"/> + <line class="cls-2" x1="943.88" y1="301.81" x2="943.88" y2="396.32"/> + <line class="cls-2" x1="861.64" y1="301.96" x2="861.64" y2="315.35"/> + <line class="cls-2" x1="867.9" y1="301.96" x2="867.9" y2="315.32"/> + <line class="cls-2" x1="875.01" y1="301.95" x2="875.01" y2="315.35"/> + <line class="cls-11" x1="855.47" y1="360.95" x2="855.47" y2="394.46"/> + <line class="cls-12" x1="882.11" y1="361.9" x2="882.11" y2="395.39"/> + <line class="cls-13" x1="888.37" y1="361.88" x2="888.37" y2="395.33"/> + <line class="cls-12" x1="895.49" y1="361.88" x2="895.49" y2="395.39"/> + <line class="cls-14" x1="861.64" y1="360.97" x2="861.64" y2="394.46"/> + <line class="cls-14" x1="867.9" y1="360.97" x2="867.9" y2="394.39"/> + <line class="cls-14" x1="875.01" y1="360.95" x2="875.01" y2="394.46"/> + <path class="cls-2" + d="M516.82,364.18v-7.39s3.72-4.71,7.45-4.71,6.51,2.79,5.58,4.66-.93,7.44-.93,7.44A15.35,15.35,0,0,1,516.82,364.18Z" + transform="translate(1.64)"/> + <path class="cls-2" d="M516.82,365.42V377s6.52,2.09,12.1.23v-13" transform="translate(1.64)"/> + <path class="cls-2" d="M523.43,363s2.7.3,2.7-.63-1.68-2.49-2.7-1.71S523.43,363,523.43,363Z" + transform="translate(1.64)"/> + <line class="cls-15" x1="407.53" y1="358.53" x2="444.97" y2="358.53"/> + <line class="cls-15" x1="374.65" y1="313.02" x2="374.65" y2="342.26"/> + <line class="cls-15" x1="382.56" y1="312.4" x2="382.56" y2="344.43"/> + <line class="cls-15" x1="390.91" y1="312.56" x2="390.91" y2="371.46"/> + <line class="cls-15" x1="399.29" y1="312.56" x2="399.29" y2="371.46"/> + <line class="cls-2" x1="454.99" y1="312.09" x2="453.27" y2="375.84"/> + <line class="cls-2" x1="463.37" y1="313.02" x2="461.64" y2="376.77"/> + <line class="cls-16" x1="480.12" y1="313.02" x2="478.4" y2="376.77"/> + <line class="cls-16" x1="471.75" y1="313.02" x2="470.02" y2="376.77"/> + <line class="cls-16" x1="489.43" y1="313.02" x2="487.7" y2="376.77"/> + <line class="cls-17" x1="497.81" y1="312.56" x2="496.08" y2="377.7"/> + <line class="cls-17" x1="514.56" y1="312.56" x2="512.83" y2="377.7"/> + <line class="cls-17" x1="506.18" y1="312.56" x2="504.45" y2="377.7"/> + <line class="cls-2" x1="521.7" y1="312.4" x2="521.7" y2="353.64"/> + <line class="cls-2" x1="530.38" y1="312.4" x2="529.88" y2="353.28"/> + <line class="cls-2" x1="537.35" y1="312.4" x2="536.22" y2="377.7"/> + <line class="cls-2" x1="545.89" y1="312.09" x2="544.18" y2="378.11"/> + <polyline class="cls-2" points="552.01 312.4 552.01 383.25 554 382.92"/> + <line class="cls-2" x1="960.96" y1="297.29" x2="962.21" y2="385.15"/> + <line class="cls-2" x1="975.68" y1="301.42" x2="975.24" y2="394.46"/> + <line class="cls-2" x1="990.45" y1="305.56" x2="990.45" y2="407.87"/> + <line class="cls-2" x1="1004.09" y1="309.3" x2="1005.96" y2="407.49"/> + <line class="cls-2" x1="1016.51" y1="313.01" x2="1019.92" y2="407.02"/> + <path class="cls-2" + d="M946,414.88q-3.35-10.53-6.36-21.17c4.91,5.55,5.88,13.66,10.36,19.56l-3.44-19.6a3.29,3.29,0,0,1,.27-2.59c1.35,1.32,1.7,3.33,2.06,5.18a82.64,82.64,0,0,0,4.21,14.63,3,3,0,0,0,1.51,1.94c1.26-7.83-.92-15.83-.32-23.74.55,7.4,1.13,14.89,3.38,22a6.86,6.86,0,0,0,.91-2.43l3-12.65a142,142,0,0,1-1.91,16.43l5.72-13c.82,4.36-1.47,8.78-1.09,13.21,1.13-1,1.53-2.57,2-4a25.27,25.27,0,0,1,4.37-8L967.14,415q4.1-5.27,8.52-10.26c.77,3.36-2,6.57-2,10l6.72-7.18c.75,1.66-.51,3.5-.8,5.3a1.58,1.58,0,0,0,0,.78c.35.94,1.73.7,2.68.35a13,13,0,0,1,6.58-.85c1.41.23,2.76.77,4.16,1.05a5.59,5.59,0,0,0,4.16-.49" + transform="translate(1.64)"/> + <path class="cls-2" + d="M944.75,412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73,1.14-.71,1.85l.08,2.86c0,.54,0,1.17-.48,1.45a1.19,1.19,0,0,1-.79.1,6.29,6.29,0,0,1-1.59-.66,2.57,2.57,0,0,0-1.66-.32,1.12,1.12,0,0,0-.9,1.26,1.54,1.54,0,0,0,1.14.86,14.76,14.76,0,0,0,5.18.22c-1.48.42-3.07.25-4.56.61a30.28,30.28,0,0,0-2.93,1.09c-2.94,1-6.17.74-9.27.44" + transform="translate(1.64)"/> + <path class="cls-2" + d="M947.83,414.31a33.48,33.48,0,0,1-1.49-6.59l-1.42-9.13c.32,0,.56.29.73.58a25.08,25.08,0,0,1,2.5,5.16c.41,1.35.59,2.77,1,4.11.54,1.66,1.48,3.2,1.73,4.93.29-5.67.6-11.35,1.38-17q1.37,5.67,2.47,11.4c.35,1.82.73,3.74,2,5.1,2-4.4,2.17-9.35,2.35-14.17.29,2.29.2,4.62.33,6.92a14.84,14.84,0,0,0,1.68,6.66,27.13,27.13,0,0,0,3.15-9.25l-.47,7.9a9.64,9.64,0,0,0,.09,2.63,3.53,3.53,0,0,0,1.77-1.76c1.25-2.22,2-4.8,3.77-6.6a59.09,59.09,0,0,0-1.52,9.25,6.7,6.7,0,0,0,2-2.44q1.43-2.43,2.82-4.87a55.44,55.44,0,0,1-1,7.48" + transform="translate(1.64)"/> + <path class="cls-2" + d="M977.47,408.1a30.9,30.9,0,0,0,4.12-7.81c.46.54.94,1.06,1.45,1.55a2.82,2.82,0,0,0,1.11.74,1.67,1.67,0,0,0,1.89-1.21,2.37,2.37,0,0,0-.73-2.25,4.14,4.14,0,0,0-2.23-1,5.93,5.93,0,0,0,2.69-1.92,2,2,0,0,0-.55-2.91,2.22,2.22,0,0,0-2.24.53,4.05,4.05,0,0,0-1.4,2.76,3.16,3.16,0,0,0-1.69-1.44,2.62,2.62,0,0,0-2.58,1.51,2.39,2.39,0,0,0-.41,1.36,2,2,0,0,0,1.59,1.59,5.74,5.74,0,0,0,2.4-.14" + transform="translate(1.64)"/> + <path class="cls-2" + d="M971.64,406.82a43.28,43.28,0,0,0,3.46-8.65,4.59,4.59,0,0,1,.75-1.93c.22-.26.49-.46.72-.7a2.81,2.81,0,0,0,.78-2,1.32,1.32,0,0,0-.14-.65c-.4-.65-1.4-.42-2,0a5.88,5.88,0,0,0-2,2.5,3.57,3.57,0,0,0-2.72-1.69,1.63,1.63,0,0,0-1.62.65c-.39.71.16,1.59.81,2.07a4.73,4.73,0,0,0,3.82.81" + transform="translate(1.64)"/> + <path class="cls-2" + d="M963.59,401.9c.53-2.47,2.15-4.58,2.73-7a22.71,22.71,0,0,1,.71-3.17c.31-.76.83-1.57.56-2.35a1.6,1.6,0,0,0-2.39-.56,2.69,2.69,0,0,0-.88,2.57,2.07,2.07,0,0,0-2.62-.2,1.6,1.6,0,0,0,0,2.46c.83.56,1.94.07,2.82-.42l3.11-1.75a4.1,4.1,0,0,1,1.33-.56,1.39,1.39,0,0,1,1.31.43c.54.7,0,1.71-.7,2.25a3,3,0,0,1-2,.72A1.76,1.76,0,0,1,966,393" + transform="translate(1.64)"/> + <path class="cls-2" + d="M959,400.58l.28-10a2.13,2.13,0,0,0,2.34-1.35,6.17,6.17,0,0,0,.29-2.9,2.41,2.41,0,0,0-.22-1,.83.83,0,0,0-.86-.46,1.07,1.07,0,0,0-.53.41,5.66,5.66,0,0,0-.66,3.71,6.35,6.35,0,0,0-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81,0,0,0-.13.63,6,6,0,0,0,1.75,3.57,1.37,1.37,0,0,0-1.49-1.16,2.6,2.6,0,0,0-1.75,1.07,1,1,0,0,0-.27.94,1,1,0,0,0,.73.48,6.5,6.5,0,0,0,3.19,0" + transform="translate(1.64)"/> + <path class="cls-2" + d="M749.35,407.26q-1.61-3.75-2.83-7.64a17.35,17.35,0,0,1,2.34,6.77c.72-2.11.18-4.69,1.58-6.43l.29,7.35a19.69,19.69,0,0,1,3-5.28,6.47,6.47,0,0,1-1.31,2.32,3.32,3.32,0,0,0-.77,2.49,27.28,27.28,0,0,1,5.82-2.08l-1.28,2.39a4.22,4.22,0,0,1,1.4-1.64,1.47,1.47,0,0,1,2,.31c.11.18.16.38.28.55.4.59,1.31.48,1.93.13a6.34,6.34,0,0,1,1.85-1c.89-.18,1.75.37,2.66.49,1.25.18,2.51-.47,3.77-.31.76.1,1.46.49,2.22.65,1.93.39,3.9-.78,5.86-.55a19.88,19.88,0,0,1,2.71.77,14.72,14.72,0,0,0,3,.38l5.11.29" + transform="translate(1.64)"/> + <path class="cls-2" + d="M780.12,407.83c-1.9-.75-4-.4-6.06-.51a29.3,29.3,0,0,0-3.37-.2,18.26,18.26,0,0,0-4.33,1.11,26.24,26.24,0,0,1-4.87,1" + transform="translate(1.64)"/> + <path class="cls-2" + d="M749.51,404.89a26.24,26.24,0,0,1-.52-7.29,2.83,2.83,0,0,1,.9-2.22c1.15-.78,3,.28,4-.65a1.56,1.56,0,0,0,0-2.2,2.12,2.12,0,0,0-2.3-.33,3.49,3.49,0,0,0-1.68,1.75,7.58,7.58,0,0,0-.31-2.68,3.26,3.26,0,0,0-.81-1.48,1.58,1.58,0,0,0-1.56-.44,2,2,0,0,0-1,2.27,4.37,4.37,0,0,0,2.12,3.1,5.29,5.29,0,0,0-3.34-1.07,2.68,2.68,0,0,0-1.92.73,1.39,1.39,0,0,0-.07,1.89,2,2,0,0,0,1.35.42,11.89,11.89,0,0,0,3.36-.39" + transform="translate(1.64)"/> + <path class="cls-2" + d="M458.36,408.52a15.77,15.77,0,0,0,3.21-8.77,37.41,37.41,0,0,1-3.36,6.19l-.72-2.9c-.89,1-.64,3-1.88,3.52-1,.48-2.58-.37-3.27.54-.5.65-.12,1.09-.92,1.25-.41.08-1.62-.74-2-.92l-4-1.85c-.48-.22-1.05-.64-.88-1.14a.84.84,0,0,1,.4-.43c1.17-.67,2.62.11,3.69.93s2.33,1.76,3.63,1.4a.75.75,0,0,0,.35-.19.92.92,0,0,0,.13-.7,12.83,12.83,0,0,1,.54-4.69c.78,2.07.48,6.29-1.26,7.9s-5.39,2-7.44,2.76l-6.69,2.37a31.42,31.42,0,0,1-4.74,1.4" + transform="translate(1.64)"/> + <path class="cls-2" + d="M280,432.39c-2.64-1.48-5.84-1.64-8.86-1.36s-6,1-9,1.09c-5.8.2-11.55-1.81-17.34-1.36A38.31,38.31,0,0,0,250,424.9l-5.31,5.16a17,17,0,0,1-.64-4.85q-.19,2.55-.6,5.07l-2.78-3.41.82,4.41c-2.08-.84-2.37-4.53-4.62-4.53l1.58,4.85a10.65,10.65,0,0,1-2.43-3.26c-.48.45-.45,1.21-.69,1.81s-1.23,1-1.49.41a1.37,1.37,0,0,1,0-.67c.09-1.3-1-2.33-1.6-3.48a10.37,10.37,0,0,1-.91-3.94l-.84-8.84c-1.54,5.31,1.21,11,.6,16.46a57.61,57.61,0,0,0-7.24-11.28c-.44-.54-1.15-1.11-1.74-.75.07,1.62,1.23,2.95,2.33,4.13q4.26,4.53,8.74,8.84a42.88,42.88,0,0,0-13.46-7.47,67.92,67.92,0,0,0,10.92,9,37,37,0,0,0-7.24-3.05,12.59,12.59,0,0,0-7.73.19,92.59,92.59,0,0,0,17.24,2.07c0,.73-.77,1.19-1.45,1.45-5.14,1.94-10.88,1.41-16.23,2.67a48.81,48.81,0,0,0-8.16,2.95" + transform="translate(1.64)"/> + <path class="cls-2" + d="M286,310.43h16.58a6.28,6.28,0,0,0,1.63-.21c2.61-.68,9.65-3.19,2-9a19.15,19.15,0,0,0-17.4-3.23c-3.95,1.18-7,3.41-8.27,5.38-1.47,2.3-1,3.06-.63,4.13s2.55,2.6,6.31,2.92" + transform="translate(1.64)"/> + <path class="cls-2" d="M288.64,286.67s3.06,1.76,1,3.73c-1.17,1.1-1.74,3,.13,4.24" transform="translate(1.64)"/> + <path class="cls-2" d="M293.54,286.26s3.06,1.76,1,3.73c-1.17,1.1-1.74,3,.13,4.24" transform="translate(1.64)"/> + <path class="cls-2" d="M298,285.89s3.06,1.76,1,3.73c-1.17,1.1-1.74,3,.13,4.24" transform="translate(1.64)"/> + <path class="cls-2" d="M289.33,298.21a3.74,3.74,0,0,0-1.41,4.21" transform="translate(1.64)"/> + <path class="cls-2" d="M295.48,297.17s-3.65,1.81-2.71,5.25" transform="translate(1.64)"/> + <path class="cls-2" d="M300.67,298s-3.13,1.35-2.58,4.4" transform="translate(1.64)"/> + <path class="cls-2" d="M352.84,77.37V85l20.25-8.78v-8c-4.46-4.15-13.71-3.19-13.71-3.19l-6.54,12.28,20.09-8.93" + transform="translate(1.64)"/> + <ellipse class="cls-2" cx="367.39" cy="67.8" rx="1.43" ry="0.64"/> + <ellipse class="cls-2" cx="366.09" cy="75.88" rx="1.59" ry="1.43"/> + <ellipse class="cls-2" cx="359.58" cy="72.74" rx="1.28" ry="0.48"/> + <path class="cls-2" d="M435.69,33.88s0,1.31-1.31,0S435.69,30,437,31.27l1.31,1.3" transform="translate(1.64)"/> + <path class="cls-2" + d="M463.78,33.23l-6.62-2.32s-7.76-1.6-14.54,0-6.28,7.54-5,8.85L439.84,42c-1.73,3.5.42,7,.42,7h3.92A5.73,5.73,0,0,1,442.87,45a2.56,2.56,0,0,1,2.61-2.62l1.31,1.31c1.31,1.31,7.84,0,7.84,0-1.31,2.61,2.61,5.23,2.61,5.23h2.62c-1.31-1.31-1.31-9.15.74-6.54s6.87,0,6.87,0L469,39.76c-2.61,0-3.92-3.92-3.92-3.92" + transform="translate(1.64)"/> + <path class="cls-2" d="M463.36,37.53s-2.44-3.51,2.71-5.45l1.52.32S467,35.28,465.48,35" transform="translate(1.64)"/> + <path class="cls-2" d="M552.45,88.32" transform="translate(1.64)"/> + <path class="cls-2" + d="M564.42,35a2.56,2.56,0,0,1-2.62-2.61c0-1.31,1.31-2.61,3.27.65h1.31c1.3,0,1.3,0,3.91,1.84s0,3.39,0,3.39a11.48,11.48,0,0,0-3.91.65c-1.31.65.17,4.06-.66,6.53-.65,2-3.26,3.27-3.26,3.27s-1,5.88-.31,7.19c1,.65,1.31,3.26,1.31,3.26h-3.62V56.53a1.28,1.28,0,0,1-1.3-1.31c0-1.3-1.15-5.88-1.47-5.88-4.09,2-10.29-.65-10.29-.65" + transform="translate(1.64)"/> + <path class="cls-2" + d="M546.78,49l-2,3v2.61a4.58,4.58,0,0,1,1.3,2.61,5.24,5.24,0,0,0,.29,2l-2.9-.65s0-2.61-1.31-2.61V53.26L540.9,52l1.3-2.62s.71-3.35-.3-4.94a4.75,4.75,0,0,1,2.92-6.81c2.48-.83,11.76,1.3,14.37,0S561.8,35,561.8,35" + transform="translate(1.64)"/> + <rect class="cls-2" x="625.42" y="67.29" width="5.69" height="1.81" rx="0.62"/> + <path class="cls-2" + d="M623.31,76.87a2.19,2.19,0,0,0-2,2.17v14a2.19,2.19,0,0,0,2.18,2.18h6.26a2.19,2.19,0,0,0,2.18-2.18V79A2.19,2.19,0,0,0,630.36,77" + transform="translate(1.64)"/> + <path class="cls-2" d="M626.63,69.1" transform="translate(1.64)"/> + <line class="cls-2" x1="633.58" y1="93.17" x2="633.58" y2="93.06"/> + <line class="cls-2" x1="626.23" y1="69.1" x2="624.71" y2="76.86"/> + <polyline class="cls-2" points="630.41 69.1 631.92 76.84 631.93 76.86"/> + <line class="cls-2" x1="631.92" y1="76.84" x2="632.04" y2="76.96"/> + <line class="cls-2" x1="625.47" y1="72.98" x2="630.78" y2="71"/> + <line class="cls-2" x1="622.96" y1="81.68" x2="633.59" y2="81.68"/> + <line class="cls-2" x1="622.96" y1="91.93" x2="633.58" y2="91.93"/> + <line class="cls-2" x1="630.48" y1="65.22" x2="630.48" y2="62.37"/> + <line class="cls-2" x1="632.55" y1="65.82" x2="634.76" y2="63.82"/> + <line class="cls-2" x1="633.33" y1="67.61" x2="636.43" y2="67.76"/> + <path class="cls-2" + d="M654.59,155.68s3.63,5.23,8.59,2.35a3.63,3.63,0,0,1-2.67,4.69s-5.73-1.81-6.49-6.49-.38-12.27,9.92-14.07a17.64,17.64,0,0,1,8.33.25l.14,0a10.27,10.27,0,0,1,5.66,4.4c.76,1.08,1.91,5.77,1.91,5.77s-6.49,3.61-13.36.36C659.36,150.45,657.84,149.73,654.59,155.68Z" + transform="translate(1.64)"/> + <path class="cls-2" d="M672.27,142.41s-6.37,2.91-2.58,11.61" transform="translate(1.64)"/> + <path class="cls-2" d="M664.15,142.12a19,19,0,0,0-2.09-2L660.62,139s6.62-1.32,8.2,2.77" + transform="translate(1.64)"/> + <ellipse class="cls-2" cx="676.08" cy="147.75" rx="0.76" ry="0.72"/> + <polygon class="cls-2" + points="275.58 202.46 275.74 205.01 290.19 204.29 290.01 201.54 275.85 202.44 275.58 202.46"/> + <polygon class="cls-2" + points="274.09 227.75 280.41 229.41 279.47 214.75 275.74 205.01 273.85 213.27 274.09 227.75"/> + <polyline class="cls-2" points="274.09 227.75 277.39 225.47 280.16 229.35"/> + <line class="cls-2" x1="276.65" y1="213.78" x2="277.39" y2="225.47"/> + <polyline class="cls-2" points="279.45 214.52 293.31 213.63 290.39 204.27"/> + <polyline class="cls-2" points="280.41 229.41 294.8 227.81 293.31 213.63"/> + <polyline class="cls-2" + points="280.93 202.12 281.1 204.67 283.94 209.17 287.38 208.95 285.01 204.27 285.09 201.85"/> + <line class="cls-2" x1="280.25" y1="226.99" x2="294.51" y2="225.1"/> + <path class="cls-2" d="M284.91,218.44a2.89,2.89,0,0,0-3.18-.13,2.45,2.45,0,1,0,2.33,4.22,3.11,3.11,0,0,0,1.49-1.75" + transform="translate(1.64)"/> + <ellipse class="cls-2" cx="287.66" cy="219.43" rx="2.41" ry="2.86" + transform="translate(-65.46 290.45) rotate(-48.66)"/> + <line class="cls-2" x1="287.32" y1="217.37" x2="291.45" y2="221.32"/> + <line class="cls-2" x1="282.03" y1="221.8" x2="286.67" y2="218.56"/> + <path class="cls-2" d="M304.82,114.56s3,1.25.9,2.75c-1.19.85-1.8,2.29,0,3.15" transform="translate(1.64)"/> + <path class="cls-2" d="M309.27,114.19s3,1.25.9,2.75c-1.19.85-1.8,2.29,0,3.15" transform="translate(1.64)"/> + <path class="cls-2" + d="M302.55,124.63h12.66a.65.65,0,0,1,.65.65v2.45a0,0,0,0,1,0,0h-14a0,0,0,0,1,0,0v-2.45A.65.65,0,0,1,302.55,124.63Z"/> + <path class="cls-2" + d="M303.59,123.08h10.28a.53.53,0,0,1,.53.53v1a0,0,0,0,1,0,0H303.06a0,0,0,0,1,0,0v-1A.53.53,0,0,1,303.59,123.08Z"/> + <path class="cls-2" d="M300.75,127.73l.28,2.52,1.36,12a.5.5,0,0,0,.49.44h8.61a.5.5,0,0,0,.49-.44l1.7-14.54" + transform="translate(1.64)"/> + <line class="cls-2" x1="315.03" y1="130.26" x2="302.67" y2="130.26"/> + <line class="cls-2" x1="303.42" y1="136.91" x2="314.25" y2="136.91"/> + <path class="cls-18" d="M394.18,150.93h1.24l3.43,10.23,3.43-10.23h1.24l-4.12,11.9h-1.1Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M405.32,150.93h1.18v11.9h-1.18Zm.81,0H413V152h-6.83Zm0,5.44h5.93v1.1h-5.93Zm0,5.36H413v1.1h-6.83Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M415.33,150.93h1.18v11.9h-1.18Zm.84,10.8H423v1.1h-6.8Z" transform="translate(1.64)"/> + <path class="cls-18" + d="M424.94,150.93h1.17v11.9h-1.17Zm.57,8.27,6.52-8.27h1.52L426,160.11Zm3.35-2.72.68-1.22,4.51,7.57h-1.41Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M436.86,162.44a3.43,3.43,0,0,1-1.42-1.5,5.25,5.25,0,0,1-.49-2.37V155.2a5.26,5.26,0,0,1,.49-2.38,3.36,3.36,0,0,1,1.42-1.49,5.19,5.19,0,0,1,4.53,0,3.43,3.43,0,0,1,1.43,1.49,5.4,5.4,0,0,1,.49,2.38v3.37a5.38,5.38,0,0,1-.49,2.37,3.51,3.51,0,0,1-1.43,1.5,5.28,5.28,0,0,1-4.53,0Zm3.89-1a2.5,2.5,0,0,0,1-1.1,4,4,0,0,0,.35-1.75v-3.48a4,4,0,0,0-.35-1.75,2.5,2.5,0,0,0-1-1.1,3.66,3.66,0,0,0-3.25,0,2.42,2.42,0,0,0-1,1.1,3.9,3.9,0,0,0-.36,1.75v3.48a3.87,3.87,0,0,0,.36,1.75,2.42,2.42,0,0,0,1,1.1,3.66,3.66,0,0,0,3.25,0Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M454.72,150.93H456v11.9h-1.18V152.61l.13.52-3.59,8.05h-.83l-3.58-7.88.12-.69v10.22h-1.18v-11.9h1.24l3.82,8.59Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M467.77,150.93H469v11.9h-1.18V152.61l.12.52-3.58,8.05h-.84L460,153.3l.12-.69v10.22H458.9v-11.9h1.23l3.82,8.59Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M472,150.93h1.18v11.9H472Zm.81,0h6.83V152h-6.83Zm0,5.44h5.93v1.1h-5.93Zm0,5.36h6.83v1.1h-6.83Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M482,150.93h1.19l6.9,10.72-.48-.33V150.93h1.18v11.89h-1.2L482.5,152l.64.47v10.33H482Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M493.82,161.49h1.34v1.34h-1.34Zm.08-10.56h1.17v9.17H493.9Z" transform="translate(1.64)"/> + <path class="cls-18" d="M394.91,180.47h.79v7.92h-.79Zm.55,0h4.44v.73h-4.44Zm0,3.69h3.84v.73h-3.84Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M401.27,180.46h.78v7.93h-.78Zm.48,3.85h2.71a1.67,1.67,0,0,0,.78-.19,1.35,1.35,0,0,0,.51-.55,1.68,1.68,0,0,0,.19-.82,1.8,1.8,0,0,0-.18-.82,1.38,1.38,0,0,0-.52-.55,1.61,1.61,0,0,0-.78-.19h-2.71v-.73h2.66a2.46,2.46,0,0,1,1.21.28,2,2,0,0,1,.81.81,2.48,2.48,0,0,1,.29,1.2,2.45,2.45,0,0,1-.29,1.2,2,2,0,0,1-.81.81,2.49,2.49,0,0,1-1.21.28h-2.66Zm2.54.49.73-.26,2,3.85h-.94Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M408.55,180.47h.78v7.92h-.78Zm.54,0h4.55v.73h-4.55Zm0,3.62h4v.73h-4Zm0,3.57h4.55v.73h-4.55Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M415.22,180.47H416v7.92h-.79Zm.76,7.19h1.79a2.36,2.36,0,0,0,1.65-.51,2.06,2.06,0,0,0,.55-1.55v-2.34a2.06,2.06,0,0,0-.55-1.55,2.36,2.36,0,0,0-1.65-.51H416v-.73h1.76a4,4,0,0,1,1.68.31,2.1,2.1,0,0,1,1,.95,3.36,3.36,0,0,1,.33,1.58v2.24a3.36,3.36,0,0,1-.33,1.58,2.17,2.17,0,0,1-1,1,4,4,0,0,1-1.68.31H416Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M424.38,180.47h.95l2.93,7.92h-.88l-2.52-7.1-2.53,7.1h-.87Zm-1.57,5.27H427v.73h-4.17Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M434.44,184.34v1.17a3.83,3.83,0,0,1-.31,1.65,2.06,2.06,0,0,1-.92,1,3.26,3.26,0,0,1-1.55.33,3.47,3.47,0,0,1-1.56-.32,2,2,0,0,1-.93-.92,3.44,3.44,0,0,1-.31-1.56v-2.34a3.91,3.91,0,0,1,.3-1.64,2.13,2.13,0,0,1,.93-1,3.22,3.22,0,0,1,1.54-.33,3,3,0,0,1,1.33.27,2.21,2.21,0,0,1,.91.78,3.55,3.55,0,0,1,.5,1.31h-.85a2.72,2.72,0,0,0-.39-.91,1.63,1.63,0,0,0-.63-.54,2,2,0,0,0-.87-.18,2.33,2.33,0,0,0-1.11.25,1.64,1.64,0,0,0-.66.74,3,3,0,0,0-.22,1.24v2.34a2.71,2.71,0,0,0,.22,1.15,1.51,1.51,0,0,0,.68.69,2.48,2.48,0,0,0,1.12.22,2.2,2.2,0,0,0,1.09-.23,1.52,1.52,0,0,0,.65-.72,3.25,3.25,0,0,0,.21-1.26v-.46h-1.92v-.73Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M441,188.39h-.79v-7.26l-1.45.91v-.82l1.13-.75H441Z" transform="translate(1.64)"/> + <path class="cls-18" + d="M442.67,187.76l3-3.91a3.37,3.37,0,0,0,.46-.75,1.76,1.76,0,0,0,.16-.65h0a1.27,1.27,0,0,0-.37-1,1.43,1.43,0,0,0-1-.35,1.41,1.41,0,0,0-1,.38,1.71,1.71,0,0,0-.47,1h-.82a3.11,3.11,0,0,1,.4-1.17,2,2,0,0,1,.78-.73,2.33,2.33,0,0,1,1.11-.26,2.64,2.64,0,0,1,1.21.25,1.62,1.62,0,0,1,.76.7,2.19,2.19,0,0,1,.27,1.12h0a2.23,2.23,0,0,1-.22.85,4.79,4.79,0,0,1-.6,1l-2.63,3.37h3.49v.73h-4.47Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M452.28,185.19v.73h-3.67v-.73Z" transform="translate(1.64)"/> + <path class="cls-18" d="M455.66,188.39h-.78v-7.26l-1.46.91v-.82l1.13-.75h1.11Z" transform="translate(1.64)"/> + <path class="cls-18" + d="M460.6,184.46v.19a.74.74,0,0,1-.45.37,2.26,2.26,0,0,1-.77.12,2.06,2.06,0,0,1-1.09-.29,1.89,1.89,0,0,1-.72-.81,2.8,2.8,0,0,1-.26-1.22h0a3.06,3.06,0,0,1,.26-1.31,1.76,1.76,0,0,1,.76-.83,2.61,2.61,0,0,1,2.39,0,1.91,1.91,0,0,1,.75.84,3,3,0,0,1,.26,1.33h0a3.7,3.7,0,0,1-.11.91,5.1,5.1,0,0,1-.31,1l-.06.14a1,1,0,0,0-.07.15l-1.69,3.39h-.88Zm0-.49a1.79,1.79,0,0,0,.37-1.2h0a1.77,1.77,0,0,0-.38-1.21,1.47,1.47,0,0,0-2.1,0,1.77,1.77,0,0,0-.38,1.21h0a1.73,1.73,0,0,0,.38,1.19,1.51,1.51,0,0,0,2.11,0Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M394.91,193.87h.79v7.93h-.79Zm.56,7.2H400v.73h-4.54Z" transform="translate(1.64)"/> + <path class="cls-18" d="M403.59,193.87h.94l2.93,7.93h-.87l-2.53-7.11-2.52,7.11h-.88ZM402,199.14h4.17v.73H402Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M409.34,201.56a2.06,2.06,0,0,1-.92-1,3.61,3.61,0,0,1-.31-1.61v-5.11h.79V199a2.18,2.18,0,0,0,.49,1.56,2,2,0,0,0,1.5.52,2,2,0,0,0,1.51-.52,2.18,2.18,0,0,0,.5-1.56v-5.15h.78V199a3.76,3.76,0,0,1-.3,1.61,2.13,2.13,0,0,1-.93,1,3.47,3.47,0,0,1-1.56.32A3.39,3.39,0,0,1,409.34,201.56Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M415.43,193.86h.78v7.94h-.78Zm.48,3.85h2.71a1.55,1.55,0,0,0,.78-.19,1.29,1.29,0,0,0,.51-.55,1.68,1.68,0,0,0,.19-.82,1.8,1.8,0,0,0-.18-.82,1.23,1.23,0,0,0-.52-.54,1.51,1.51,0,0,0-.78-.2h-2.71v-.73h2.67a2.45,2.45,0,0,1,1.2.29,1.89,1.89,0,0,1,.81.8,2.48,2.48,0,0,1,.29,1.2,2.42,2.42,0,0,1-.29,1.2,2,2,0,0,1-.81.81,2.47,2.47,0,0,1-1.2.28h-2.67Zm2.55.49.72-.25,2,3.85h-.94Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M422.71,193.87h.78v7.93h-.78Zm.75,7.2h1.8a2.36,2.36,0,0,0,1.65-.52,2,2,0,0,0,.54-1.55v-2.34a2.06,2.06,0,0,0-.54-1.55,2.36,2.36,0,0,0-1.65-.51h-1.8v-.73h1.76a3.91,3.91,0,0,1,1.68.31,2.08,2.08,0,0,1,1,.95,3.39,3.39,0,0,1,.33,1.58V199a3.24,3.24,0,0,1-.34,1.58,2.1,2.1,0,0,1-1,.95,4,4,0,0,1-1.68.32h-1.76Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M431.87,193.87h.95l2.92,7.93h-.87l-2.52-7.11-2.53,7.11H429Zm-1.57,5.27h4.17v.73H430.3Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M441.93,197.74v1.17a4,4,0,0,1-.31,1.65,2.11,2.11,0,0,1-.92,1,3.29,3.29,0,0,1-1.55.33,3.61,3.61,0,0,1-1.56-.31,2.06,2.06,0,0,1-.94-.93,3.56,3.56,0,0,1-.31-1.55v-2.34a4,4,0,0,1,.31-1.65,2.08,2.08,0,0,1,.93-1,3.23,3.23,0,0,1,1.54-.32,3,3,0,0,1,1.32.26,2.09,2.09,0,0,1,.91.78,3.39,3.39,0,0,1,.51,1.31H441a2.87,2.87,0,0,0-.39-.9,1.63,1.63,0,0,0-.63-.54,2,2,0,0,0-.87-.18,2.34,2.34,0,0,0-1.11.24,1.62,1.62,0,0,0-.66.75,3,3,0,0,0-.22,1.24v2.34a2.55,2.55,0,0,0,.22,1.14,1.47,1.47,0,0,0,.68.69,2.45,2.45,0,0,0,1.12.23,2.23,2.23,0,0,0,1.09-.24,1.42,1.42,0,0,0,.64-.72,3.06,3.06,0,0,0,.22-1.26v-.46h-1.92v-.73Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M448.48,201.8h-.79v-7.27l-1.45.91v-.82l1.12-.75h1.12Z" transform="translate(1.64)"/> + <path class="cls-18" + d="M450.16,201.16l3-3.91a3.31,3.31,0,0,0,.45-.75,1.58,1.58,0,0,0,.16-.65h0a1.3,1.3,0,0,0-.36-1,1.44,1.44,0,0,0-1-.34,1.38,1.38,0,0,0-1,.37,1.71,1.71,0,0,0-.47,1.05h-.82a2.85,2.85,0,0,1,.4-1.16,2,2,0,0,1,.78-.74,2.33,2.33,0,0,1,1.11-.25,2.81,2.81,0,0,1,1.21.24,1.67,1.67,0,0,1,.76.7,2.21,2.21,0,0,1,.26,1.12h0a2.19,2.19,0,0,1-.21.85,5.5,5.5,0,0,1-.6,1l-2.63,3.38h3.49v.73h-4.47Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M459.76,198.59v.73H456.1v-.73Z" transform="translate(1.64)"/> + <path class="cls-18" d="M463.15,201.8h-.78v-7.27l-1.46.91v-.82l1.13-.75h1.11Z" transform="translate(1.64)"/> + <path class="cls-18" d="M469.05,194.53,467,201.8h-.86l2.09-7.2h-2.71v1.46h-.79v-2.19h4.32Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M396.21,215.17a3.68,3.68,0,0,1-.95-.33,3.75,3.75,0,0,1-.84-.54l.48-.62a3.47,3.47,0,0,0,1.09.65,3.71,3.71,0,0,0,1.31.22,2.67,2.67,0,0,0,1.58-.41,1.3,1.3,0,0,0,.56-1.13h0a1,1,0,0,0-.25-.72,1.5,1.5,0,0,0-.62-.41,7.84,7.84,0,0,0-1-.25h-.08l-.16,0a8.26,8.26,0,0,1-1.33-.33,1.94,1.94,0,0,1-.86-.58,1.75,1.75,0,0,1-.35-1.15h0a2.32,2.32,0,0,1,.33-1.26,2.1,2.1,0,0,1,1-.79,3.86,3.86,0,0,1,1.52-.27,4,4,0,0,1,.84.09,4.28,4.28,0,0,1,.81.27,5,5,0,0,1,.79.47l-.46.61a4.34,4.34,0,0,0-1-.54,3,3,0,0,0-1-.17,2.39,2.39,0,0,0-1.5.41,1.35,1.35,0,0,0-.54,1.15h0a.93.93,0,0,0,.27.71,1.66,1.66,0,0,0,.66.38,9.36,9.36,0,0,0,1.09.26l0,0h.18a8.4,8.4,0,0,1,1.24.35,2,2,0,0,1,.83.62,1.74,1.74,0,0,1,.33,1.12h0a2.15,2.15,0,0,1-.34,1.24,2.1,2.1,0,0,1-1,.79,4.09,4.09,0,0,1-1.57.27A5.44,5.44,0,0,1,396.21,215.17Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M402.7,215a2.13,2.13,0,0,1-.93-1,3.75,3.75,0,0,1-.31-1.61v-5.11h.79v5.15a2.12,2.12,0,0,0,.5,1.56,2,2,0,0,0,1.49.52,2,2,0,0,0,1.51-.52,2.16,2.16,0,0,0,.5-1.56v-5.15H407v5.11a3.75,3.75,0,0,1-.31,1.61,2.13,2.13,0,0,1-.93,1,3.44,3.44,0,0,1-1.56.32A3.35,3.35,0,0,1,402.7,215Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M408.78,207.27h.79l4.61,7.14-.33-.22v-6.92h.79v7.92h-.8l-4.7-7.2.43.31v6.89h-.79Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M416.6,207.27h.79v7.93h-.79Zm.76,7.2h1.79a2.36,2.36,0,0,0,1.65-.52,2,2,0,0,0,.55-1.55v-2.33a2.07,2.07,0,0,0-.55-1.56,2.36,2.36,0,0,0-1.65-.51h-1.79v-.73h1.76a4,4,0,0,1,1.68.31,2.14,2.14,0,0,1,1,.95,3.39,3.39,0,0,1,.33,1.58v2.25a3.35,3.35,0,0,1-.33,1.57,2.17,2.17,0,0,1-1,.95,4,4,0,0,1-1.68.32h-1.75Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M425.76,207.27h.95l2.93,7.93h-.88l-2.52-7.11-2.53,7.11h-.87Zm-1.57,5.27h4.17v.73h-4.17Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M435.82,211.15v1.16a3.8,3.8,0,0,1-.31,1.65,2.06,2.06,0,0,1-.92,1,3.26,3.26,0,0,1-1.55.33,3.47,3.47,0,0,1-1.56-.31,2,2,0,0,1-.93-.93,3.4,3.4,0,0,1-.31-1.55v-2.34a4,4,0,0,1,.3-1.65,2.13,2.13,0,0,1,.93-1,3.35,3.35,0,0,1,1.54-.32,3.07,3.07,0,0,1,1.33.26,2.21,2.21,0,0,1,.91.78,3.62,3.62,0,0,1,.5,1.31h-.85a2.66,2.66,0,0,0-.39-.9,1.63,1.63,0,0,0-.63-.54,2,2,0,0,0-.87-.18,2.34,2.34,0,0,0-1.11.24,1.62,1.62,0,0,0-.66.75,3,3,0,0,0-.22,1.24v2.34a2.55,2.55,0,0,0,.22,1.14,1.47,1.47,0,0,0,.68.69,2.48,2.48,0,0,0,1.12.23,2.2,2.2,0,0,0,1.09-.24,1.38,1.38,0,0,0,.64-.72,3.06,3.06,0,0,0,.22-1.26v-.45h-1.92v-.73Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M442.37,215.2h-.79v-7.27l-1.45.91V208l1.12-.75h1.12Z" transform="translate(1.64)"/> + <path class="cls-18" + d="M445.05,215a1.94,1.94,0,0,1-.82-.68,2.33,2.33,0,0,1-.39-1.08h.79a1.65,1.65,0,0,0,.27.68,1.31,1.31,0,0,0,.55.43,1.86,1.86,0,0,0,.77.15,1.53,1.53,0,0,0,1.1-.38,1.42,1.42,0,0,0,.39-1.07v-.24a1.38,1.38,0,0,0-.38-1,1.43,1.43,0,0,0-1.06-.37h-.56v-.73h.56a1.38,1.38,0,0,0,1-.32,1.23,1.23,0,0,0,.34-.91v-.24a1.28,1.28,0,0,0-.36-1,1.39,1.39,0,0,0-1-.34,1.59,1.59,0,0,0-.66.14,1.39,1.39,0,0,0-.5.41,1.76,1.76,0,0,0-.29.65H444a2.6,2.6,0,0,1,.41-1,2,2,0,0,1,.77-.66,2.29,2.29,0,0,1,1.06-.23,2.2,2.2,0,0,1,1.59.54,2,2,0,0,1,.56,1.52v.24a1.83,1.83,0,0,1-.26,1,1.6,1.6,0,0,1-.75.6,1.36,1.36,0,0,1,.84.6,2.17,2.17,0,0,1,.3,1.19v.24a2.46,2.46,0,0,1-.27,1.19,1.72,1.72,0,0,1-.77.74,2.72,2.72,0,0,1-1.23.26A2.66,2.66,0,0,1,445.05,215Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M453.79,212v.73h-3.66V212Z" transform="translate(1.64)"/> + <path class="cls-18" d="M457.18,215.2h-.78v-7.27l-1.46.91V208l1.13-.75h1.11Z" transform="translate(1.64)"/> + <path class="cls-18" d="M463.07,207.93l-2,7.27h-.86l2.09-7.2h-2.71v1.47h-.79v-2.2h4.31Z" + transform="translate(1.64)"/> + <path class="cls-19" + d="M683,282.77h60.29a.18.18,0,0,1,.18.18v10.11a5.4,5.4,0,0,1-5.4,5.4H677.5a.18.18,0,0,1-.18-.18v-9.8A5.71,5.71,0,0,1,683,282.77Z"/> + <path class="cls-18" d="M678.29,288.52h.76l1,3.19,1-3.19h.76l-1.45,4.39h-.61Z" transform="translate(1.64)"/> + <path class="cls-18" d="M682.29,288.52H683v.72h-.72Zm0,1.26H683v3.13h-.72Z" transform="translate(1.64)"/> + <path class="cls-18" + d="M683.87,289.78h.72v3.13h-.72Zm1.86,1.23a.59.59,0,0,0-.15-.43.56.56,0,0,0-.43-.16.53.53,0,0,0-.41.15.52.52,0,0,0-.15.4l-.06-.65a1.06,1.06,0,0,1,.36-.44.85.85,0,0,1,.51-.15,1,1,0,0,1,.78.33,1.49,1.49,0,0,1,.27.95v1.9h-.72Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M686.91,293.5h.27a.2.2,0,0,0,.15-.06.24.24,0,0,0,0-.18v-3.48h.73v3.58a.88.88,0,0,1-.2.61.74.74,0,0,1-.57.22h-.43Zm.47-5h.73v.72h-.73Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M689.55,292.8a1.11,1.11,0,0,1-.48-.48,1.65,1.65,0,0,1-.17-.77v-.35a1.78,1.78,0,0,1,.16-.8,1.17,1.17,0,0,1,.46-.5,1.54,1.54,0,0,1,.73-.17,1.19,1.19,0,0,1,.69.2,1.3,1.3,0,0,1,.44.58,2.53,2.53,0,0,1,.15.92v.21h-2.14v-.53h1.47v0a1,1,0,0,0-.18-.52.53.53,0,0,0-.42-.18.61.61,0,0,0-.5.21.84.84,0,0,0-.18.58v.4a.75.75,0,0,0,.19.55.78.78,0,0,0,.55.19,1.09,1.09,0,0,0,.35-.07,1.08,1.08,0,0,0,.31-.19l.48.44a1.73,1.73,0,0,1-.54.35,1.73,1.73,0,0,1-1.36,0Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M692.93,292.91a2.36,2.36,0,0,1-.47-.16,1.6,1.6,0,0,1-.4-.25l.43-.54a1.89,1.89,0,0,0,.49.25,1.46,1.46,0,0,0,.49.09,1.09,1.09,0,0,0,.5-.09.28.28,0,0,0,.17-.26.24.24,0,0,0-.08-.19.4.4,0,0,0-.22-.09l-.36-.05h-.21a2.82,2.82,0,0,1-.54-.11.68.68,0,0,1-.36-.25.88.88,0,0,1-.14-.53,1,1,0,0,1,.14-.54,1,1,0,0,1,.42-.34,2,2,0,0,1,.69-.11,1.83,1.83,0,0,1,.47,0,2.23,2.23,0,0,1,.44.13,3.11,3.11,0,0,1,.4.22l-.44.53a1.58,1.58,0,0,0-.44-.2,1.39,1.39,0,0,0-.44-.07,1,1,0,0,0-.43.08.27.27,0,0,0-.15.24.19.19,0,0,0,.08.16.44.44,0,0,0,.21.07l.35.05h.14a2.66,2.66,0,0,1,.58.1.77.77,0,0,1,.39.26.89.89,0,0,1,.16.58,1,1,0,0,1-.15.56.88.88,0,0,1-.45.34,2,2,0,0,1-.73.12A3.1,3.1,0,0,1,692.93,292.91Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M697.25,289.78H698l-1.18,3.13h-.53l-1.18-3.13h.74l.7,2.1Z" transform="translate(1.64)"/> + <path class="cls-18" d="M698.51,288.52h.72v.72h-.72Zm0,1.26h.72v3.13h-.72Z" transform="translate(1.64)"/> + <path class="cls-18" + d="M700.09,289.78h.72v3.13h-.72ZM702,291a.59.59,0,0,0-.15-.43.56.56,0,0,0-.43-.16.53.53,0,0,0-.41.15.52.52,0,0,0-.15.4l-.06-.65a1.06,1.06,0,0,1,.36-.44.84.84,0,0,1,.5-.15,1,1,0,0,1,.78.33,1.44,1.44,0,0,1,.28.95v1.9H702Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M704,292.81a1,1,0,0,1-.37-.45,1.88,1.88,0,0,1-.12-.71v-.6a1.94,1.94,0,0,1,.12-.72.91.91,0,0,1,.36-.45,1.06,1.06,0,0,1,.57-.16.86.86,0,0,1,.49.15,1,1,0,0,1,.35.42l-.06.67a.59.59,0,0,0-.07-.31.37.37,0,0,0-.18-.19.62.62,0,0,0-.71.1.74.74,0,0,0-.15.49v.6a.69.69,0,0,0,.15.48.62.62,0,0,0,.71.1.41.41,0,0,0,.18-.19.62.62,0,0,0,.07-.31l0,.69a.82.82,0,0,1-.8.55A1.07,1.07,0,0,1,704,292.81Zm0,1.25a1.1,1.1,0,0,1-.45-.37l.49-.45a.71.71,0,0,0,.27.22.8.8,0,0,0,.33.08.69.69,0,0,0,.49-.17.61.61,0,0,0,.18-.47v-3.12H706v3a1.53,1.53,0,0,1-.16.74,1.12,1.12,0,0,1-.47.47,1.6,1.6,0,0,1-.75.16A1.51,1.51,0,0,1,704,294.06Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M707.45,292.8a1.14,1.14,0,0,1-.49-.48,1.65,1.65,0,0,1-.16-.77v-.35a1.78,1.78,0,0,1,.16-.8,1.12,1.12,0,0,1,.46-.5,1.49,1.49,0,0,1,.73-.17,1.19,1.19,0,0,1,.69.2,1.29,1.29,0,0,1,.43.58,2.53,2.53,0,0,1,.15.92v.21h-2.13v-.53h1.46v0a.9.9,0,0,0-.19-.52.51.51,0,0,0-.41-.18.64.64,0,0,0-.51.21.89.89,0,0,0-.17.58v.4a.75.75,0,0,0,.19.55.77.77,0,0,0,.54.19,1.15,1.15,0,0,0,.36-.07,1.23,1.23,0,0,0,.31-.19l.47.44a1.73,1.73,0,0,1-.54.35,1.53,1.53,0,0,1-.6.12A1.57,1.57,0,0,1,707.45,292.8Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M710.21,289.78h.72v3.13h-.72Zm1.86,1.23a.59.59,0,0,0-.15-.43.56.56,0,0,0-.43-.16.53.53,0,0,0-.41.15.52.52,0,0,0-.15.4l-.06-.65a1.06,1.06,0,0,1,.36-.44.85.85,0,0,1,.51-.15,1,1,0,0,1,.78.33,1.49,1.49,0,0,1,.27.95v1.9h-.72Z" + transform="translate(1.64)"/> + <path class="cls-18" d="M718.72,288.52h.73v4.39h-.73Zm.39,1.88h2.5v.69h-2.5Zm2.07-1.88h.72v4.39h-.72Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M723,292.72a.92.92,0,0,1-.27-.73.88.88,0,0,1,.27-.7,1.25,1.25,0,0,1,.82-.23h.84l0,.56h-.88a.47.47,0,0,0-.32.09.32.32,0,0,0-.11.28.33.33,0,0,0,.14.29.76.76,0,0,0,.42.1,1.29,1.29,0,0,0,.51-.08.25.25,0,0,0,.17-.23l.06.44a.49.49,0,0,1-.18.25.75.75,0,0,1-.31.15,1.6,1.6,0,0,1-.39,0A1.17,1.17,0,0,1,723,292.72Zm1.63-1.8a.49.49,0,0,0-.16-.4.6.6,0,0,0-.44-.15,1,1,0,0,0-.35.06,1.07,1.07,0,0,0-.32.16l-.48-.41a1.21,1.21,0,0,1,.48-.33,1.81,1.81,0,0,1,.67-.12,1.55,1.55,0,0,1,.68.14,1,1,0,0,1,.44.4,1.22,1.22,0,0,1,.15.63v2h-.67Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M726.16,289.78h.73v3.13h-.73ZM728,291a.6.6,0,0,0-.16-.43.54.54,0,0,0-.43-.16.5.5,0,0,0-.55.55l-.07-.65a1.24,1.24,0,0,1,.36-.44.9.9,0,0,1,.51-.15,1,1,0,0,1,.78.33,1.49,1.49,0,0,1,.28.95v1.9H728Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M730,292.81a.93.93,0,0,1-.37-.45,1.87,1.87,0,0,1-.13-.71v-.6a1.93,1.93,0,0,1,.13-.72.91.91,0,0,1,.36-.45,1.06,1.06,0,0,1,.57-.16.86.86,0,0,1,.49.15,1.13,1.13,0,0,1,.35.42l-.07.67a.71.71,0,0,0-.06-.31.37.37,0,0,0-.18-.19.56.56,0,0,0-.3-.07.51.51,0,0,0-.41.17.74.74,0,0,0-.15.49v.6a.69.69,0,0,0,.15.48.51.51,0,0,0,.41.17.56.56,0,0,0,.3-.07.41.41,0,0,0,.18-.19.75.75,0,0,0,.06-.31l0,.69a1,1,0,0,1-.3.4.84.84,0,0,1-.5.15A1.07,1.07,0,0,1,730,292.81Zm1.33-4.29h.73v4.39h-.73Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M733.52,292.8a1.11,1.11,0,0,1-.48-.48,1.65,1.65,0,0,1-.17-.77v-.35a1.93,1.93,0,0,1,.16-.8,1.14,1.14,0,0,1,.47-.5,1.49,1.49,0,0,1,.73-.17,1.19,1.19,0,0,1,.68.2,1.24,1.24,0,0,1,.44.58,2.53,2.53,0,0,1,.15.92v.21h-2.13v-.53h1.46v0a1,1,0,0,0-.19-.52.51.51,0,0,0-.41-.18.64.64,0,0,0-.51.21.84.84,0,0,0-.18.58v.4a.76.76,0,0,0,.2.55.77.77,0,0,0,.54.19,1,1,0,0,0,.35-.07,1.29,1.29,0,0,0,.32-.19l.47.44a1.73,1.73,0,0,1-.54.35,1.73,1.73,0,0,1-1.36,0Z" + transform="translate(1.64)"/> + <path class="cls-18" + d="M737,292a.24.24,0,0,0,.06.18.21.21,0,0,0,.16.06h.22v.69h-.4a.73.73,0,0,1-.56-.21.86.86,0,0,1-.2-.62v-3.57H737Z" + transform="translate(1.64)"/> + <path class="cls-20" + d="M719.15,282.77c-.18.63-.55,1.78-1.29,3.67-1.24,3.19-3,5.09-2.47,7.14s2,3,4.82,3.84a45.51,45.51,0,0,0,4.73,1.05l-.74-.13" + transform="translate(1.64)"/> +</svg>
\ No newline at end of file diff --git a/src/wwwroot/assets/profile/innrammet.svg b/src/wwwroot/assets/profile/innrammet.svg new file mode 100644 index 0000000..4b80d53 --- /dev/null +++ b/src/wwwroot/assets/profile/innrammet.svg @@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 195.32 48.63"> + <defs> + <style>.cls-1{fill:none;stroke:#ee741e;stroke-miterlimit:10;stroke-width:3px}.cls-2{fill:#ee741e}</style> + </defs> + <path class="cls-1" + d="M24 1.5h167.33a2.49 2.49 0 012.49 2.5v21.72a21.39 21.39 0 01-21.39 21.39H4a2.49 2.49 0 01-2.5-2.5V24A22.5 22.5 0 0124 1.5z"/> + <path class="cls-2" + d="M244.67 287.43h2.21l2.9 9.27 2.89-9.27h2.21l-4.21 12.78h-1.79zM256.31 287.43h2.1v2.1h-2.1zm0 3.65h2.1v9.13h-2.1zM260.89 291.08H263v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.66 1.66 0 00-1.25-.45 1.61 1.61 0 00-1.19.42 1.56 1.56 0 00-.43 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.82 2.82 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM269.72 301.9h.78a.58.58 0 00.45-.18.78.78 0 00.16-.51v-10.13h2.1v10.42a2.51 2.51 0 01-.59 1.78 2.12 2.12 0 01-1.64.64h-1.26zm1.37-14.47h2.13v2.1h-2.13zM278.3 300.34l-.91-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.23 4.23 0 012.12-.5 3.4 3.4 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.15 2.15 0 00.56 1.59 2.19 2.19 0 001.59.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.38 1.27a5 5 0 01-1.56 1 4.52 4.52 0 01-1.74.36zM288 300.34l-.73-.15a6.67 6.67 0 01-1.39-.46 5.07 5.07 0 01-1.16-.73l1.27-1.58a5.72 5.72 0 001.42.75 4.2 4.2 0 001.41.25 3.18 3.18 0 001.46-.26.8.8 0 00.49-.75.66.66 0 00-.24-.56 1.34 1.34 0 00-.62-.26 10.1 10.1 0 00-1.05-.14h-.62a9.26 9.26 0 01-1.57-.29 2 2 0 01-1-.73 2.46 2.46 0 01-.42-1.54 2.84 2.84 0 01.42-1.58 2.51 2.51 0 011.22-1 5.28 5.28 0 012-.33 6.92 6.92 0 011.37.14 7 7 0 011.28.39 6.53 6.53 0 011.15.65l-1.25 1.53a5.57 5.57 0 00-1.3-.59 4.47 4.47 0 00-1.27-.2 2.8 2.8 0 00-1.26.23.78.78 0 00-.43.71.52.52 0 00.24.46 1.64 1.64 0 00.59.21c.24 0 .58.08 1 .12h.4a11.1 11.1 0 011.68.29 2.28 2.28 0 011.13.77 2.65 2.65 0 01.47 1.68 2.92 2.92 0 01-.44 1.63 2.7 2.7 0 01-1.31 1 5.71 5.71 0 01-2.12.34zM299.78 291.08h2.13l-3.43 9.13H297l-3.43-9.13h2.13l2.06 6.12zM303.43 287.43h2.09v2.1h-2.09zm0 3.65h2.09v9.13h-2.09zM308 291.08h2.1v9.13H308zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.64 1.64 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.78 2.78 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1zM319.23 299.9a2.73 2.73 0 01-1.06-1.31 5.14 5.14 0 01-.37-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011-1.31 3 3 0 011.66-.46 2.49 2.49 0 011.41.43 3 3 0 011 1.22l-.18 1.94a2.06 2.06 0 00-.18-.9 1.39 1.39 0 00-.54-.56 1.72 1.72 0 00-.85-.19 1.52 1.52 0 00-1.22.51 2.17 2.17 0 00-.43 1.42v1.72a2.12 2.12 0 00.43 1.41 1.54 1.54 0 001.22.49 1.62 1.62 0 00.85-.2 1.39 1.39 0 00.54-.56 2 2 0 00.18-.89l.12 2a2.39 2.39 0 01-2.33 1.59 3 3 0 01-1.61-.46zm.93 4l-.84-.39a3.06 3.06 0 01-1.3-1.07l1.42-1.3a2.18 2.18 0 00.78.64 2.33 2.33 0 001 .22 2 2 0 001.41-.49 1.79 1.79 0 00.52-1.38v-9.07h2.1v8.85a4.65 4.65 0 01-.47 2.16 3.11 3.11 0 01-1.37 1.36 4.67 4.67 0 01-2.17.47zM330.3 300.34l-.91-.48a3.19 3.19 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.22 3.22 0 011.34-1.46 4.29 4.29 0 012.12-.5 3.38 3.38 0 012 .59 3.57 3.57 0 011.27 1.69 7.33 7.33 0 01.43 2.67v.6h-6.19V295h4.24v-.1a2.52 2.52 0 00-.53-1.48 1.51 1.51 0 00-1.21-.53 1.84 1.84 0 00-1.46.59 2.48 2.48 0 00-.52 1.69v1.16a1.95 1.95 0 002.14 2.15 2.86 2.86 0 001-.2 3 3 0 00.91-.55l1.39 1.27a5.19 5.19 0 01-1.56 1 4.53 4.53 0 01-1.75.36zM337.42 291.08h2.1v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.62 1.62 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.8 2.8 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1z" + transform="translate(-234.32 -270.82)"/> + <path class="cls-1" + d="M363.62 271.28c-.58 1.89-1.77 5.38-4.09 11.1-3.92 9.68-9.44 15.37-7.86 21.65s5.65 9.4 14.19 12c2.49.77 4.85 1.41 7 1.95" + transform="translate(-234.32 -270.82)"/> + <path class="cls-2" + d="M363.63 287.43h2.1v12.78h-2.1zm1.11 5.46H372v2h-7.27zm6-5.46h2.1v12.78h-2.1zM376 299.64a2.71 2.71 0 01-.78-2.12 2.5 2.5 0 01.79-2 3.56 3.56 0 012.37-.68h2.44l.13 1.63h-2.55a1.41 1.41 0 00-.94.27 1 1 0 00-.31.81.94.94 0 00.41.84 2.12 2.12 0 001.22.28 3.76 3.76 0 001.49-.22.71.71 0 00.48-.68l.19 1.3a1.59 1.59 0 01-.52.72 2.51 2.51 0 01-.9.43 4.28 4.28 0 01-1.16.15 3.47 3.47 0 01-2.36-.73zm4.74-5.22a1.53 1.53 0 00-.45-1.18 1.82 1.82 0 00-1.28-.43 3.32 3.32 0 00-1 .17 3.2 3.2 0 00-.92.47l-1.4-1.18a3.52 3.52 0 011.41-1 5.22 5.22 0 011.9-.27 4.61 4.61 0 012 .4 2.9 2.9 0 011.26 1.16 3.65 3.65 0 01.44 1.83v5.87h-1.95zM385.25 291.08h2.1v9.13h-2.1zm5.4 3.6a1.75 1.75 0 00-.44-1.27A1.66 1.66 0 00389 293a1.61 1.61 0 00-1.19.42 1.59 1.59 0 00-.42 1.18l-.19-1.89a3.38 3.38 0 011-1.28 2.56 2.56 0 011.48-.44 2.81 2.81 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM396.47 299.9a2.81 2.81 0 01-1.07-1.31 5.33 5.33 0 01-.36-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011.05-1.31 3 3 0 011.65-.46 2.55 2.55 0 011.42.43 3.17 3.17 0 011 1.22l-.19 1.94a2.06 2.06 0 00-.18-.9 1.27 1.27 0 00-.54-.56 1.7 1.7 0 00-.85-.19 1.5 1.5 0 00-1.21.51 2.11 2.11 0 00-.43 1.42v1.72a2.07 2.07 0 00.43 1.41 1.52 1.52 0 001.21.49 1.6 1.6 0 00.85-.2 1.27 1.27 0 00.54-.56 2 2 0 00.18-.89l.13 2a2.46 2.46 0 01-.88 1.15 2.4 2.4 0 01-1.45.44 2.93 2.93 0 01-1.66-.46zm3.88-12.47h2.11v12.78h-2.11zM407.54 300.34l-.92-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.26 4.26 0 012.12-.5 3.38 3.38 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.12 2.12 0 00.57 1.59 2.14 2.14 0 001.58.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.37 1.29a5 5 0 01-1.56 1 4.48 4.48 0 01-1.74.36zM416.75 297.53a.73.73 0 00.17.51.62.62 0 00.48.18h.6v2h-1.14a2.12 2.12 0 01-1.64-.63 2.53 2.53 0 01-.59-1.78v-10.38h2.1z" + transform="translate(-234.32 -270.82)"/> +</svg>
\ No newline at end of file diff --git a/src/wwwroot/assets/profile/logohvit.svg b/src/wwwroot/assets/profile/logohvit.svg new file mode 100755 index 0000000..1cafd38 --- /dev/null +++ b/src/wwwroot/assets/profile/logohvit.svg @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 595.3 841.9" style="enable-background:new 0 0 595.3 841.9;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;stroke:#EE7321;stroke-width:3;stroke-miterlimit:10;} + .st1{fill:#EE7321;} +</style> +<path class="st0" d="M369.8,442.9H201.3c-1.4,0-2.5-1.1-2.5-2.5v-20.6c0-12.4,10.1-22.5,22.5-22.5h167.3c1.4,0,2.5,1.1,2.5,2.5v21.7 + C391.1,433.4,381.6,442.9,369.8,442.9z"/> +<g> + <g> + <path class="st1" d="M207.7,412.4h2.2l2.9,9.3l2.9-9.3h2.2l-4.2,12.8h-1.8L207.7,412.4z"/> + <path class="st1" d="M219.3,412.4h2.1v2.1h-2.1V412.4z M219.3,416.1h2.1v9.1h-2.1V416.1z"/> + <path class="st1" d="M223.9,416.1h2.1v9.1h-2.1V416.1z M229.3,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4 + s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/> + <path class="st1" d="M232.7,426.9h0.8c0.2,0,0.3-0.1,0.4-0.2s0.2-0.3,0.2-0.5v-10.1h2.1v10.4c0,0.8-0.2,1.4-0.6,1.8 + s-0.9,0.6-1.6,0.6h-1.3V426.9z M234.1,412.4h2.1v2.1h-2.1V412.4z"/> + <path class="st1" d="M241.3,425.3c0,0-0.3-0.2-0.9-0.5s-1.1-0.8-1.4-1.4c-0.3-0.6-0.5-1.4-0.5-2.2v-1c0-0.9,0.2-1.7,0.5-2.3 + s0.8-1.1,1.3-1.5s1.3-0.5,2.1-0.5c0.8,0,1.4,0.2,2,0.6s1,1,1.3,1.7s0.4,1.6,0.4,2.7v0.6h-6.2V420h4.2l0-0.1 + c-0.1-0.6-0.2-1.1-0.5-1.5s-0.7-0.5-1.2-0.5c-0.6,0-1.1,0.2-1.5,0.6c-0.3,0.4-0.5,1-0.5,1.7v1.2c0,0.7,0.2,1.2,0.6,1.6 + s0.9,0.6,1.6,0.6c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5l1.4,1.3c-0.5,0.4-1,0.8-1.6,1c-0.6,0.2-1.2,0.4-1.7,0.4 + C241.7,425.3,241.3,425.3,241.3,425.3z"/> + <path class="st1" d="M251,425.3c0,0-0.2-0.1-0.7-0.2c-0.5-0.1-1-0.3-1.4-0.5s-0.8-0.4-1.2-0.7l1.3-1.6c0.5,0.3,0.9,0.6,1.4,0.7 + s1,0.3,1.4,0.3c0.6,0,1.1-0.1,1.5-0.3s0.5-0.4,0.5-0.8c0-0.3-0.1-0.4-0.2-0.6s-0.4-0.2-0.6-0.3s-0.6-0.1-1.1-0.1 + c-0.1,0-0.2,0-0.2,0s-0.2,0-0.2,0c0,0,0,0-0.1,0s0,0-0.1,0c-0.6-0.1-1.2-0.2-1.6-0.3s-0.8-0.4-1-0.7s-0.4-0.9-0.4-1.5 + c0-0.6,0.1-1.2,0.4-1.6c0.3-0.4,0.7-0.8,1.2-1c0.5-0.2,1.2-0.3,2-0.3c0.5,0,0.9,0,1.4,0.1c0.4,0.1,0.9,0.2,1.3,0.4 + s0.8,0.4,1.2,0.6l-1.3,1.5c-0.4-0.3-0.9-0.5-1.3-0.6s-0.9-0.2-1.3-0.2c-0.6,0-1,0.1-1.3,0.2s-0.4,0.4-0.4,0.7 + c0,0.2,0.1,0.4,0.2,0.5s0.4,0.2,0.6,0.2c0.2,0,0.6,0.1,1,0.1c0,0,0.1,0,0.1,0s0.1,0,0.1,0c0,0,0,0,0.1,0s0,0,0.1,0 + c0.7,0.1,1.2,0.2,1.7,0.3s0.8,0.4,1.1,0.8c0.3,0.4,0.5,0.9,0.5,1.7c0,0.6-0.1,1.2-0.4,1.6c-0.3,0.4-0.7,0.8-1.3,1 + c-0.6,0.2-1.3,0.3-2.1,0.3C251.2,425.3,251,425.3,251,425.3z"/> + <path class="st1" d="M263,416.1h2.1l-3.4,9.1h-1.5l-3.4-9.1h2.1l2.1,6.1L263,416.1z"/> + <path class="st1" d="M266.7,412.4h2.1v2.1h-2.1V412.4z M266.7,416.1h2.1v9.1h-2.1V416.1z"/> + <path class="st1" d="M271.3,416.1h2.1v9.1h-2.1V416.1z M276.7,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4 + s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/> + <path class="st1" d="M282.5,424.9c-0.5-0.3-0.8-0.7-1.1-1.3c-0.2-0.6-0.4-1.3-0.4-2.1v-1.7c0-0.8,0.1-1.5,0.4-2.1 + c0.2-0.6,0.6-1,1.1-1.3c0.5-0.3,1-0.5,1.7-0.5c0.5,0,1,0.1,1.4,0.4s0.8,0.7,1,1.2l-0.2,1.9c0-0.4-0.1-0.7-0.2-0.9 + s-0.3-0.4-0.5-0.6s-0.5-0.2-0.9-0.2c-0.5,0-0.9,0.2-1.2,0.5s-0.4,0.8-0.4,1.4v1.7c0,0.6,0.1,1.1,0.4,1.4c0.3,0.3,0.7,0.5,1.2,0.5 + c0.3,0,0.6-0.1,0.9-0.2c0.2-0.1,0.4-0.3,0.5-0.6s0.2-0.5,0.2-0.9l0.1,2c-0.2,0.5-0.5,0.9-0.9,1.1c-0.4,0.3-0.9,0.4-1.5,0.4 + C283.5,425.4,283,425.2,282.5,424.9z M283.4,428.9c0,0-0.3-0.1-0.8-0.4c-0.6-0.3-1-0.6-1.3-1.1l1.4-1.3c0.2,0.3,0.5,0.5,0.8,0.6 + s0.6,0.2,1,0.2c0.6,0,1.1-0.2,1.4-0.5c0.3-0.3,0.5-0.8,0.5-1.4v-9.1h2.1v8.9c0,0.8-0.2,1.6-0.5,2.2s-0.8,1.1-1.4,1.4 + s-1.3,0.5-2.2,0.5C283.8,428.9,283.4,428.9,283.4,428.9z"/> + <path class="st1" d="M293.6,425.3c0,0-0.3-0.2-0.9-0.5s-1.1-0.8-1.4-1.4c-0.3-0.6-0.5-1.4-0.5-2.2v-1c0-0.9,0.2-1.7,0.5-2.3 + s0.8-1.1,1.3-1.5s1.3-0.5,2.1-0.5c0.8,0,1.4,0.2,2,0.6s1,1,1.3,1.7s0.4,1.6,0.4,2.7v0.6h-6.2V420h4.2l0-0.1 + c-0.1-0.6-0.2-1.1-0.5-1.5s-0.7-0.5-1.2-0.5c-0.6,0-1.1,0.2-1.5,0.6c-0.3,0.4-0.5,1-0.5,1.7v1.2c0,0.7,0.2,1.2,0.6,1.6 + s0.9,0.6,1.6,0.6c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5l1.4,1.3c-0.5,0.4-1,0.8-1.6,1c-0.6,0.2-1.2,0.4-1.7,0.4 + C294,425.3,293.6,425.3,293.6,425.3z"/> + <path class="st1" d="M300.7,416.1h2.1v9.1h-2.1V416.1z M306.1,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4 + s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/> + </g> +</g> +<path class="st0" d="M326.6,396.3c-0.6,1.9-1.8,5.4-4.1,11.1c-3.9,9.7-9.4,15.4-7.9,21.6c1.6,6.3,5.6,9.4,14.2,12 + c2.5,0.8,4.9,1.4,7,1.9"/> +<g> + <g> + <path class="st1" d="M326.6,412.4h2.1v12.8h-2.1V412.4z M327.7,417.9h7.3v2h-7.3V417.9z M333.8,412.4h2.1v12.8h-2.1V412.4z"/> + <path class="st1" d="M339,424.6c-0.5-0.5-0.8-1.2-0.8-2.1c0-0.9,0.3-1.6,0.8-2s1.3-0.7,2.4-0.7h2.4l0.1,1.6h-2.6 + c-0.4,0-0.7,0.1-0.9,0.3s-0.3,0.4-0.3,0.8c0,0.4,0.1,0.7,0.4,0.8c0.3,0.2,0.7,0.3,1.2,0.3c0.7,0,1.2-0.1,1.5-0.2s0.5-0.4,0.5-0.7 + l0.2,1.3c-0.1,0.3-0.3,0.5-0.5,0.7s-0.5,0.3-0.9,0.4c-0.4,0.1-0.7,0.1-1.2,0.1C340.3,425.3,339.5,425.1,339,424.6z M343.8,419.4 + c0-0.5-0.2-0.9-0.5-1.2s-0.7-0.4-1.3-0.4c-0.4,0-0.7,0.1-1,0.2s-0.6,0.3-0.9,0.5l-1.4-1.2c0.4-0.4,0.8-0.7,1.4-1 + c0.6-0.2,1.2-0.3,1.9-0.3c0.8,0,1.4,0.1,2,0.4c0.6,0.3,1,0.7,1.3,1.2c0.3,0.5,0.4,1.1,0.4,1.8v5.9h-1.9V419.4z"/> + <path class="st1" d="M348.2,416.1h2.1v9.1h-2.1V416.1z M353.7,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4 + s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/> + <path class="st1" d="M359.5,424.9c-0.5-0.3-0.8-0.7-1.1-1.3c-0.2-0.6-0.4-1.3-0.4-2.1v-1.7c0-0.8,0.1-1.5,0.4-2.1 + c0.2-0.6,0.6-1,1.1-1.3c0.5-0.3,1-0.5,1.7-0.5c0.5,0,1,0.1,1.4,0.4s0.8,0.7,1,1.2l-0.2,1.9c0-0.4-0.1-0.7-0.2-0.9 + s-0.3-0.4-0.5-0.6s-0.5-0.2-0.9-0.2c-0.5,0-0.9,0.2-1.2,0.5s-0.4,0.8-0.4,1.4v1.7c0,0.6,0.1,1.1,0.4,1.4c0.3,0.3,0.7,0.5,1.2,0.5 + c0.3,0,0.6-0.1,0.9-0.2c0.2-0.1,0.4-0.3,0.5-0.6s0.2-0.5,0.2-0.9l0.1,2c-0.2,0.5-0.5,0.9-0.9,1.1c-0.4,0.3-0.9,0.4-1.5,0.4 + C360.5,425.4,359.9,425.2,359.5,424.9z M363.4,412.4h2.1v12.8h-2.1V412.4z"/> + <path class="st1" d="M370.5,425.3c0,0-0.3-0.2-0.9-0.5s-1.1-0.8-1.4-1.4c-0.3-0.6-0.5-1.4-0.5-2.2v-1c0-0.9,0.2-1.7,0.5-2.3 + s0.8-1.1,1.3-1.5s1.3-0.5,2.1-0.5c0.8,0,1.4,0.2,2,0.6s1,1,1.3,1.7s0.4,1.6,0.4,2.7v0.6h-6.2V420h4.2l0-0.1 + c-0.1-0.6-0.2-1.1-0.5-1.5s-0.7-0.5-1.2-0.5c-0.6,0-1.1,0.2-1.5,0.6c-0.3,0.4-0.5,1-0.5,1.7v1.2c0,0.7,0.2,1.2,0.6,1.6 + s0.9,0.6,1.6,0.6c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5l1.4,1.3c-0.5,0.4-1,0.8-1.6,1c-0.6,0.2-1.2,0.4-1.7,0.4 + C371,425.3,370.5,425.3,370.5,425.3z"/> + <path class="st1" d="M379.8,422.5c0,0.2,0.1,0.4,0.2,0.5s0.3,0.2,0.5,0.2h0.6v2h-1.1c-0.7,0-1.2-0.2-1.6-0.6s-0.6-1-0.6-1.8v-10.4 + h2.1V422.5z"/> + </g> +</g> +</svg> diff --git a/src/wwwroot/assets/profile/og_default.png b/src/wwwroot/assets/profile/og_default.png Binary files differnew file mode 100644 index 0000000..1254587 --- /dev/null +++ b/src/wwwroot/assets/profile/og_default.png diff --git a/src/wwwroot/assets/profile/og_default.svg b/src/wwwroot/assets/profile/og_default.svg new file mode 100644 index 0000000..4b80d53 --- /dev/null +++ b/src/wwwroot/assets/profile/og_default.svg @@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 195.32 48.63"> + <defs> + <style>.cls-1{fill:none;stroke:#ee741e;stroke-miterlimit:10;stroke-width:3px}.cls-2{fill:#ee741e}</style> + </defs> + <path class="cls-1" + d="M24 1.5h167.33a2.49 2.49 0 012.49 2.5v21.72a21.39 21.39 0 01-21.39 21.39H4a2.49 2.49 0 01-2.5-2.5V24A22.5 22.5 0 0124 1.5z"/> + <path class="cls-2" + d="M244.67 287.43h2.21l2.9 9.27 2.89-9.27h2.21l-4.21 12.78h-1.79zM256.31 287.43h2.1v2.1h-2.1zm0 3.65h2.1v9.13h-2.1zM260.89 291.08H263v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.66 1.66 0 00-1.25-.45 1.61 1.61 0 00-1.19.42 1.56 1.56 0 00-.43 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.82 2.82 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM269.72 301.9h.78a.58.58 0 00.45-.18.78.78 0 00.16-.51v-10.13h2.1v10.42a2.51 2.51 0 01-.59 1.78 2.12 2.12 0 01-1.64.64h-1.26zm1.37-14.47h2.13v2.1h-2.13zM278.3 300.34l-.91-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.23 4.23 0 012.12-.5 3.4 3.4 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.15 2.15 0 00.56 1.59 2.19 2.19 0 001.59.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.38 1.27a5 5 0 01-1.56 1 4.52 4.52 0 01-1.74.36zM288 300.34l-.73-.15a6.67 6.67 0 01-1.39-.46 5.07 5.07 0 01-1.16-.73l1.27-1.58a5.72 5.72 0 001.42.75 4.2 4.2 0 001.41.25 3.18 3.18 0 001.46-.26.8.8 0 00.49-.75.66.66 0 00-.24-.56 1.34 1.34 0 00-.62-.26 10.1 10.1 0 00-1.05-.14h-.62a9.26 9.26 0 01-1.57-.29 2 2 0 01-1-.73 2.46 2.46 0 01-.42-1.54 2.84 2.84 0 01.42-1.58 2.51 2.51 0 011.22-1 5.28 5.28 0 012-.33 6.92 6.92 0 011.37.14 7 7 0 011.28.39 6.53 6.53 0 011.15.65l-1.25 1.53a5.57 5.57 0 00-1.3-.59 4.47 4.47 0 00-1.27-.2 2.8 2.8 0 00-1.26.23.78.78 0 00-.43.71.52.52 0 00.24.46 1.64 1.64 0 00.59.21c.24 0 .58.08 1 .12h.4a11.1 11.1 0 011.68.29 2.28 2.28 0 011.13.77 2.65 2.65 0 01.47 1.68 2.92 2.92 0 01-.44 1.63 2.7 2.7 0 01-1.31 1 5.71 5.71 0 01-2.12.34zM299.78 291.08h2.13l-3.43 9.13H297l-3.43-9.13h2.13l2.06 6.12zM303.43 287.43h2.09v2.1h-2.09zm0 3.65h2.09v9.13h-2.09zM308 291.08h2.1v9.13H308zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.64 1.64 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.78 2.78 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1zM319.23 299.9a2.73 2.73 0 01-1.06-1.31 5.14 5.14 0 01-.37-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011-1.31 3 3 0 011.66-.46 2.49 2.49 0 011.41.43 3 3 0 011 1.22l-.18 1.94a2.06 2.06 0 00-.18-.9 1.39 1.39 0 00-.54-.56 1.72 1.72 0 00-.85-.19 1.52 1.52 0 00-1.22.51 2.17 2.17 0 00-.43 1.42v1.72a2.12 2.12 0 00.43 1.41 1.54 1.54 0 001.22.49 1.62 1.62 0 00.85-.2 1.39 1.39 0 00.54-.56 2 2 0 00.18-.89l.12 2a2.39 2.39 0 01-2.33 1.59 3 3 0 01-1.61-.46zm.93 4l-.84-.39a3.06 3.06 0 01-1.3-1.07l1.42-1.3a2.18 2.18 0 00.78.64 2.33 2.33 0 001 .22 2 2 0 001.41-.49 1.79 1.79 0 00.52-1.38v-9.07h2.1v8.85a4.65 4.65 0 01-.47 2.16 3.11 3.11 0 01-1.37 1.36 4.67 4.67 0 01-2.17.47zM330.3 300.34l-.91-.48a3.19 3.19 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.22 3.22 0 011.34-1.46 4.29 4.29 0 012.12-.5 3.38 3.38 0 012 .59 3.57 3.57 0 011.27 1.69 7.33 7.33 0 01.43 2.67v.6h-6.19V295h4.24v-.1a2.52 2.52 0 00-.53-1.48 1.51 1.51 0 00-1.21-.53 1.84 1.84 0 00-1.46.59 2.48 2.48 0 00-.52 1.69v1.16a1.95 1.95 0 002.14 2.15 2.86 2.86 0 001-.2 3 3 0 00.91-.55l1.39 1.27a5.19 5.19 0 01-1.56 1 4.53 4.53 0 01-1.75.36zM337.42 291.08h2.1v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.62 1.62 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.8 2.8 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1z" + transform="translate(-234.32 -270.82)"/> + <path class="cls-1" + d="M363.62 271.28c-.58 1.89-1.77 5.38-4.09 11.1-3.92 9.68-9.44 15.37-7.86 21.65s5.65 9.4 14.19 12c2.49.77 4.85 1.41 7 1.95" + transform="translate(-234.32 -270.82)"/> + <path class="cls-2" + d="M363.63 287.43h2.1v12.78h-2.1zm1.11 5.46H372v2h-7.27zm6-5.46h2.1v12.78h-2.1zM376 299.64a2.71 2.71 0 01-.78-2.12 2.5 2.5 0 01.79-2 3.56 3.56 0 012.37-.68h2.44l.13 1.63h-2.55a1.41 1.41 0 00-.94.27 1 1 0 00-.31.81.94.94 0 00.41.84 2.12 2.12 0 001.22.28 3.76 3.76 0 001.49-.22.71.71 0 00.48-.68l.19 1.3a1.59 1.59 0 01-.52.72 2.51 2.51 0 01-.9.43 4.28 4.28 0 01-1.16.15 3.47 3.47 0 01-2.36-.73zm4.74-5.22a1.53 1.53 0 00-.45-1.18 1.82 1.82 0 00-1.28-.43 3.32 3.32 0 00-1 .17 3.2 3.2 0 00-.92.47l-1.4-1.18a3.52 3.52 0 011.41-1 5.22 5.22 0 011.9-.27 4.61 4.61 0 012 .4 2.9 2.9 0 011.26 1.16 3.65 3.65 0 01.44 1.83v5.87h-1.95zM385.25 291.08h2.1v9.13h-2.1zm5.4 3.6a1.75 1.75 0 00-.44-1.27A1.66 1.66 0 00389 293a1.61 1.61 0 00-1.19.42 1.59 1.59 0 00-.42 1.18l-.19-1.89a3.38 3.38 0 011-1.28 2.56 2.56 0 011.48-.44 2.81 2.81 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM396.47 299.9a2.81 2.81 0 01-1.07-1.31 5.33 5.33 0 01-.36-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011.05-1.31 3 3 0 011.65-.46 2.55 2.55 0 011.42.43 3.17 3.17 0 011 1.22l-.19 1.94a2.06 2.06 0 00-.18-.9 1.27 1.27 0 00-.54-.56 1.7 1.7 0 00-.85-.19 1.5 1.5 0 00-1.21.51 2.11 2.11 0 00-.43 1.42v1.72a2.07 2.07 0 00.43 1.41 1.52 1.52 0 001.21.49 1.6 1.6 0 00.85-.2 1.27 1.27 0 00.54-.56 2 2 0 00.18-.89l.13 2a2.46 2.46 0 01-.88 1.15 2.4 2.4 0 01-1.45.44 2.93 2.93 0 01-1.66-.46zm3.88-12.47h2.11v12.78h-2.11zM407.54 300.34l-.92-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.26 4.26 0 012.12-.5 3.38 3.38 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.12 2.12 0 00.57 1.59 2.14 2.14 0 001.58.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.37 1.29a5 5 0 01-1.56 1 4.48 4.48 0 01-1.74.36zM416.75 297.53a.73.73 0 00.17.51.62.62 0 00.48.18h.6v2h-1.14a2.12 2.12 0 01-1.64-.63 2.53 2.53 0 01-.59-1.78v-10.38h2.1z" + transform="translate(-234.32 -270.82)"/> +</svg>
\ No newline at end of file diff --git a/src/wwwroot/assets/profile/vipps_badge.png b/src/wwwroot/assets/profile/vipps_badge.png Binary files differnew file mode 100644 index 0000000..9f04790 --- /dev/null +++ b/src/wwwroot/assets/profile/vipps_badge.png diff --git a/src/wwwroot/assets/profile/vipps_button.png b/src/wwwroot/assets/profile/vipps_button.png Binary files differnew file mode 100644 index 0000000..b76cc1d --- /dev/null +++ b/src/wwwroot/assets/profile/vipps_button.png diff --git a/src/wwwroot/backbundle.js b/src/wwwroot/backbundle.js new file mode 100644 index 0000000..136ab4e --- /dev/null +++ b/src/wwwroot/backbundle.js @@ -0,0 +1,4 @@ +import "./scripts/back/index"; +import "./scripts/back/produkter"; +import "./scripts/back/bestillinger"; +import "./scripts/back/dokumenter";
\ No newline at end of file diff --git a/src/wwwroot/backbundle.scss b/src/wwwroot/backbundle.scss new file mode 100644 index 0000000..907dfaa --- /dev/null +++ b/src/wwwroot/backbundle.scss @@ -0,0 +1,7 @@ +@import "./styles/variables"; +@import "~bootstrap/scss/bootstrap"; +@import "./styles/vendor/quill.snow"; +@import "./styles/vendor/quill.imageUploader.min"; +@import "./styles/vendor/bootstrap-icons"; +@import "./styles/base"; +@import "./styles/back";
\ No newline at end of file diff --git a/src/wwwroot/frontbundle.js b/src/wwwroot/frontbundle.js new file mode 100644 index 0000000..b84d9ec --- /dev/null +++ b/src/wwwroot/frontbundle.js @@ -0,0 +1,7 @@ +import "lazysizes/lazysizes"; +import "bootstrap/js/dist/collapse"; + +import "./scripts/front/produkter"; +import "./scripts/front/handlekurv"; +import "./scripts/front/logginn"; +import "./scripts/front/status";
\ No newline at end of file diff --git a/src/wwwroot/frontbundle.scss b/src/wwwroot/frontbundle.scss new file mode 100644 index 0000000..37b6d28 --- /dev/null +++ b/src/wwwroot/frontbundle.scss @@ -0,0 +1,6 @@ +@import "./styles/variables"; +@import "~bootstrap/scss/bootstrap"; +@import "./styles/vendor/bootstrap-side-modal"; +@import "./styles/vendor/bootstrap-icons"; +@import "./styles/base"; +@import "./styles/front"; diff --git a/src/wwwroot/manifest.json b/src/wwwroot/manifest.json new file mode 100644 index 0000000..3c03528 --- /dev/null +++ b/src/wwwroot/manifest.json @@ -0,0 +1,7 @@ +{ + "manifest_version": 2, + "name": "Vinjesvingen Handel - Kontoret", + "version": "0.1", + "start_url": "/kontoret", + "display": "minimal-ui" +}
\ No newline at end of file diff --git a/src/wwwroot/package-lock.json b/src/wwwroot/package-lock.json new file mode 100644 index 0000000..5591190 --- /dev/null +++ b/src/wwwroot/package-lock.json @@ -0,0 +1,11329 @@ +{ + "name": "wwwroot", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "@popperjs/core": "^2.5.4", + "bootstrap": "^5.0.0-beta1", + "js-search": "^2.0.0", + "lazysizes": "^5.2.2" + }, + "devDependencies": { + "autoprefixer": "^10.1.0", + "css-loader": "^5.0.1", + "extract-loader": "^5.1.0", + "file-loader": "^6.2.0", + "html-loader": "^1.3.2", + "mini-css-extract-plugin": "^1.3.3", + "node-sass-glob-importer": "^5.3.2", + "postcss": "^8.2.1", + "postcss-loader": "^4.1.0", + "quill": "^1.3.7", + "quill-blot-formatter": "^1.0.5", + "quill-image-drop-module": "^1.0.3", + "quill-image-uploader": "^1.2.2", + "sass": "^1.30.0", + "sass-loader": "^10.1.0", + "style-loader": "^2.0.0", + "ts-loader": "^8.0.12", + "typescript": "^4.1.3", + "webpack": "^5.10.1", + "webpack-cli": "^4.2.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.1.tgz", + "integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@types/eslint": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.7.tgz", + "integrity": "sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.33.tgz", + "integrity": "sha512-oJqcTrgPUF29oUP8AsUqbXGJNuPutsetaa9kTQAQce5Lx5dTYWV02ScBiT/k1BX/Z7pKeqedmvp39Wu4zR7N7g==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", + "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.5.tgz", + "integrity": "sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.3", + "caniuse-lite": "^1.0.30001196", + "colorette": "^1.2.2", + "fraction.js": "^4.0.13", + "normalize-range": "^0.1.2", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "dependencies": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "dependencies": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-add-module-exports": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "dev": true + }, + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "node_modules/babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "dependencies": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "dependencies": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "dependencies": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "dependencies": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "dependencies": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "dependencies": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.10.0" + } + }, + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "dependencies": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "node_modules/babel-preset-env/node_modules/browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "node_modules/babel-preset-env/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bootstrap": { + "version": "5.0.0-beta2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-beta2.tgz", + "integrity": "sha512-e+uPbPHqTQWKyCX435uVlOmgH9tUt0xtjvyOC7knhKgOS643BrQKuTo+KecGpPV7qlmOyZgCfaM4xxPWtDEN/g==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "@popperjs/core": "^2.6.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001198", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz", + "integrity": "sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA==", + "dev": true + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/change-case": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", + "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", + "dev": true, + "dependencies": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/change-case/node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/change-case/node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/change-case/node_modules/pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "dev": true, + "dependencies": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chrome-trace-event/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "dev": true, + "dependencies": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.1.2.tgz", + "integrity": "sha512-T7vTXHSx0KrVEg/xjcl7G01RcVXpcw4OELwDPvkr7izQNny85A84dK3dqrczuEfBcu7Yg7mdTjJLSTibRUoRZg==", + "dev": true, + "dependencies": { + "camelcase": "^6.2.0", + "cssesc": "^3.0.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.8", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-node-extract": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-node-extract/-/css-node-extract-2.1.3.tgz", + "integrity": "sha512-E7CzbC0I4uAs2dI8mPCVe+K37xuja5kjIugOotpwICFL7vzhmFMAPHvS/MF9gFrmv8DDUANsxrgyT/I3OLukcw==", + "dev": true, + "dependencies": { + "change-case": "^3.0.1", + "postcss": "^6.0.14" + } + }, + "node_modules/css-node-extract/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-node-extract/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-node-extract/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/css-node-extract/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-node-extract/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-selector-extract": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/css-selector-extract/-/css-selector-extract-3.3.6.tgz", + "integrity": "sha512-bBI8ZJKKyR9iHvxXb4t3E6WTMkis94eINopVg7y2FmmMjLXUVduD7mPEcADi4i9FX4wOypFMFpySX+0keuefxg==", + "dev": true, + "dependencies": { + "postcss": "^6.0.14" + } + }, + "node_modules/css-selector-extract/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-selector-extract/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-selector-extract/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/css-selector-extract/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-selector-extract/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz", + "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", + "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.1.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz", + "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/domutils/node_modules/domhandler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", + "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.1.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.684", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.684.tgz", + "integrity": "sha512-GV/vz2EmmtRSvfGSQ5A0Lucic//IRSDijgL15IgzbBEEnp4rfbxeUSZSlBfmsj7BQvE4sBdgfsvPzLCnp6L21w==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", + "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-5.1.0.tgz", + "integrity": "sha512-+U7sMNULTgm3d3G4hE+N7Rvr/Npsxa7M1jfgvhyYdJuOnyLepm9e2gGuriKw1mrX+mJnX4krPfKI4qyLJ5x94w==", + "dev": true, + "dependencies": { + "babel-core": "^6.26.3", + "babel-plugin-add-module-exports": "^1.0.2", + "babel-preset-env": "^1.7.0", + "babel-runtime": "^6.26.0", + "btoa": "^1.2.1", + "loader-utils": "^1.1.0", + "resolve": "^1.8.1" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/extract-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/extract-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fraction.js": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", + "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", + "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", + "dev": true, + "dependencies": { + "html-minifier-terser": "^5.1.1", + "htmlparser2": "^4.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "dev": true, + "dependencies": { + "lower-case": "^1.1.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "dev": true, + "dependencies": { + "upper-case": "^1.1.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-search": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-search/-/js-search-2.0.0.tgz", + "integrity": "sha512-lJ8KzjlwcelIWuAdKyzsXv45W6OIwRpayzc7XmU8mzgWadg5UVOKVmnq/tXudddEB9Ceic3tVaGu6QOK/eebhg==" + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/lazysizes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.0.tgz", + "integrity": "sha512-h5i4WPc2FdeTOUHBcU7eyNnOULPCC90wVho+SQTZRh9Q8lev6P0yFwKq8rvfMdBvsKsCyDQBdqoBng9FYbcR/g==" + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "dev": true, + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "dev": true, + "dependencies": { + "mime-db": "1.46.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz", + "integrity": "sha512-Ac4s+xhVbqlyhXS5J/Vh/QXUz3ycXlCqoCPpg0vdfhsIBH9eg/It/9L1r1XhSCH737M1lqcWnMuWL13zcygn5A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/node-sass-glob-importer": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/node-sass-glob-importer/-/node-sass-glob-importer-5.3.2.tgz", + "integrity": "sha512-QTX7KPsISgp55REV6pMH703nzHfWCOEYEQC0cDyTRo7XO6WDvyC0OAzekuQ4gs505IZcxv9KxZ3uPJ5s5H9D3g==", + "dev": true, + "dependencies": { + "node-sass-magic-importer": "^5.3.2" + }, + "engines": { + "node": ">=6.11.1", + "npm": ">=3.0.0" + } + }, + "node_modules/node-sass-magic-importer": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/node-sass-magic-importer/-/node-sass-magic-importer-5.3.2.tgz", + "integrity": "sha512-T3wTUdUoXQE3QN+EsyPpUXRI1Gj1lEsrySQ9Kzlzi15QGKi+uRa9fmvkcSy2y3BKgoj//7Mt9+s+7p0poMpg6Q==", + "dev": true, + "dependencies": { + "css-node-extract": "^2.1.3", + "css-selector-extract": "^3.3.6", + "findup-sync": "^3.0.0", + "glob": "^7.1.3", + "object-hash": "^1.3.1", + "postcss-scss": "^2.0.0", + "resolve": "^1.10.1" + }, + "engines": { + "node": ">=6.11.1", + "npm": ">=3.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.2.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz", + "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz", + "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-scss/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-scss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-scss/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-scss/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-scss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-scss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/quill-blot-formatter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/quill-blot-formatter/-/quill-blot-formatter-1.0.5.tgz", + "integrity": "sha1-k0yt0Q7Zz2i1SyK5nR4Kagb0R50=", + "dev": true, + "dependencies": { + "deepmerge": "^2.0.0" + }, + "peerDependencies": { + "quill": "^1.3.4" + } + }, + "node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "dev": true, + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/quill-image-drop-module": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/quill-image-drop-module/-/quill-image-drop-module-1.0.3.tgz", + "integrity": "sha1-Dl7IMp3WehISbxZrGRv2TSBXp9M=", + "dev": true, + "dependencies": { + "quill": "^1.2.2" + } + }, + "node_modules/quill-image-uploader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/quill-image-uploader/-/quill-image-uploader-1.2.2.tgz", + "integrity": "sha512-23jM2SVJC2W4hCXre4PX1hy4Lk3fBNVIognvHoyKTLl0AjQOiCSnsoIoUSnS2+9+wxvZIk6ET/cMVvtwpERa6g==", + "dev": true, + "peerDependencies": { + "quill": "^1.3.7" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/sass": { + "version": "1.32.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz", + "integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==", + "dev": true, + "dependencies": { + "chokidar": ">=2.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", + "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", + "dev": true, + "dependencies": { + "jest-worker": "^26.6.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.5.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", + "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-loader": { + "version": "8.0.17", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.17.tgz", + "integrity": "sha512-OeVfSshx6ot/TCxRwpBHQ/4lRzfgyTkvi7ghDVrLXOHzTbSK413ROgu/xNqM72i3AFeAIJgQy78FwSMKmOW68w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "*" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/ts-loader/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "dev": true, + "dependencies": { + "upper-case": "^1.1.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.24.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.24.4.tgz", + "integrity": "sha512-RXOdxF9hFFFhg47BryCgyFrEyyu7Y/75/uiI2DoUiTMqysK+WczVSTppvkR47oZcmI/DPaXCiCiaXBP8QjkNpA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.46", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.4.0", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.1", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/init": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, + "@popperjs/core": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.1.tgz", + "integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA==" + }, + "@types/eslint": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.7.tgz", + "integrity": "sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/node": { + "version": "14.14.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.33.tgz", + "integrity": "sha512-oJqcTrgPUF29oUP8AsUqbXGJNuPutsetaa9kTQAQce5Lx5dTYWV02ScBiT/k1BX/Z7pKeqedmvp39Wu4zR7N7g==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", + "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.5.tgz", + "integrity": "sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA==", + "dev": true, + "requires": { + "browserslist": "^4.16.3", + "caniuse-lite": "^1.0.30001196", + "colorette": "^1.2.2", + "fraction.js": "^4.0.13", + "normalize-range": "^0.1.2", + "postcss-value-parser": "^4.1.0" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-add-module-exports": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bootstrap": { + "version": "5.0.0-beta2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-beta2.tgz", + "integrity": "sha512-e+uPbPHqTQWKyCX435uVlOmgH9tUt0xtjvyOC7knhKgOS643BrQKuTo+KecGpPV7qlmOyZgCfaM4xxPWtDEN/g==", + "requires": {} + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001198", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz", + "integrity": "sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "change-case": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", + "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + }, + "dependencies": { + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "dev": true, + "requires": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "css-loader": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.1.2.tgz", + "integrity": "sha512-T7vTXHSx0KrVEg/xjcl7G01RcVXpcw4OELwDPvkr7izQNny85A84dK3dqrczuEfBcu7Yg7mdTjJLSTibRUoRZg==", + "dev": true, + "requires": { + "camelcase": "^6.2.0", + "cssesc": "^3.0.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.8", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + } + }, + "css-node-extract": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-node-extract/-/css-node-extract-2.1.3.tgz", + "integrity": "sha512-E7CzbC0I4uAs2dI8mPCVe+K37xuja5kjIugOotpwICFL7vzhmFMAPHvS/MF9gFrmv8DDUANsxrgyT/I3OLukcw==", + "dev": true, + "requires": { + "change-case": "^3.0.1", + "postcss": "^6.0.14" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-selector-extract": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/css-selector-extract/-/css-selector-extract-3.3.6.tgz", + "integrity": "sha512-bBI8ZJKKyR9iHvxXb4t3E6WTMkis94eINopVg7y2FmmMjLXUVduD7mPEcADi4i9FX4wOypFMFpySX+0keuefxg==", + "dev": true, + "requires": { + "postcss": "^6.0.14" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "dom-serializer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz", + "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "entities": "^2.0.0" + }, + "dependencies": { + "domhandler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", + "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", + "dev": true, + "requires": { + "domelementtype": "^2.1.0" + } + } + } + }, + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz", + "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0" + }, + "dependencies": { + "domhandler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", + "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", + "dev": true, + "requires": { + "domelementtype": "^2.1.0" + } + } + } + }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "electron-to-chromium": { + "version": "1.3.684", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.684.tgz", + "integrity": "sha512-GV/vz2EmmtRSvfGSQ5A0Lucic//IRSDijgL15IgzbBEEnp4rfbxeUSZSlBfmsj7BQvE4sBdgfsvPzLCnp6L21w==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", + "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "extract-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-5.1.0.tgz", + "integrity": "sha512-+U7sMNULTgm3d3G4hE+N7Rvr/Npsxa7M1jfgvhyYdJuOnyLepm9e2gGuriKw1mrX+mJnX4krPfKI4qyLJ5x94w==", + "dev": true, + "requires": { + "babel-core": "^6.26.3", + "babel-plugin-add-module-exports": "^1.0.2", + "babel-preset-env": "^1.7.0", + "babel-runtime": "^6.26.0", + "btoa": "^1.2.1", + "loader-utils": "^1.1.0", + "resolve": "^1.8.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fraction.js": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", + "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "html-loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", + "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", + "dev": true, + "requires": { + "html-minifier-terser": "^5.1.1", + "htmlparser2": "^4.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + } + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "dev": true, + "requires": { + "lower-case": "^1.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "dev": true, + "requires": { + "upper-case": "^1.1.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-search": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-search/-/js-search-2.0.0.tgz", + "integrity": "sha512-lJ8KzjlwcelIWuAdKyzsXv45W6OIwRpayzc7XmU8mzgWadg5UVOKVmnq/tXudddEB9Ceic3tVaGu6QOK/eebhg==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, + "lazysizes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.0.tgz", + "integrity": "sha512-h5i4WPc2FdeTOUHBcU7eyNnOULPCC90wVho+SQTZRh9Q8lev6P0yFwKq8rvfMdBvsKsCyDQBdqoBng9FYbcR/g==" + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "dev": true, + "requires": { + "lower-case": "^1.1.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "dev": true, + "requires": { + "mime-db": "1.46.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz", + "integrity": "sha512-Ac4s+xhVbqlyhXS5J/Vh/QXUz3ycXlCqoCPpg0vdfhsIBH9eg/It/9L1r1XhSCH737M1lqcWnMuWL13zcygn5A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node-sass-glob-importer": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/node-sass-glob-importer/-/node-sass-glob-importer-5.3.2.tgz", + "integrity": "sha512-QTX7KPsISgp55REV6pMH703nzHfWCOEYEQC0cDyTRo7XO6WDvyC0OAzekuQ4gs505IZcxv9KxZ3uPJ5s5H9D3g==", + "dev": true, + "requires": { + "node-sass-magic-importer": "^5.3.2" + } + }, + "node-sass-magic-importer": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/node-sass-magic-importer/-/node-sass-magic-importer-5.3.2.tgz", + "integrity": "sha512-T3wTUdUoXQE3QN+EsyPpUXRI1Gj1lEsrySQ9Kzlzi15QGKi+uRa9fmvkcSy2y3BKgoj//7Mt9+s+7p0poMpg6Q==", + "dev": true, + "requires": { + "css-node-extract": "^2.1.3", + "css-selector-extract": "^3.3.6", + "findup-sync": "^3.0.0", + "glob": "^7.1.3", + "object-hash": "^1.3.1", + "postcss-scss": "^2.0.0", + "resolve": "^1.10.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + } + } + }, + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.2.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz", + "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz", + "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "requires": { + "postcss": "^7.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "quill-blot-formatter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/quill-blot-formatter/-/quill-blot-formatter-1.0.5.tgz", + "integrity": "sha1-k0yt0Q7Zz2i1SyK5nR4Kagb0R50=", + "dev": true, + "requires": { + "deepmerge": "^2.0.0" + } + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "dev": true, + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + } + }, + "quill-image-drop-module": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/quill-image-drop-module/-/quill-image-drop-module-1.0.3.tgz", + "integrity": "sha1-Dl7IMp3WehISbxZrGRv2TSBXp9M=", + "dev": true, + "requires": { + "quill": "^1.2.2" + } + }, + "quill-image-uploader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/quill-image-uploader/-/quill-image-uploader-1.2.2.tgz", + "integrity": "sha512-23jM2SVJC2W4hCXre4PX1hy4Lk3fBNVIognvHoyKTLl0AjQOiCSnsoIoUSnS2+9+wxvZIk6ET/cMVvtwpERa6g==", + "dev": true, + "requires": {} + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sass": { + "version": "1.32.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz", + "integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", + "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "dev": true, + "requires": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", + "dev": true, + "requires": { + "jest-worker": "^26.6.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.5.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "terser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz", + "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + } + } + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-loader": { + "version": "8.0.17", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.17.tgz", + "integrity": "sha512-OeVfSshx6ot/TCxRwpBHQ/4lRzfgyTkvi7ghDVrLXOHzTbSK413ROgu/xNqM72i3AFeAIJgQy78FwSMKmOW68w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "dev": true, + "requires": { + "upper-case": "^1.1.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "watchpack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.24.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.24.4.tgz", + "integrity": "sha512-RXOdxF9hFFFhg47BryCgyFrEyyu7Y/75/uiI2DoUiTMqysK+WczVSTppvkR47oZcmI/DPaXCiCiaXBP8QjkNpA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.46", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.4.0", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.1", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "webpack-cli": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/src/wwwroot/package.json b/src/wwwroot/package.json new file mode 100644 index 0000000..090e6c5 --- /dev/null +++ b/src/wwwroot/package.json @@ -0,0 +1,35 @@ +{ + "private": true, + "scripts": { + "build": "webpack-cli --mode='production'", + "watch": "webpack-cli --watch" + }, + "devDependencies": { + "autoprefixer": "^10.1.0", + "css-loader": "^5.0.1", + "extract-loader": "^5.1.0", + "file-loader": "^6.2.0", + "html-loader": "^1.3.2", + "mini-css-extract-plugin": "^1.3.3", + "node-sass-glob-importer": "^5.3.2", + "postcss": "^8.2.1", + "postcss-loader": "^4.1.0", + "quill": "^1.3.7", + "quill-blot-formatter": "^1.0.5", + "quill-image-drop-module": "^1.0.3", + "quill-image-uploader": "^1.2.2", + "sass": "^1.30.0", + "sass-loader": "^10.1.0", + "style-loader": "^2.0.0", + "ts-loader": "^8.0.12", + "typescript": "^4.1.3", + "webpack": "^5.10.1", + "webpack-cli": "^4.2.0" + }, + "dependencies": { + "@popperjs/core": "^2.5.4", + "bootstrap": "^5.0.0-beta1", + "js-search": "^2.0.0", + "lazysizes": "^5.2.2" + } +} diff --git a/src/wwwroot/prepros.config b/src/wwwroot/prepros.config new file mode 100644 index 0000000..07c0c19 --- /dev/null +++ b/src/wwwroot/prepros.config @@ -0,0 +1,931 @@ +{ + "version": "7", + "about": "This is a Prepros (https://prepros.io) configuration file. You can commit this file to a git repo to backup and sync project configurations.", + "config": { + "proxy": { + "enable": false, + "target": "", + "useLocalAssets": false + }, + "reload": { + "enable": false, + "delay": 0, + "animate": false, + "afterUpload": false + }, + "sync": { + "enable": false, + "mouse": true, + "keyboard": true, + "form": true, + "scroll": true + }, + "watcher": { + "enable": true, + "maxFiles": 2000, + "usePolling": false, + "pollingInterval": 500, + "extensions": [ + ".html", + ".htm", + ".php" + ], + "ignore": { + "patterns": [ + ".*", + "wp-admin", + "wp-includes", + "node_modules", + "Prepros Export", + "bower_components", + "/scripts", + "/assets", + "/dist", + "/backbundle.js", + "/frontbundle.js", + "/webpack.config.js" + ], + "exceptions": [] + } + }, + "exporter": { + "ignore": { + "patterns": [ + ".*", + "desktop.ini", + "prepros.cfg", + "node_modules", + "Prepros Export", + "prepros.config", + "prepros-6.config", + "*-original.jpg", + "*-original.jpeg", + "*-original.png", + "*-original.svg", + "*.scss", + "*.sass", + "*.less", + "*.pug", + "*.jade", + "*.styl", + "*.haml", + "*.slim", + "*.coffee", + "*.kit", + "*.turf", + "*.ts" + ], + "exceptions": [] + } + }, + "uploader": { + "remotePath": "", + "timeout": 20000, + "autoUpload": false, + "reuseConnection": true, + "connectionType": "ftp", + "history": [] + }, + "packages": { + "createPackageLock": false + }, + "tasks": { + "autoprefixer": { + "cascade": true, + "add": true, + "remove": true, + "supports": true, + "flexbox": true, + "grid": "autoplace", + "browsers": [ + "> 2%", + "not dead" + ], + "sourceMap": false + }, + "babel": { + "sourceMap": false, + "presets": { + "@babel/preset-env": { + "enable": true, + "options": { + "targets": [ + "> 2%", + "not dead" + ], + "preserveImports": false, + "polyfills": true + } + }, + "@babel/preset-react": false, + "@babel/preset-flow": false + }, + "plugins": { + "@babel/plugin-proposal-class-properties": false, + "@babel/plugin-proposal-decorators": { + "enable": false, + "options": { + "decoratorsBeforeExport": true + } + }, + "@babel/plugin-proposal-export-namespace-from": false, + "@babel/plugin-proposal-function-sent": false, + "@babel/plugin-proposal-nullish-coalescing-operator": false, + "@babel/plugin-proposal-numeric-separator": false, + "@babel/plugin-proposal-optional-chaining": false, + "@babel/plugin-proposal-private-methods": false, + "@babel/plugin-proposal-throw-expressions": false + }, + "customPresets": [], + "customPlugins": [] + }, + "bundle-js": { + "sourceMap": false, + "exclude": [ + "node_modules", + "bower_components" + ], + "devMode": true, + "globals": [], + "externals": [], + "babel": { + "enable": true, + "options": { + "sourceMap": false, + "presets": { + "@babel/preset-env": { + "enable": true, + "options": { + "targets": [ + "> 2%", + "not dead" + ], + "preserveImports": false, + "polyfills": false + } + }, + "@babel/preset-react": true, + "@babel/preset-flow": false + }, + "plugins": { + "@babel/plugin-proposal-class-properties": false, + "@babel/plugin-proposal-decorators": { + "enable": false, + "options": { + "decoratorsBeforeExport": true + } + }, + "@babel/plugin-proposal-export-namespace-from": false, + "@babel/plugin-proposal-function-sent": false, + "@babel/plugin-proposal-nullish-coalescing-operator": false, + "@babel/plugin-proposal-numeric-separator": false, + "@babel/plugin-proposal-optional-chaining": false, + "@babel/plugin-proposal-private-methods": false, + "@babel/plugin-proposal-throw-expressions": false + }, + "customPresets": [], + "customPlugins": [] + } + }, + "css": { + "enable": true + }, + "fonts": { + "enable": true + } + }, + "coffeescript": { + "header": false, + "bare": false, + "sourceMap": false + }, + "command": { + "command": "", + "rootDir": "" + }, + "concat-js": { + "sourceMap": false, + "rootDir": "" + }, + "copy": { + "sourceMap": false + }, + "dart-sass": { + "indentType": "tab", + "indentWidth": 2, + "linefeed": "lf", + "sourceMap": false + }, + "haml": { + "doubleQuoteAttributes": true + }, + "jpg": { + "quality": 90 + }, + "less": { + "javascriptEnabled": false, + "strictImports": false, + "insecure": false, + "math": "always", + "strictUnits": false, + "dumpLineNumbers": false, + "sourceMap": false + }, + "markdown": { + "githubFlavored": true, + "wrapWithHtml": false + }, + "minify-css": { + "sourceMap": false + }, + "minify-html": { + "caseSensitive": false, + "collapseBooleanAttributes": true, + "collapseInlineTagWhitespace": false, + "collapseWhitespace": true, + "conservativeCollapse": false, + "decodeEntities": false, + "html5": true, + "includeAutoGeneratedTags": true, + "keepClosingSlash": false, + "minifyCSS": true, + "minifyJS": true, + "preserveLineBreaks": false, + "preventAttributesEscaping": false, + "processConditionalComments": false, + "removeAttributeQuotes": false, + "removeComments": true, + "removeEmptyAttributes": false, + "removeEmptyElement": false, + "removeOptionalTags": false, + "removeRedundantAttributes": false, + "removeScriptTypeAttributes": false, + "removeStyleLinkTypeAttributes": false, + "removeTagWhitespace": false, + "sortAttributes": false, + "sortClassName": false, + "useShortDoctype": true + }, + "minify-js": { + "parse": { + "bare_returns": false + }, + "compress": { + "arrows": true, + "arguments": false, + "booleans": true, + "booleans_as_integers": false, + "collapse_vars": true, + "comparisons": true, + "computed_props": true, + "conditionals": true, + "dead_code": true, + "directives": true, + "drop_console": false, + "drop_debugger": true, + "evaluate": true, + "expression": false, + "global_defs": [], + "hoist_funs": false, + "hoist_props": true, + "hoist_vars": false, + "if_return": true, + "inline": 3, + "join_vars": true, + "keep_fargs": true, + "keep_infinity": false, + "loops": true, + "negate_iife": true, + "properties": true, + "pure_funcs": [], + "pure_getters": false, + "reduce_vars": true, + "sequences": true, + "side_effects": true, + "switches": true, + "top_retain": [], + "typeofs": true, + "unsafe": false, + "unsafe_arrows": false, + "unsafe_comps": false, + "unsafe_Function": false, + "unsafe_math": false, + "unsafe_proto": false, + "unsafe_regexp": false, + "unsafe_undefined": false, + "unused": false + }, + "mangle": { + "eval": false, + "reserved": [] + }, + "output": { + "ascii_only": false, + "braces": false, + "comments": "none", + "inline_script": true, + "keep_numbers": false, + "keep_quoted_props": false, + "preamble": null, + "quote_keys": false, + "quote_style": 0, + "semicolons": true, + "shebang": true, + "webkit": false, + "wrap_iife": false, + "wrap_func_args": true + }, + "sourceMap": false, + "toplevel": false, + "ie8": false, + "keep_classnames": false, + "keep_fnames": false, + "safari10": false + }, + "node-sass": { + "indentType": "space", + "indentWidth": 2, + "linefeed": "lf", + "outputStyle": "expanded", + "precision": 10, + "sourceMap": false, + "sourceComments": false + }, + "png": { + "quality": 90 + }, + "postcss-import": { + "ignoreKeywords": [], + "sourceMap": false + }, + "postcss-preset-env": { + "stage": 2, + "browsers": [ + "> 2%", + "not dead" + ], + "sourceMap": false + }, + "pug": { + "pretty": false + }, + "slim": { + "indent": "space", + "indentSize": 2, + "pretty": true + }, + "stylus": { + "useNib": true, + "sourceMap": false, + "linenos": false + }, + "svg": { + "cleanupAttrs": true, + "removeDoctype": true, + "removeXMLProcInst": true, + "removeComments": true, + "removeMetadata": true, + "removeTitle": true, + "removeDesc": true, + "removeUselessDefs": true, + "removeEditorsNSData": true, + "removeEmptyAttrs": true, + "removeHiddenElems": true, + "removeEmptyText": true, + "removeEmptyContainers": true, + "removeViewBox": false, + "cleanupEnableBackground": true, + "convertStyleToAttrs": true, + "convertColors": true, + "convertPathData": true, + "convertTransform": true, + "removeUnknownsAndDefaults": true, + "removeNonInheritableGroupAttrs": true, + "removeUselessStrokeAndFill": true, + "removeUnusedNS": true, + "cleanupIDs": true, + "cleanupNumericValues": true, + "moveElemsAttrsToGroup": true, + "moveGroupAttrsToElems": true, + "collapseGroups": true, + "removeRasterImages": false, + "mergePaths": true, + "convertShapeToPath": true, + "sortAttrs": true, + "removeDimensions": true + }, + "turf": { + "rootDir": "" + }, + "typescript": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "allowUmdGlobalAccess": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "alwaysStrict": false, + "charset": "utf8", + "checkJs": false, + "declaration": false, + "disableSizeLimit": false, + "downlevelIteration": false, + "emitBOM": false, + "emitDecoratorMetadata": false, + "experimentalDecorators": false, + "forceConsistentCasingInFileNames": false, + "importHelpers": false, + "jsx": "React", + "keyofStringsOnly": false, + "lib": [], + "maxNodeModuleJsDepth": 0, + "module": "ES2015", + "moduleResolution": "NodeJs", + "newLine": "LineFeed", + "noFallthroughCasesInSwitch": false, + "noImplicitAny": false, + "noImplicitReturns": false, + "noImplicitThis": false, + "noStrictGenericChecks": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitUseStrict": false, + "noLib": false, + "noResolve": false, + "preserveConstEnums": false, + "jsxFactory": "React.createElement", + "removeComments": false, + "skipLibCheck": false, + "sourceMap": false, + "strict": false, + "strictFunctionTypes": false, + "strictBindCallApply": false, + "strictNullChecks": false, + "strictPropertyInitialization": false, + "suppressExcessPropertyErrors": false, + "suppressImplicitAnyIndexErrors": false, + "target": "ES3", + "resolveJsonModule": false, + "esModuleInterop": false, + "useDefineForClassFields": false + } + }, + "fileTypes": { + "sass": { + "extensions": [ + ".scss", + ".sass" + ], + "autoCompile": true, + "sourceMap": true, + "tasks": [ + { + "task": "dart-sass", + "enable": true + }, + { + "task": "autoprefixer", + "enable": true + }, + { + "task": "minify-css", + "enable": true + } + ], + "output": { + "extension": ".css", + "type": "SOURCE_RELATIVE", + "segments": [ + { + "segment": "scss", + "replaceWith": "css" + }, + { + "segment": "sass", + "replaceWith": "css" + } + ], + "relativePath": "dist" + } + }, + "less": { + "extensions": [ + ".less" + ], + "autoCompile": true, + "sourceMap": false, + "tasks": [ + { + "task": "less", + "enable": true + }, + { + "task": "autoprefixer", + "enable": true + }, + { + "task": "minify-css", + "enable": false + } + ], + "output": { + "extension": ".css", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "less", + "replaceWith": "css" + } + ] + } + }, + "pug": { + "extensions": [ + ".pug", + ".jade" + ], + "autoCompile": false, + "tasks": [ + { + "task": "pug", + "enable": true + }, + { + "task": "minify-html", + "enable": false + } + ], + "output": { + "extension": ".html", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "pug", + "replaceWith": "html" + } + ] + } + }, + "css": { + "extensions": [ + ".css" + ], + "autoCompile": false, + "sourceMap": false, + "tasks": [ + { + "task": "copy", + "enable": true + }, + { + "task": "postcss-import", + "enable": true + }, + { + "task": "postcss-preset-env", + "enable": true + }, + { + "task": "autoprefixer", + "enable": true + }, + { + "task": "minify-css", + "enable": true + } + ], + "output": { + "extension": ".css", + "type": "SOURCE_RELATIVE", + "relativePath": "", + "suffix": "-dist", + "alwaysSuffix": false + } + }, + "javascript": { + "extensions": [ + ".js", + ".jsx" + ], + "autoCompile": false, + "sourceMap": false, + "tasks": [ + { + "task": "copy", + "enable": true + }, + { + "task": "concat-js", + "enable": false + }, + { + "task": "babel", + "enable": true + }, + { + "task": "bundle-js", + "enable": true + }, + { + "task": "minify-js", + "enable": true + } + ], + "output": { + "extension": ".js", + "type": "SOURCE_RELATIVE", + "relativePath": "", + "suffix": ".bundle", + "alwaysSuffix": false, + "segments": [ + { + "segment": "js", + "replaceWith": "bundle.js" + } + ] + } + }, + "stylus": { + "extensions": [ + ".styl" + ], + "autoCompile": true, + "sourceMap": false, + "tasks": [ + { + "task": "stylus", + "enable": true + }, + { + "task": "autoprefixer", + "enable": true + }, + { + "task": "minify-css", + "enable": false + } + ], + "output": { + "extension": ".css", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "stylus", + "replaceWith": "css" + }, + { + "segment": "styl", + "replaceWith": "css" + } + ] + } + }, + "markdown": { + "extensions": [ + ".md", + ".markdown", + ".mkd" + ], + "autoCompile": false, + "tasks": [ + { + "task": "markdown", + "enable": true + }, + { + "task": "minify-html", + "enable": false + } + ], + "output": { + "extension": ".html", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "markdown", + "replaceWith": "html" + } + ] + } + }, + "haml": { + "extensions": [ + ".haml" + ], + "autoCompile": true, + "tasks": [ + { + "task": "haml", + "enable": true + }, + { + "task": "minify-html", + "enable": false + } + ], + "output": { + "extension": ".html", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "haml", + "replaceWith": "html" + } + ] + } + }, + "slim": { + "extensions": [ + ".slim" + ], + "autoCompile": true, + "tasks": [ + { + "task": "slim", + "enable": true + }, + { + "task": "minify-html", + "enable": false + } + ], + "output": { + "extension": ".html", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "slim", + "replaceWith": "html" + } + ] + } + }, + "coffeescript": { + "extensions": [ + ".coffee" + ], + "autoCompile": true, + "sourceMap": false, + "tasks": [ + { + "task": "coffeescript", + "enable": true + }, + { + "task": "babel", + "enable": false + }, + { + "task": "bundle-js", + "enable": false + }, + { + "task": "minify-js", + "enable": false + } + ], + "output": { + "extension": ".js", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "coffee-script", + "replaceWith": "js" + }, + { + "segment": "coffeescript", + "replaceWith": "js" + }, + { + "segment": "coffee", + "replaceWith": "js" + } + ] + } + }, + "turf": { + "extensions": [ + ".turf", + ".kit" + ], + "autoCompile": true, + "tasks": [ + { + "task": "turf", + "enable": true + }, + { + "task": "minify-html", + "enable": false + } + ], + "output": { + "extension": ".html", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "turf", + "replaceWith": "html" + } + ] + } + }, + "typescript": { + "extensions": [ + ".ts", + ".tsx" + ], + "autoCompile": true, + "sourceMap": false, + "tasks": [ + { + "task": "typescript", + "enable": true + }, + { + "task": "babel", + "enable": false + }, + { + "task": "bundle-js", + "enable": false + }, + { + "task": "minify-js", + "enable": false + } + ], + "output": { + "extension": ".js", + "type": "REPLACE_SEGMENTS", + "segments": [ + { + "segment": "typescript", + "replaceWith": "js" + }, + { + "segment": "ts", + "replaceWith": "js" + } + ] + } + }, + "jpg": { + "extensions": [ + ".jpg", + ".jpeg" + ], + "tasks": [ + { + "task": "jpg", + "enable": true + } + ], + "output": { + "extension": ".jpg", + "type": "SOURCE_RELATIVE", + "relativePath": "" + } + }, + "png": { + "extensions": [ + ".png" + ], + "tasks": [ + { + "task": "png", + "enable": true + } + ], + "output": { + "extension": ".png", + "type": "SOURCE_RELATIVE", + "relativePath": "" + } + }, + "svg": { + "extensions": [ + ".svg" + ], + "tasks": [ + { + "task": "svg", + "enable": true + } + ], + "output": { + "extension": ".svg", + "type": "SOURCE_RELATIVE", + "relativePath": "" + } + } + }, + "files": [ + { + "file": "scripts/grid.ts", + "config": { + "autoCompile": false + } + } + ] + } +} diff --git a/src/wwwroot/scripts/api/account-api.ts b/src/wwwroot/scripts/api/account-api.ts new file mode 100644 index 0000000..0d8604b --- /dev/null +++ b/src/wwwroot/scripts/api/account-api.ts @@ -0,0 +1,28 @@ +import {LoginPayload} from "./account-api.types" + +export function login(payload: LoginPayload, xsrf: string): Promise<Response> { + return fetch("/api/account/login", { + method: "post", + body: JSON.stringify(payload), + headers: { + "Content-Type": "application/json;charset=utf-8", + "XSRF-TOKEN": xsrf + } + }); +} + +export function logout(): Promise<Response> { + return fetch("/api/account/logout"); +} + +export function updatePassword(newPassword: string): Promise<Response> { + return fetch("/api/account/update-password", { + method: "post", + body: JSON.stringify({ + newPassword + }), + headers: { + "Content-Type": "application/json;charset=utf-8" + } + }); +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/account-api.types.ts b/src/wwwroot/scripts/api/account-api.types.ts new file mode 100644 index 0000000..3c02441 --- /dev/null +++ b/src/wwwroot/scripts/api/account-api.types.ts @@ -0,0 +1,5 @@ +export interface LoginPayload { + username: string, + password: string, + persist: boolean +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/categories-api.ts b/src/wwwroot/scripts/api/categories-api.ts new file mode 100644 index 0000000..1ca1d97 --- /dev/null +++ b/src/wwwroot/scripts/api/categories-api.ts @@ -0,0 +1,33 @@ +export function getCategories(withProducts: boolean = false): Promise<Response> { + return fetch(withProducts ? "/api/categories/with-products" : "/api/categories"); +} + +export function getCategory(categoryId: string): Promise<Response> { + return fetch("/api/categories/" + categoryId); +} + +export function createCategory(name: string, disabled: boolean): Promise<Response> { + return fetch("/api/categories/create?" + new URLSearchParams({ + name + })); +} + +export function updateCategory(categoryId: string, newName: string): Promise<Response> { + return fetch("/api/categories/" + categoryId + "/update?" + new URLSearchParams({ + newName + })); +} + +export function deleteCategory(categoryId: string): Promise<Response> { + return fetch("/api/categories/" + categoryId + "/delete", { + method: "delete" + }); +} + +export function enableCategory(categoryId: string): Promise<Response> { + return fetch("/api/categories/" + categoryId + "/enable"); +} + +export function disableCategory(categoryId: string): Promise<Response> { + return fetch("/api/categories/" + categoryId + "/disable"); +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/categories-api.types.ts b/src/wwwroot/scripts/api/categories-api.types.ts new file mode 100644 index 0000000..7040cea --- /dev/null +++ b/src/wwwroot/scripts/api/categories-api.types.ts @@ -0,0 +1,17 @@ +import {Base} from "./db-base"; +import {Product} from "./products-api.types"; + +export interface Category extends Base { + name: string, + slug: string, + visibilityState: CategoryVisibility, + disabled: boolean, + deleted: boolean, + products: Array<Product> +} + +export enum CategoryVisibility { + Default = 0, + Disabled = 1, + Deleted = 2 +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/db-base.ts b/src/wwwroot/scripts/api/db-base.ts new file mode 100644 index 0000000..a6593a1 --- /dev/null +++ b/src/wwwroot/scripts/api/db-base.ts @@ -0,0 +1,3 @@ +export interface Base { + id: string, +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/documents-api.ts b/src/wwwroot/scripts/api/documents-api.ts new file mode 100644 index 0000000..f458f6c --- /dev/null +++ b/src/wwwroot/scripts/api/documents-api.ts @@ -0,0 +1,24 @@ +export function uploadDocumentImages(files: Array<File>): Promise<Response> { + if (files.length <= 0) throw new Error("files.length was " + files.length); + const data = new FormData(); + for (const file of files) + data.append("files", file); + + return fetch("/api/documents/upload-images", { + method: "post", + body: data + }); +} + +export function getDocument(documentType: string) { + return fetch("/api/documents/" + documentType); +} + +export function setDocument(documentType: string, content: string) { + const fd = new FormData(); + fd.append("content", content); + return fetch("/api/documents/" + documentType, { + method: "post", + body: fd, + }); +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/order-api.ts b/src/wwwroot/scripts/api/order-api.ts new file mode 100644 index 0000000..eaacffe --- /dev/null +++ b/src/wwwroot/scripts/api/order-api.ts @@ -0,0 +1,64 @@ +import {SubmitOrderPayload, ValidateOrderPayload} from "./order-api.types"; + +export function validateOrderProducts(payload: ValidateOrderPayload): Promise<Response> { + return fetch("/api/orders/validate-products", { + headers: { + "Content-Type": "application/json;charset=utf-8" + }, + body: JSON.stringify(payload), + method: "post", + credentials: "include" + }); +} + +export function validateOrder(payload: ValidateOrderPayload): Promise<Response> { + return fetch("/api/orders/validate", { + headers: { + "Content-Type": "application/json;charset=utf-8" + }, + body: JSON.stringify(payload), + method: "post", + credentials: "include" + }); +} + +export function getOrderDetails(id): Promise<Response> { + return fetch("/api/orders/" + id + "/details", { + credentials: "include" + }); +} + +export function captureVippsOrder(id: String): Promise<Response> { + return fetch("/api/orders/" + id + "/capture") +} + +export function cancelOrder(id: String): Promise<Response> { + return fetch("/api/orders/" + id + "/cancel") +} + +export function refundOrder(id: String): Promise<Response> { + return fetch("/api/orders/" + id + "/refund") +} + +export function submitOrder(payload: SubmitOrderPayload): Promise<Response> { + return fetch("/api/orders/submit", { + headers: { + "Content-Type": "application/json;charset=utf-8" + }, + body: JSON.stringify(payload), + method: "post", + credentials: "include" + }); +} + +export function getOrders(filter?: string): Promise<Response> { + return fetch("/api/orders?filter=" + filter, { + credentials: "include" + }); +} + +export function getOrder(id): Promise<Response> { + return fetch("/api/orders/" + id, { + credentials: "include" + }); +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/order-api.types.ts b/src/wwwroot/scripts/api/order-api.types.ts new file mode 100644 index 0000000..8f4ca25 --- /dev/null +++ b/src/wwwroot/scripts/api/order-api.types.ts @@ -0,0 +1,39 @@ +import {Base} from "./db-base"; + +export interface ValidateOrderPayload { + products: Array<ProductValidationDto> +} + +export interface Order extends Base { + comment: string, + paymentType: OrderPaymentType, + status: OrderStatus, + ContactInfo: ContactInformation, + ProductIds: Array<string> +} + +export interface SubmitOrderPayload extends Order { +} + +export interface ContactInformation { + name: string, + phoneNumber: string, + emailaddress: string +} + +export interface ProductValidationDto { + id: string, + count: number +} + +export enum OrderPaymentType { + Vipps = 0, + InvoiceByEmail = 1 +} + +export enum OrderStatus { + InProgress = 0, + Completed = 3, + Canceled = 1, + Failed = 2 +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/products-api.ts b/src/wwwroot/scripts/api/products-api.ts new file mode 100644 index 0000000..6069830 --- /dev/null +++ b/src/wwwroot/scripts/api/products-api.ts @@ -0,0 +1,59 @@ +import {CreateProductPayload, Product} from "./products-api.types"; + +export function createProduct(payload: CreateProductPayload): Promise<Response> { + return fetch("/api/products/create", { + headers: { + "Content-Type": "application/json;charset=utf-8" + }, + body: JSON.stringify(payload), + method: "post", + credentials: "include" + }); +} + +export function getProduct(id: string): Promise<Response> { + return fetch("/api/products/" + id, { + method: "get", + credentials: "include" + }); +} + +export function getProducts(): Promise<Response> { + return fetch("/api/products", { + method: "get", + credentials: "include" + }); +} + +export function uploadProductImages(files: Array<File>): Promise<Response> { + if (files.length <= 0) throw new Error("files.length was " + files.length); + const data = new FormData(); + for (const file of files) + data.append("files", file); + + return fetch("/api/products/upload-images", { + method: "post", + body: data + }); +} + +export function deleteProduct(id: string): Promise<Response> { + return fetch("/api/products/" + id + "/delete", { + method: "delete", + credentials: "include" + }); +} + +export function updateProduct(data: Product): Promise<Response> { + if (!data.id) { + throw new Error("data.id was undefined"); + } + return fetch("/api/products/" + data.id + "/update", { + method: "post", + headers: { + "Content-Type": "application/json;charset=utf-8" + }, + body: JSON.stringify(data), + credentials: "include" + }); +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/products-api.types.ts b/src/wwwroot/scripts/api/products-api.types.ts new file mode 100644 index 0000000..f4fdd5e --- /dev/null +++ b/src/wwwroot/scripts/api/products-api.types.ts @@ -0,0 +1,35 @@ +import {Base} from "./db-base"; +import {Category} from "./categories-api.types"; + +export interface Product extends Base { + name: string, + description: string, + price: number, + priceSuffix: PriceSuffix, + visibilityState: ProductVisibility, + category: Category, + images: Array<Image>, + slug: string, + disabled: boolean, + deleted: boolean +} + +export interface CreateProductPayload extends Product { +} + +export interface Image { + order: number, + fileName: string +} + +export enum PriceSuffix { + Money = 0, + Kilos = 1, + Per = 2 +} + +export enum ProductVisibility { + Default = 0, + Disabled = 1, + Deleted = 2 +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/api/settings-api.ts b/src/wwwroot/scripts/api/settings-api.ts new file mode 100644 index 0000000..7f7e482 --- /dev/null +++ b/src/wwwroot/scripts/api/settings-api.ts @@ -0,0 +1,17 @@ +export function setOrderEmailList(payload: string[]): Promise<Response> { + return fetch("/api/settings/order-emails", { + headers: { + "Content-Type": "application/json;charset=utf-8" + }, + body: JSON.stringify(payload), + method: "post", + credentials: "include" + }); +} + +export function getOrderEmailList(): Promise<Response> { + return fetch("/api/settings/order-emails", { + method: "get", + credentials: "include" + }); +} diff --git a/src/wwwroot/scripts/api/settings-api.types.ts b/src/wwwroot/scripts/api/settings-api.types.ts new file mode 100644 index 0000000..fe9864a --- /dev/null +++ b/src/wwwroot/scripts/api/settings-api.types.ts @@ -0,0 +1,3 @@ +export interface SettingsApiTypes { + +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/back/bestillinger.js b/src/wwwroot/scripts/back/bestillinger.js new file mode 100644 index 0000000..17b56d5 --- /dev/null +++ b/src/wwwroot/scripts/back/bestillinger.js @@ -0,0 +1,321 @@ +import Grid from "../grid"; +import {strings} from "../i10n"; +import {$, doc, pageInit, toaster} from "../base"; +import {eyeIcon} from "../icons"; +import {utilites} from "../utilities"; +import {messages} from "../messages"; +import {cancelOrder, captureVippsOrder, getOrderDetails, getOrders, refundOrder} from "../api/order-api"; +import Modal from "bootstrap/js/src/modal"; + +if (location.pathname.startsWith("/kontoret/bestillinger")) { + const ordersLoader = $("#orders-loader"); + const ordersWrapper = $("#orders-wrapper"); + const orderInfoModalEl = $("#order-info-modal"); + const orderInfoModal = new Modal(orderInfoModalEl); + + const grid = new Grid({ + search: { + dataIds: ["orderReference", ["contactInfo", "name"], ["contactInfo", "emailAddress"], ["contactInfo", "phoneNumber"]], + }, + strings: { + search: strings.languageSpesific.search, + nextPage: strings.languageSpesific.next_page, + previousPage: strings.languageSpesific.previous_page, + }, + debug: location.href.includes("localhost"), + classes: { + table: "table table-bordered mt-3", + thead: "table-primary", + }, + columns: [ + { + dataId: "orderReference", + minWidth: "150px", + columnName: "Referanse", + className: "btn-link cursor-pointer", + click: (row) => openViewOrderModal(row), + }, + { + columnName: "Navn", + dataId: ["contactInfo", "name"], + minWidth: "200px", + }, + { + columnName: "E-postadresse", + dataId: ["contactInfo", "emailAddress"], + minWidth: "200px", + }, + { + columnName: "Telefonnummer", + dataId: ["contactInfo", "phoneNumber"], + minWidth: "150px", + }, + { + dataId: "created", + minWidth: "175px", + cellValue: (row) => utilites.toReadableDateString(new Date(row.created)), + columnName: "Dato", + }, + { + minWidth: "150px", + columnName: "Status", + cellValue: (row) => { + const status = doc.createElement("span"); + switch (row.status) { + case 0: { + status.innerText = "Pågående"; + break; + } + case 1: { + status.innerText = "Kansellert"; + break; + } + case 2: { + status.innerText = "Feilet"; + status.classList.add("text-danger"); + break; + } + case 3: { + status.innerText = "Fullført"; + status.classList.add("text-success"); + break; + } + case 4: { + status.innerText = "Venter på faktura"; + break; + } + case 5: { + status.innerText = "Venter på vipps"; + break; + } + } + return status; + }, + }, + { + columnName: "", + width: "40px", + minWidth: "40px", + cellValue: (row) => { + const viewOrder = doc.createElement("button"); + viewOrder.className = "btn btn-link text-info shadow-none"; + viewOrder.title = strings.languageSpesific.view + ` "${row.orderReference}"`; + viewOrder.innerHTML = eyeIcon(); + viewOrder.onclick = () => openViewOrderModal(row); + return viewOrder; + }, + }, + ], + }); + + if (location.pathname.startsWith("/kontoret/bestillinger")) { + pageInit(() => { + renderProductsView(); + }); + } + + function openViewOrderModal({id, orderReference}) { + orderInfoModalEl.querySelector(".modal-title").innerText = orderReference; + $("#loader").style.display = ""; + $("#loaded").style.display = "none"; + + orderInfoModal.show(); + + getOrderDetails(id).then(res => { + if (res.ok) { + res.json().then(order => { + order = utilites.resolveReferences(order); + $("#contact-info-name").innerText = order.contactInformation.name; + $("#contact-info-emailAddress").innerHTML = `<a href='mailto:${order.contactInformation.emailAddress}'>${order.contactInformation.emailAddress}</a>`; + $("#contact-info-phoneNumber").innerHTML = `<a href='tel:${order.contactInformation.phoneNumber}'>${order.contactInformation.phoneNumber}</a>`; + $("#order-reference").innerText = order.orderReference; + $("#order-date").innerText = new Date(order.orderDate).toLocaleDateString(); + $("#order-payment-type").innerText = utilites.getOrderPaymentName(order.paymentType); + $("#order-status").innerText = utilites.getOrderStatusName(order.status); + if (order.comment && order.comment !== "") { + $("#order-comment").innerText = order.comment; + $("#order-comment").style.display = "inline-block"; + } else { + $("#order-comment").style.display = "none"; + } + + if (order.paymentType === 0) { + if ([ + "SALE", + "RESERVED", + ].includes(order.vippsTransactionStatus)) { + $("#vipps-order-refund").classList.remove("d-none"); + $("#vipps-order-refund").onclick = () => { + if (confirm("Er du sikker på at du vil refundere ordren " + order.orderReference)) { + $("#vipps-order-refund").classList.add("loading"); + refundOrder(order.id).then(res => { + if (res.ok) { + toaster.success("Refundert", "Ordren er refundert, og vipps har startet refundering"); + } else { + console.error("Received non-successful status code when submitting refund order command"); + toaster.error("En feil oppstod", "Prøv å refundere i vipps portalen"); + } + $("#vipps-order-refund").classList.remove("loading"); + }).catch(err => { + $("#vipps-order-refund").classList.remove("loading"); + + console.error("refund order NetworkRequest failed"); + toaster.error("En uventet feil oppstod"); + console.error(err); + }); + } + }; + } + + if ([ + "SALE", + "RESERVED", + ].includes(order.vippsTransactionStatus)) { + $("#vipps-order-capture").classList.remove("d-none"); + $("#vipps-order-capture").onclick = () => { + if (confirm("Er du sikker på at du vil fullføre ordren " + order.orderReference)) { + $("#vipps-order-capture").classList.add("loading"); + captureVippsOrder(order.id).then(res => { + if (res.ok) { + toaster.success("Fullført", "Ordren er fullført, og vipps har registrert transaksjonen"); + } else { + console.error("Received non-successful status code when submitting fulfill order command"); + toaster.error("En feil oppstod", "Prøv å fullføre i vipps portalen"); + } + $("#vipps-order-capture").classList.remove("loading"); + }).catch(err => { + $("#vipps-order-capture").classList.remove("loading"); + console.error("fulfill order NetworkRequest failed"); + toaster.error("En uventet feil oppstod"); + console.error(err); + }); + } + }; + } + + if ([ + "SALE", + "RESERVED", + ].includes(order.vippsTransactionStatus)) { + $("#vipps-order-cancel").classList.remove("d-none"); + $("#vipps-order-cancel").onclick = () => { + if (confirm("Er du sikker på at du vil kansellere ordren " + order.orderReference)) { + $("#vipps-order-cancel").classList.add("loading"); + cancelOrder(order.id).then(res => { + if (res.ok) { + toaster.success("Kansellert", "Ordren er kansellert"); + } else { + console.error("Received non-successful status code when submitting cancel order command"); + toaster.error("En feil oppstod", "Prøv å kansellere i vipps portalen"); + } + $("#vipps-order-cancel").classList.remove("loading"); + }).catch(err => { + $("#vipps-order-cancel").classList.remove("loading"); + console.error("cancel order NetworkRequest failed"); + toaster.error("En uventet feil oppstod"); + console.error(err); + }); + } + }; + } + + + switch (order.vippsTransactionStatus) { + case "SALE": + $("#vipps-status").innerText = "Salg (fullført og overført)"; + break; + case "RESERVED": + $("#vipps-status").innerText = "Reservert"; + break; + case "CANCELLED": + $("#vipps-status").innerText = "Kansellert"; + break; + case "REJECTED": + $("#vipps-status").innerText = "Avslått"; + break; + case "SALE_FAILED": + $("#vipps-status").innerText = "Salg feilet"; + break; + case "AUTO_CANCEL": + $("#vipps-status").innerText = "Automatisk kansellering"; + break; + case "RESERVE_FAILED": + $("#vipps-status").innerText = "Reservering feilet"; + break; + } + $("#vipps-link").innerHTML = `<a href='https://portal.vipps.no/61861/transactions/${order.vippsId}' target="_blank">Åpne bestillingen i Vipps-portalen</a>`; + $("#vipps-section").classList.remove("d-none"); + } else { + $("#vipps-section").classList.add("d-none"); + } + + orderInfoModalEl.querySelector(".modal-body").style.display = ""; + + const productsBody = orderInfoModalEl.querySelector("tbody"); + productsBody.innerHTML = ""; + let productIndex = 1; + let totalPrice = 0; + for (const product of order.products) { + const rowItem = doc.createElement("tr"); + const nrCell = doc.createElement("td"); + nrCell.innerText = productIndex.toString(); + const nameCell = doc.createElement("td"); + nameCell.innerText = product.name; + const countCell = doc.createElement("td"); + countCell.innerText = product.count; + const priceCell = doc.createElement("td"); + const totalSum = product.payedPrice * product.count; + priceCell.innerText = `${product.payedPrice} (totalt: ${totalSum})`; + + rowItem.appendChild(nrCell); + rowItem.appendChild(nameCell); + rowItem.appendChild(countCell); + rowItem.appendChild(priceCell); + productsBody.appendChild(rowItem); + productIndex++; + totalPrice += totalSum; + } + $("#order-total").innerText = totalPrice; + $("#loader").style.display = "none"; + $("#loaded").style.display = ""; + orderInfoModal.show(); + }); + } else { + toaster.error("En feil oppstod", "Kunne ikke hente ordren, prøv igjen snart!"); + } + }).catch(error => { + console.error(error); + }); + } + + function renderProductsView() { + ordersWrapper.innerHTML = ""; + ordersWrapper.classList.add("d-none"); + ordersLoader.classList.remove("d-none"); + + getOrders("not-cancelled").then(res => { + if (res.ok) { + res.json().then(products => { + grid.render(ordersWrapper); + products = utilites.resolveReferences(products); + grid.refresh(products); + const queryOrderRef = new URL(location.href).searchParams.get("order"); + if (queryOrderRef) { + const product = products.find(c => c.orderReference === queryOrderRef); + openViewOrderModal(product); + } + }); + ordersWrapper.classList.remove("d-none"); + ordersLoader.classList.add("d-none"); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_retrieve_orders, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(error => { + console.error(error); + toaster.errorObj(messages.networkRequestFailed); + }); + } +} diff --git a/src/wwwroot/scripts/back/dokumenter.js b/src/wwwroot/scripts/back/dokumenter.js new file mode 100644 index 0000000..c92bdbf --- /dev/null +++ b/src/wwwroot/scripts/back/dokumenter.js @@ -0,0 +1,102 @@ +import {$, pageInit, toaster} from "../base"; +import Quill from "../vendor/quill"; +import {uploadDocumentImages, getDocument, setDocument} from "../api/documents-api"; +import {configuration} from "../configuration"; +import {utilites} from "../utilities"; +import {strings} from "../i10n"; + +if (location.pathname.startsWith("/kontoret/dokumenter")) { + const documentSelect = $("#document-selector"); + const publishButton = $("#publish-button"); + const toolbarOptions = [["link", "image"], + ["bold", "italic", "underline", "strike"], + ["blockquote", "code-block"], + [{"header": 1}, {"header": 2}], + [{"list": "ordered"}, {"list": "bullet"}], + [{"script": "sub"}, {"script": "super"}], + [{"indent": "-1"}, {"indent": "+1"}], + [{"direction": "rtl"}], + [{"size": ["small", false, "large", "huge"]}], + [{"header": [1, 2, 3, 4, 5, 6, false]}], + [{"color": []}, {"background": []}], + [{"font": []}], + [{"align": []}], + ["clean"]]; + + + pageInit(() => { + documentSelect.onchange = () => setDocumentContent(); + publishButton.onclick = () => publishDocument(); + const editor = new Quill("#editor", { + theme: "snow", + modules: { + toolbar: toolbarOptions, + blotFormatter: true, + imageDrop: true, + imageUploader: { + upload: (file) => new Promise(((resolve, reject) => { + uploadDocumentImages([file]).then(res => { + if (res.ok) { + res.json().then(fileNames => { + fileNames = utilites.resolveReferences(fileNames); + resolve(configuration.paths.documents + fileNames[0]); + }); + } else { + reject(res); + } + }).catch(error => { + reject(error); + }); + })), + }, + }, + }); + + function publishDocument() { + const html = editor.container.querySelector(".ql-editor").innerHTML; + if (!html || html === "<p><br></p>") return; + setDocument(documentSelect.value, html).then(res => { + if (res.ok) { + toaster.success("Dokumentet er publisert"); + } else { + utilites.handleError(res, { + title: "Kunne ikke publisere dokumentet", + message: "Prøv igjen senere", + }); + } + }).catch(error => { + console.error(error); + toaster.errorObj({ + title: strings.languageSpesific.could_not_reach_server, + message: strings.languageSpesific.try_again_soon, + }); + }); + } + + function setDocumentContent() { + getDocument(documentSelect.value).then(res => { + if (res.ok) { + res.text().then(content => { + editor.setText(""); + if (content) { + editor.clipboard.dangerouslyPasteHTML(0, content); + } + }); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.an_error_occured, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(error => { + console.error(error); + toaster.errorObj({ + title: strings.languageSpesific.could_not_reach_server, + message: strings.languageSpesific.try_again_soon, + }); + }); + } + + setDocumentContent(); + }); +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/back/index.js b/src/wwwroot/scripts/back/index.js new file mode 100644 index 0000000..5b71a8d --- /dev/null +++ b/src/wwwroot/scripts/back/index.js @@ -0,0 +1,51 @@ +import {$, toaster} from "../base"; +import {logout, updatePassword} from "../api/account-api"; +import {Modal} from "bootstrap"; +import {utilites} from "../utilities"; +import {messages} from "../messages"; +import {strings} from "../i10n.ts"; + +const updatePasswordModalElement = $("#update-password-modal"); +const updatePasswordModal = new Modal(updatePasswordModalElement); +const logoutButton = $(".logout-btn"); +const newPasswordInput = $("#input-new-password"); +const submitNewPasswordFormButton = $("#submit-new-password-form"); + +logoutButton.addEventListener("click", (e) => { + e.preventDefault(); + if (confirm(strings.languageSpesific.are_you_sure)) { + logout().then((res) => { + if (res.status === 200) { + setTimeout(function () { + location.href = "/"; + }, 500); + } + }); + } +}); + +function initSetpasswordModal() { + newPasswordInput.value = ""; + submitNewPasswordFormButton.addEventListener("click", () => { + if (newPasswordInput.value.length < 6) return; + submitNewPasswordFormButton.querySelector(".spinner-border").classList.remove("d-none"); + submitNewPasswordFormButton.classList.add("disabled"); + updatePassword(newPasswordInput.value).then(res => { + if (res.ok) { + toaster.success(strings.languageSpesific.new_password_is_applied); + newPasswordInput.value = ""; + updatePasswordModal.hide(); + } else { + utilites.handleError(res, messages.unknownError); + } + submitNewPasswordFormButton.querySelector(".spinner-border").classList.add("d-none"); + submitNewPasswordFormButton.classList.remove("disabled"); + }); + }); +} + +$(".open-update-password-modal").addEventListener("click", (e) => { + e.preventDefault(); + initSetpasswordModal(); + updatePasswordModal.show(); +});
\ No newline at end of file diff --git a/src/wwwroot/scripts/back/produkter.js b/src/wwwroot/scripts/back/produkter.js new file mode 100644 index 0000000..ab8ecf6 --- /dev/null +++ b/src/wwwroot/scripts/back/produkter.js @@ -0,0 +1,671 @@ +import {$, $$, doc, toaster} from "../base"; +import {configuration} from "../configuration"; +import {utilites} from "../utilities"; +import {createCategory, deleteCategory, disableCategory, enableCategory, getCategories} from "../api/categories-api"; +import {createProduct, deleteProduct, getProducts, updateProduct, uploadProductImages} from "../api/products-api"; +import Modal from "bootstrap/js/dist/modal"; +import Grid from "../grid"; +import {messages} from "../messages"; +import {eyeIcon, pencilSquareIcon, plusIcon, threeDotsVerticalIcon, trashIcon} from "../icons"; +import {strings} from "../i10n.ts"; + +let shouldReloadProductsView; +const isProductsPage = location.pathname.startsWith("/kontoret/produkter"); +const inputImages = $("#input-images-row"); +const productsWrapper = $("#products"); +const productsLoader = $("#products-loader"); +const productForm = $("#product-form"); +const productCategoriesPickerElement = $("#product-category-picker-wrapper #picker"); +const productCategoriesPickerLoadingElement = $("#product-category-picker-wrapper #loader"); +const productModalElement = $("#product-modal"); +const submitProductFormButton = $("#submit-product-form"); +const submitProductFormButtonSpinner = $("#submit-product-form .spinner-border"); +const openProductModalButton = $("#open-product-modal"); +const productModalTitle = $("#product-modal-title"); +const productModal = isProductsPage ? new Modal(productModalElement, { + backdrop: "static", +}) : undefined; + +const newCategoryForm = $("#new-category-form"); +const newCategoryName = $("#new-category-name"); +const categoryModalElement = $("#categories-modal"); +const categoryModal = isProductsPage ? new Modal(categoryModalElement) : undefined; +const categoryListElement = $("#categories-modal #list-wrapper"); +const openCategoriesModalButton = $("#open-categories-modal"); +const categoryListLoadingElement = $("#categories-modal #loading-wrapper"); + +if (isProductsPage) { + renderProductsView(); + sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls); + openProductModalButton.addEventListener("click", () => openProductModal(undefined, undefined)); + openCategoriesModalButton.addEventListener("click", openCategoriesModal); +} + +/* + PRODUCTS +*/ + +const grid = new Grid({ + search: { + dataIds: ["name", ["category", "name"]], + }, + strings: { + search: strings.languageSpesific.search, + nextPage: strings.languageSpesific.next_page, + previousPage: strings.languageSpesific.previous_page, + }, + classes: { + table: "table table-bordered mt-3", + thead: "table-primary", + }, + columns: [ + { + dataId: "name", + minWidth: "250px", + columnName: "Navn", + }, + { + columnName: "Beskrivelse", + dataId: "description", + maxWidth: "250px", + minWidth: "250px", + width: "250px", + }, + { + minWidth: "250px", + dataId: ["category", "name"], + columnName: "Kategori", + }, + { + minWidth: "100px", + columnName: "Pris", + cellValue: (row) => row.price + row.readablePriceSuffix, + }, + { + columnName: "", + width: "80px", + minWidth: "80px", + cellValue: (row) => { + const group = doc.createElement("div"); + group.className = "btn-group"; + const deleteProductButton = doc.createElement("button"); + deleteProductButton.className = "btn btn-link text-danger shadow-none p-0 ps-3"; + deleteProductButton.title = strings.languageSpesific.delete + ` "${row.name}"`; + deleteProductButton.innerHTML = trashIcon("22", "22"); + deleteProductButton.onclick = () => removeProduct(row.id, row.name); + const editProductButton = doc.createElement("button"); + editProductButton.className = "btn btn-link text-info shadow-none p-0"; + editProductButton.title = strings.languageSpesific.edit + ` "${row.name}"`; + editProductButton.innerHTML = pencilSquareIcon(); + editProductButton.onclick = () => openProductModal(row); + group.appendChild(editProductButton); + group.appendChild(deleteProductButton); + return group; + }, + }, + ], +}); + +function renderProductsView() { + productsWrapper.innerHTML = ""; + productsWrapper.classList.add("d-none"); + productsLoader.classList.remove("d-none"); + + getProducts().then(res => { + if (res.ok) { + res.json().then(products => { + grid.render(productsWrapper); + products = utilites.resolveReferences(products); + grid.refresh(products); + }); + productsWrapper.classList.remove("d-none"); + productsLoader.classList.add("d-none"); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_retrieve_products, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(error => { + console.error(error); + toaster.errorObj(messages.networkRequestFailed); + }); +} + +function removeProduct(id, name) { + if (!name || !id) return; + if (confirm(`${strings.languageSpesific.are_you_sure_you_want_to_delete} ${name}?`)) { + deleteProduct(id).then(res => { + if (res.ok) { + toaster.success(`${name} ${strings.languageSpesific.is_deleted_LC}`); + grid.removeByID(id); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_delete_product, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(error => { + console.error(error); + toaster.errorObj(messages.networkRequestFailed); + }); + } +} + + +function uploadFiles() { + const input = doc.createElement("input"); + const maxFiles = 5; + const maxFileSize = 2 * 1024 * 1024; + input.type = "file"; + input.multiple = true; + input.accept = "image/png,image/jpeg"; + input.onchange = (e) => { + productForm.classList.add("loading"); + const files = e.target.files; + + if (files.length > maxFiles) { + toaster.error(strings.languageSpesific.too_many_files, strings.languageSpesific.max_five_files_at_a_time); + productForm.classList.remove("loading"); + return; + } + + for (const file of files) { + if (!input.accept.split(",").includes(file.type)) { + toaster.error(strings.languageSpesific.invalid_file, file.name + " " + strings.languageSpesific.has_invalid_file_format_LC); + productForm.classList.remove("loading"); + return; + } + if (file.size > maxFileSize) { + toaster.error(strings.languageSpesific.too_big_file, file.name + " " + strings.languageSpesific.is_too_big_LC); + productForm.classList.remove("loading"); + return; + } + } + + uploadProductImages(files).then(res => { + if (res.ok) { + res.json().then(fileNameArray => { + fileNameArray = utilites.resolveReferences(fileNameArray); + const sessionStorageImages = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls) ?? []; + const newImages = [...sessionStorageImages]; + for (let i = 0; i < fileNameArray.length; i++) { + newImages.push({ + order: i, + fileName: fileNameArray[i], + }); + } + utilites.setSessionStorageJSON(configuration.storageKeys.productForm.imageUrls, newImages); + renderProductFormImages(() => { + productForm.classList.remove("loading"); + if (inputImages.childNodes.length > 3) { + inputImages.scrollLeft = inputImages.scrollWidth; + } + }); + }); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_upload + " " + (files.length === 1 + ? strings.languageSpesific.the_image.toLocaleLowerCase() + : strings.languageSpesific.the_images.toLocaleLowerCase()), + message: strings.languageSpesific.try_again_soon, + }); + productForm.classList.remove("loading"); + } + }).catch(error => { + console.error(error); + toaster.errorObj(messages.networkRequestFailed); + productForm.classList.remove("loading"); + }); + }; + input.click(); +} + +function renderProductFormImages(cb) { + inputImages.innerHTML = ""; + inputImages.appendChild(getAddImageCardButton()); + let images = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls); + if (utilites.array.isEmpty(images)) return; + images = images.sort(img => img.order); + for (const image of images) { + inputImages.appendChild(generateProductFormImageColumn(image)); + } + // drag to scroll + let pos = {top: 0, left: 0, x: 0, y: 0}; + let mouseIsDown; + inputImages.addEventListener("mousemove", (e) => { + if (mouseIsDown) { + const dx = e.clientX - pos.x; + // scroll + inputImages.scrollLeft = pos.left - dx; + } + }); + inputImages.addEventListener("mousedown", (e) => { + mouseIsDown = true; + inputImages.style.cursor = "grabbing"; + inputImages.style.userSelect = "none"; + pos = { + // current scroll + left: inputImages.scrollLeft, + top: inputImages.scrollTop, + // current mouse position + x: e.clientX, + y: e.clientY, + }; + }); + inputImages.addEventListener("mouseup", () => { + mouseIsDown = false; + inputImages.style.removeProperty("cursor"); + inputImages.style.removeProperty("user-select"); + }); + + if (typeof cb === "function") cb(); +} + + +function getAddImageCardButton() { + const wrapper = doc.createElement("div"); + wrapper.className = "col mw-100px"; + const button = doc.createElement("div"); + button.type = "button"; + button.onclick = () => uploadFiles(); + button.className = "btn btn-light p-3 d-flex align-items-center justify-content-center h-100 border-primary text-primary"; + button.innerHTML = plusIcon("32", "32"); + wrapper.appendChild(button); + return wrapper; +} + +function deleteImageFromSessionStorage(image) { + const oldImages = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls); + const newImages = []; + for (const oldImage of oldImages) + if (oldImage.fileName !== image.fileName) + newImages.push(oldImage); + utilites.setSessionStorageJSON(configuration.storageKeys.productForm.imageUrls, newImages); + renderProductFormImages(); +} + +function generateProductFormImageColumn(image) { + const wrapper = doc.createElement("div"); + wrapper.className = "col-3 product-form-image-thumbnail"; + + const card = doc.createElement("div"); + card.className = "card"; + + const img = doc.createElement("img"); + img.src = configuration.paths.products + image.fileName; + img.className = "card-img"; + img.alt = strings.languageSpesific.picture_of_the_product; + + const cardOverlay = doc.createElement("div"); + cardOverlay.className = "card-img-overlay"; + + const dropdownWrapper = doc.createElement("div"); + dropdownWrapper.className = "dropleft"; + + const contextMenuButton = doc.createElement("div"); + contextMenuButton.className = "btn btn-light float-end context-menu-button"; + contextMenuButton.setAttribute("data-bs-toggle", "dropdown"); + contextMenuButton.setAttribute("aria-expanded", "false"); + contextMenuButton.type = "button"; + contextMenuButton.innerHTML = threeDotsVerticalIcon(); + + const dropdownMenu = doc.createElement("ul"); + dropdownMenu.className = "dropdown-menu"; + + const deleteMenuItem = doc.createElement("li"); + deleteMenuItem.innerText = `${strings.languageSpesific.delete} ${strings.languageSpesific.the_image.toLocaleLowerCase()}`; + deleteMenuItem.onclick = () => deleteImageFromSessionStorage(image); + deleteMenuItem.className = "text-danger dropdown-item"; + + dropdownMenu.appendChild(deleteMenuItem); + dropdownWrapper.appendChild(contextMenuButton); + dropdownWrapper.appendChild(dropdownMenu); + cardOverlay.appendChild(dropdownWrapper); + card.appendChild(img); + card.appendChild(cardOverlay); + wrapper.appendChild(card); + return wrapper; +} + +function generateCategoryPickerItem(category, initialCategoryId = undefined) { + const wrapper = doc.createElement("div"); + wrapper.className = "form-check form-check-inline"; + const radio = doc.createElement("input"); + radio.type = "radio"; + radio.name = "category"; + radio.className = "form-check-input"; + radio.value = category.id; + radio.id = category.id; + if (initialCategoryId !== undefined && category.id === initialCategoryId) radio.checked = true; + const label = doc.createElement("label"); + label.className = "form-check-label cursor-pointer"; + label.innerHTML = category.disabled ? ("<span class='text-decoration-line-through'>" + category.name + "</span>") : category.name; + label.htmlFor = category.id; + wrapper.appendChild(radio); + wrapper.appendChild(label); + return wrapper; +} + +function renderCategoriesPicker(initialCategoryId = undefined) { + productCategoriesPickerElement.innerHTML = ""; + getCategories().then(res => { + if (res.ok) { + res.json().then(data => { + let i = 0; + data = utilites.resolveReferences(data); + data.forEach(category => { + i++; + if (i % 3 === 1) productCategoriesPickerElement.appendChild(doc.createElement("br")); + if (initialCategoryId !== undefined) + productCategoriesPickerElement.appendChild(generateCategoryPickerItem(category, initialCategoryId)); + else + productCategoriesPickerElement.appendChild(generateCategoryPickerItem(category)); + }); + productCategoriesPickerLoadingElement.classList.add("d-none"); + productCategoriesPickerElement.classList.remove("d-none"); + }); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_retrieve_categories, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch((error) => { + console.error(error); + toaster.errorObj(messages.networkRequestFailed); + }); +} + +function submitProductForm() { + const id = productModalElement.dataset.id; + const isEditing = id !== "" && productModalElement.dataset.isEditing === "true"; + const payload = { + name: $("#input-name").value, + price: $("#input-price").value, + priceSuffix: parseInt($("#input-price-suffix").value), + description: $("#input-description").value, + count: parseInt($("#input-count").value), + showOnFrontpage: $("input[name='show-on-frontpage']:checked")?.checked ?? false, + category: { + id: $("input[name='category']:checked").value, + }, + images: [], + }; + + if (!payload.count && payload.count !== 0) payload.count = -1; + + const images = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls); + if (images !== undefined) { + if (typeof images[0] !== "object") { + for (let i = 0; i < images.length; i++) { + payload.images.push({ + order: i, + fileName: images[i], + }); + } + } else { + payload.images = images; + } + } + + if (isEditing) payload.id = id; + if (!payload.name || !payload.price || !payload.category.id) { + toaster.error(strings.languageSpesific.invalid_form); + return; + } + + if (payload.price.substring(payload.price.lastIndexOf(".")).length > 3 || payload.price.split(".").length > 2) { + toaster.error(strings.languageSpesific.invalid_form); + return; + } + + payload.price = parseFloat(payload.price); + + const action = isEditing ? updateProduct(payload) : createProduct(payload); + productForm.classList.add("loading"); + submitProductFormButton.classList.add("disabled"); + submitProductFormButtonSpinner.classList.remove("d-none"); + action.then((res) => { + if (res.ok) { + shouldReloadProductsView = true; + productModal.hide(); + sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls); + productForm.classList.remove("loading"); + submitProductFormButton.classList.remove("disabled"); + submitProductFormButtonSpinner.classList.add("d-none"); + } else { + utilites.handleError(res, { + title: isEditing ? strings.languageSpesific.could_not_update_the_product : strings.languageSpesific.could_not_add_the_product, + message: "Prøv igjen snart", + }); + productForm.classList.remove("loading"); + submitProductFormButton.classList.remove("disabled"); + submitProductFormButtonSpinner.classList.add("d-none"); + } + }).catch((error) => { + console.error(error); + toaster.errorObj(messages.networkRequestFailed); + productForm.classList.remove("loading"); + submitProductFormButton.classList.remove("disabled"); + submitProductFormButtonSpinner.classList.add("d-none"); + }); +} + +function disposeNewProductModal() { + if (shouldReloadProductsView) { + renderProductsView(); + shouldReloadProductsView = false; + } + sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls); + productModalElement.dataset.isEditing = "false"; + productForm.reset(); + productForm.classList.remove("loading"); + submitProductFormButton.removeEventListener("click", submitProductForm); + console.log("disposed newProductModal"); +} + +function openProductModal(edit = undefined, initalCategoryId = undefined) { + productForm.reset(); + productModalElement.addEventListener("hidden.bs.modal", disposeNewProductModal, {once: true}); + submitProductFormButton.addEventListener("click", submitProductForm); + utilites.dom.restrictInputToNumbers($("#input-price"), ["."], true); + utilites.dom.restrictInputToNumbers($("#input-count"), ["+", "-"], true); + + if (edit !== undefined) { + if (!utilites.array.isEmpty(edit.images)) { + utilites.setSessionStorageJSON(configuration.storageKeys.productForm.imageUrls, edit.images); + } + renderCategoriesPicker(edit.category.id); + productModalElement.dataset.isEditing = "true"; + productModalElement.dataset.id = edit.id; + $("#input-name").value = edit.name; + $("#input-price").value = edit.price; + $("#input-price-suffix").value = edit.priceSuffix; + $("#input-count").value = edit.count; + $("#show-on-frontpage").checked = edit.showOnFrontpage; + $("#input-description").value = edit.description; + productModalTitle.innerText = strings.languageSpesific.edit + " " + edit.name; + $("#submit-product-form .text").innerText = strings.languageSpesific.save; + } else { + sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls); + productModalTitle.innerText = strings.languageSpesific.new_product; + $("#submit-product-form .text").innerText = strings.languageSpesific.create; + productModalElement.dataset.isEditing = "false"; + productModalElement.dataset.id = ""; + if (initalCategoryId !== undefined) + renderCategoriesPicker(initalCategoryId); + else + renderCategoriesPicker(); + } + renderProductFormImages(); + productModal.show(); +} + + +/* + CATEGORIES +*/ + +function removeCategory(id, name) { + if (!id || !name) return; + if (confirm(`${strings.languageSpesific.are_you_sure_you_want_to_delete} ${name}?`)) { + deleteCategory(id).then(res => { + if (res.ok) { + shouldReloadProductsView = true; + renderCategoriesList(); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_delete_category, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(err => { + console.error(err); + toaster.errorObj(messages.networkRequestFailed); + }); + } +} + +function setCategoryState(id, name, disabled) { + if (typeof disabled !== "boolean" || !id || !name) return; + const actionName = disabled ? ` ${strings.languageSpesific.hide_V.toLocaleLowerCase()} ` : ` ${strings.languageSpesific.show_V.toLocaleLowerCase()} `; + const confirmText = `${strings.languageSpesific.are_you_sure_you_want_to} ${actionName} ${name} ${strings.languageSpesific.in_the_store.toLocaleLowerCase()}?`; + if (confirm(confirmText)) { + const action = disabled ? disableCategory(id) : enableCategory(id); + action.then(res => { + if (res.ok) { + shouldReloadProductsView = true; + renderCategoriesList(); + } else { + utilites.handleError(res, { + title: `${strings.languageSpesific.could_not} ${actionName} ${name}`, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(err => { + console.error(err); + toaster.errorObj(messages.networkRequestFailed); + }); + } +} + +function generateCategoryListItem(category) { + const nameEl = doc.createElement("div"); + nameEl.className = "flex-grow-1"; + nameEl.innerText = category.name; + + const disabledCheckEl = doc.createElement("div"); + const disabledCheckInputEl = doc.createElement("input"); + disabledCheckEl.className = "form-check form-switch"; + + if (category.disabled === true) { + disabledCheckEl.title = `${strings.languageSpesific.show} ${category.name} ${strings.languageSpesific.in_the_store}`; + disabledCheckInputEl.checked = false; + disabledCheckInputEl.onclick = (e) => { + e.preventDefault(); + disabledCheckInputEl.checked = false; + setCategoryState(category.id, category.name, false); + }; + } else if (category.disabled === false) { + disabledCheckEl.title = `${strings.languageSpesific.hide} ${category.name} ${strings.languageSpesific.in_the_store}`; + disabledCheckInputEl.checked = true; + disabledCheckInputEl.onclick = (e) => { + e.preventDefault(); + disabledCheckInputEl.checked = true; + setCategoryState(category.id, category.name, true); + }; + } + disabledCheckInputEl.type = "checkbox"; + disabledCheckInputEl.className = "form-check-input"; + disabledCheckEl.appendChild(disabledCheckInputEl); + + const deleteButtonEl = doc.createElement("button"); + deleteButtonEl.className = "btn btn-link text-danger"; + deleteButtonEl.title = "Slett \"" + category.name + "\" for godt"; + deleteButtonEl.innerHTML = trashIcon("22", "22"); + deleteButtonEl.onclick = () => removeCategory(category.id, category.name); + + const secondParent = doc.createElement("div"); + secondParent.className = "d-flex align-items-center"; + secondParent.appendChild(nameEl); + secondParent.appendChild(disabledCheckEl); + secondParent.appendChild(deleteButtonEl); + + const parent = doc.createElement("div"); + parent.className = "list-group-item"; + parent.dataset.id = category.id; + parent.appendChild(secondParent); + + return parent; +} + +function renderCategoriesList() { + categoryListElement.innerHTML = ""; + getCategories().then(res => { + if (res.ok) { + res.json().then(data => { + data = utilites.resolveReferences(data); + data.forEach(category => { + categoryListElement.appendChild(generateCategoryListItem(category)); + }); + categoryListLoadingElement.classList.add("d-none"); + categoryListElement.classList.remove("d-none"); + }); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_retrieve_categories, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(err => { + console.error(err); + toaster.errorObj(messages.networkRequestFailed); + }); +} + +function handleKeyUpWhenCategoriesModalIsVisible(e) { + if (utilites.dom.elementHasFocus(newCategoryName) && e.key === "Enter") { + e.preventDefault(); + if (newCategoryName.value) { + newCategoryForm.classList.add("loading"); + createCategory(newCategoryName.value).then(res => { + if (res.ok) { + shouldReloadProductsView = true; + renderCategoriesList(); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_add_the_category, + message: strings.languageSpesific.try_again_soon, + }); + } + newCategoryForm.classList.remove("loading"); + }).catch(err => { + console.error(err); + toaster.errorObj(messages.networkRequestFailed); + }); + } else { + toaster.error(strings.languageSpesific.name + " " + strings.languageSpesific.is_required_LC); + } + } +} + +function disposeCategoriesModal() { + if (shouldReloadProductsView) { + renderProductsView(); + shouldReloadProductsView = false; + } + newCategoryForm.reset(); + doc.removeEventListener("keyup", handleKeyUpWhenCategoriesModalIsVisible); + console.log("disposed categoriesModal"); +} + +function openCategoriesModal() { + newCategoryForm.reset(); + doc.addEventListener("keyup", handleKeyUpWhenCategoriesModalIsVisible); + categoryModalElement.addEventListener("hidden.bs.modal", disposeCategoriesModal, { + once: true, + }); + renderCategoriesList(); + categoryModal.show(); +} diff --git a/src/wwwroot/scripts/base.js b/src/wwwroot/scripts/base.js new file mode 100644 index 0000000..860cd34 --- /dev/null +++ b/src/wwwroot/scripts/base.js @@ -0,0 +1,84 @@ +import {Toaster} from "./toaster"; +import {configuration} from "./configuration"; + +export const toaster = new Toaster(); +export const doc = document, + $$ = (s, o = doc) => o.querySelectorAll(s), + $ = (s, o = doc) => o.querySelector(s); + +function toggleDarkTheme() { + if (localStorage["dark-theme"] === "true") localStorage["dark-theme"] = "false"; + else localStorage["dark-theme"] = "true"; + setTheme(); +} + +function setTheme() { + if (localStorage["dark-theme"] === "true") { + document.getElementsByTagName("html")[0].setAttribute("dark-theme", ""); + } else { + document.getElementsByTagName("html")[0].removeAttribute("dark-theme"); + } +} + +window.addEventListener("error", (e) => { + if (configuration.analytics.error) { + (async () => { + const error = { + msg: e.message, + line: e.lineno, + path: location.pathname, + filename: e.filename, + }; + await fetch("/api/analytics/error", { + method: "post", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(error), + }); + })(); + } +}); + +window.addEventListener("load", () => { + if (configuration.analytics.pageload && !location.pathname.startsWith("/kontoret")) { + (async () => { + //const loadTime = window.performance.timing.domContentLoadedEventEnd - + // window.performance.timing.navigationStart; + const loadTime = window.performance.timeOrigin - window.performance.now(); + await fetch("/api/analytics/pageload", { + method: "post", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({time: loadTime, path: location.pathname}), + }); + })(); + } +}); + +// https://stackoverflow.com/a/18234317/11961742 +String.prototype.formatUnicorn = String.prototype.formatUnicorn || function () { + "use strict"; + let str = this.toString(); + if (arguments.length) { + const t = typeof arguments[0]; + const args = ("string" === t || "number" === t) ? + Array.prototype.slice.call(arguments) + : arguments[0]; + + for (const key in args) { + str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]); + } + } + + return str; +}; + +setTheme(); + +export function pageInit(cb) { + if (typeof cb === "function") cb(); +} + +doc.addEventListener("DOMContentLoaded", pageInit); diff --git a/src/wwwroot/scripts/cart-core.js b/src/wwwroot/scripts/cart-core.js new file mode 100644 index 0000000..c15d0af --- /dev/null +++ b/src/wwwroot/scripts/cart-core.js @@ -0,0 +1,109 @@ +import {utilites} from "./utilities"; +import {configuration} from "./configuration"; +import {getProducts} from "./api/products-api"; + +export function setCart(data) { + return utilites.setSessionStorageJSON(configuration.storageKeys.cart, data); +} + +export function getCart() { + return utilites.getSessionStorageJSON(configuration.storageKeys.cart); +} + +export function cartDispose() { + sessionStorage.removeItem(configuration.storageKeys.cart); +} + +export function priceTotal() { + const cartData = getCart(); + if (utilites.array.isEmpty(cartData)) { + return null; + } + let total = null; + for (const product of cartData) { + total += product.price * product.count; + } + return typeof total !== "number" ? total : total.toFixed(2) + ",-"; +} + +export function priceTax() { + const cartData = getCart(); + if (utilites.array.isEmpty(cartData)) { + return null; + } + let total = null; + for (const product of cartData) { + total += product.price * product.count; + } + return typeof total !== "number" ? total : ((total) * 25 / 100).toFixed(2) + ",-"; +} + +export function updatePricesFromApi() { + return new Promise((ok, error) => { + const cartData = getCart(); + if (!cartData) { + + ok(); + return; + } + getProducts().then(res => { + if (res.ok) { + res.json().then(apiProducts => { + apiProducts = utilites.resolveReferences(apiProducts); + for (const latestProduct of apiProducts) { + const index = cartData.findIndex(c => c.id === latestProduct.id); + if (index !== -1) { + cartData[index].price = latestProduct.price; + } + if (index !== -1) { + cartData[index].readablePrice = latestProduct.price + latestProduct.readablePriceSuffix; + } + } + setCart(cartData); + ok(); + }); + } + }); + }); +} + +export function setProductCount(id, newCount) { + const cartData = getCart(); + const productIndex = cartData.findIndex(c => c.id === id); + cartData[productIndex].count = newCount; + setCart(cartData); +} + +export function removeProductFromCart(id, callback) { + const cartData = getCart(); + if (utilites.array.isEmpty(cartData)) { + return; + } + const updatedCart = utilites.array.removeItemByIdAll(cartData, {id}); + if (updatedCart.length === 0) { + cartDispose(); + } else { + setCart(updatedCart); + } + if (typeof callback === "function") { + callback(updatedCart); + } +} + +export function addOrUpdateProduct(product, callback) { + let cartData = getCart(); + if (utilites.array.isEmpty(cartData)) { + cartData = []; + } + const indexOfCurrent = cartData.length === 0 ? -1 : cartData.findIndex(c => c.id === product.id); + if (indexOfCurrent === -1 && product !== undefined) { // adding + product.count = 1; + cartData.push(product); + } else if (indexOfCurrent !== -1) { // updating + cartData[indexOfCurrent] = product; + } + setCart(cartData); + if (typeof callback === "function") { + callback(); + } +} diff --git a/src/wwwroot/scripts/components.js b/src/wwwroot/scripts/components.js new file mode 100644 index 0000000..28d25f0 --- /dev/null +++ b/src/wwwroot/scripts/components.js @@ -0,0 +1,48 @@ +import {configuration} from "./configuration"; +import {doc} from "./base"; + +export function getCounterControl(options = configuration.defaultParameters.counterControlOptions) { + const wrapper = doc.createElement("div"); + wrapper.className = "number-input"; + + const count = doc.createElement("input"); + count.inputMode = "numeric"; + count.type = "number"; + if (options.min !== undefined) { + count.min = options.min; + } + if (options.max !== undefined) { + count.max = options.max; + } + if (options.initialCount !== undefined) { + count.value = options.initialCount; + } + if (options.onChange !== undefined && typeof options.onChange === "function") { + count.addEventListener("change", (e) => { + options.onChange(e); + }); + } + + const minus = doc.createElement("button"); + minus.innerHTML = "-"; + minus.onclick = (e) => { + count.stepDown(); + count.dispatchEvent(new Event("change")); + }; + + const plus = doc.createElement("button"); + plus.innerHTML = "+"; + plus.onclick = (e) => { + count.stepUp(); + count.dispatchEvent(new Event("change")); + }; + + wrapper.appendChild(minus); + wrapper.appendChild(count); + wrapper.appendChild(plus); + return wrapper; +} + +export function getSpinner() { + return `<div class="spinner-border text-primary" role="status"><span class="visually-hidden">Laster...</span></div>`; +} diff --git a/src/wwwroot/scripts/configuration.js b/src/wwwroot/scripts/configuration.js new file mode 100644 index 0000000..418152d --- /dev/null +++ b/src/wwwroot/scripts/configuration.js @@ -0,0 +1,41 @@ +export const configuration = { + storageKeys: { + cart: "cart", + productForm: { + imageUrls: "productForm.images", + }, + }, + debug: location.hostname !== "localhost", + analytics: { + pageload: false, + error: true, + }, + cookies: { + culture: "vsh_culture", + }, + paths: { + products: "/assets/images/products/", + documents: "/assets/images/documents/", + swaggerDoc: { + main: "/swagger/v1/swagger.json", + }, + }, + defaultParameters: { + counterControlOptions: { + min: undefined, + max: undefined, + initialCount: undefined, + onChange: undefined, + }, + }, + enums: { + orderStatus: { + IN_PROGRESS: 0, + CANCELLED: 0, + FAILED: 2, + COMPLETED: 3, + AWAITING_INVOICE: 4, + AWAITING_VIPPS: 5, + }, + }, +}; diff --git a/src/wwwroot/scripts/front/handlekurv.js b/src/wwwroot/scripts/front/handlekurv.js new file mode 100644 index 0000000..bb80b3e --- /dev/null +++ b/src/wwwroot/scripts/front/handlekurv.js @@ -0,0 +1,256 @@ +import {utilites} from "../utilities"; +import {$, doc, pageInit} from "../base"; +import { + cartDispose, + getCart, + priceTax, + priceTotal, + removeProductFromCart, + setProductCount, + updatePricesFromApi, +} from "../cart-core"; + +import {getCounterControl} from "../components"; +import {strings} from "../i10n.ts"; +import {submitOrder} from "../api/order-api"; +import "bootstrap/js/dist/tab"; + +const inputName = $("#input-name"); +const inputEmail = $("#input-email"); +const inputPhone = $("#input-phone"); +const inputComment = $("#input-comment"); +const invoiceMail = $("#invoice-mail"); + +const orderSummaryWrapper = $("#order-summary-wrapper"); +const submitOrderWrapper = $("#submit-order-wrapper"); +const orderSummaryLoader = $("#order-summary-spinner"); +const total = $("#total-wrapper"); + +function setOrderSummaryLoaderVisibility(show = false) { + if (show) { + orderSummaryWrapper.classList.add("d-none"); + orderSummaryLoader.classList.remove("d-none"); + } else { + orderSummaryWrapper.classList.remove("d-none"); + orderSummaryLoader.classList.add("d-none"); + } +} + +function renderOverview() { + setOrderSummaryLoaderVisibility(true); + const cartData = getCart(); + if (utilites.array.isEmpty(cartData)) { + const noItemsAlert = doc.createElement("div"); + noItemsAlert.className = "alert alert-primary"; + noItemsAlert.innerHTML = `${strings.languageSpesific.the_shopping_bag_is_empty}, ${strings.languageSpesific.go_to} <a href='/produktar'>/produktar</a> ${strings.languageSpesific.to_add_LC}`; + orderSummaryWrapper.appendChild(noItemsAlert); + setOrderSummaryLoaderVisibility(false); + orderSummaryWrapper.querySelector("table").classList.add("d-none"); + total.classList.add("d-none"); + submitOrderWrapper.classList.add("d-none"); + return; + } + const tbody = orderSummaryWrapper.querySelector("tbody"); + tbody.innerHTML = ""; + for (const product of cartData) + tbody.appendChild(getProductTableRow(product)); + updateTotal(); + setOrderSummaryLoaderVisibility(false); +} + +function updateTotal() { + total.querySelector("#total-sum").innerText = priceTotal(); + total.querySelector("#total-tax").innerText = priceTax(); +} + +function getProductTableRow(product) { + const row = doc.createElement("tr"); + + const productCell = doc.createElement("td"); + productCell.innerText = product.name; + + const priceTotalCell = doc.createElement("td"); + priceTotalCell.innerText = (product.price * product.count).toFixed(2) + ",-"; + + const countCell = doc.createElement("td"); + + const counterControl = getCounterControl({ + initialCount: product.count, + min: "0", + max: product.maxCount, + onChange: (e) => { + const newCount = parseInt(e.target.value); + if (newCount === 0) { + removeProductFromCart(product.id, (updatedCart) => { + if (updatedCart.length >= 1) { + row.remove(); + updateTotal(); + } else { + renderOverview(); + } + }); + return; + } + setProductCount(product.id, newCount); + priceTotalCell.innerText = (product.price * newCount).toFixed(2) + ",-"; + updateTotal(); + }, + }); + counterControl.style.height = "30px"; + countCell.appendChild(counterControl); + + const priceCell = doc.createElement("td"); + priceCell.innerText = product.readablePrice; + + row.appendChild(productCell); + row.appendChild(countCell); + row.appendChild(priceCell); + row.appendChild(priceTotalCell); + + return row; +} + +function getOrderPayload() { + const payload = { + comment: inputComment.value, + contactInfo: { + name: inputName.value, + emailAddress: inputEmail.value, + phoneNumber: inputPhone.value, + }, + products: [], + }; + const cartData = getCart(); + if (utilites.array.isEmpty(cartData)) return undefined; + for (const item of cartData) { + if (payload.products.findIndex(c => c.id === item.id) !== -1) continue; + payload.products.push({ + id: item.id, + numberOfItems: item.count, + }); + } + return payload; +} + +function isSubmitOrderFormValid() { + return ( + inputName.value && + inputEmail.value && + inputPhone.value && + $("#vipps-terms-confirm").checked || $("#invoice-terms-confirm").checked + ); +} + +function submitOrderForm(type) { + if (isSubmitOrderFormValid()) { + const payload = getOrderPayload(); + if (payload === undefined) return; + payload.paymentType = type; + $("#submit-order-form").classList.add("loading"); + $("#form-errors").classList.add("d-none"); + $("#form-errors").innerHTML = ""; + submitOrder(payload).then(res => { + if (res.ok) { + res.text().then(continueTo => { + window.location.replace(continueTo.replaceAll("\"", "")); + }); + } else { + console.log(res.headers.get("Content-Type")); + if (res.headers.get("Content-Type")?.startsWith("application/json")) { + res.json().then(errorJson => { + if (errorJson.isValid === false) { + errorJson = utilites.resolveReferences(errorJson); + for (const error of errorJson.errors) { + if (error.id == null) { + const listItem = doc.createElement("li"); + if (error.errors.length === 1) { + listItem.innerText = error.errors[0]; + } else { + let html; + for (const itemError of error.errors) { + html += itemError + "<br>"; + } + listItem.innerHTML = html; + } + $("#form-errors").appendChild(listItem); + } else { + const cartproducts = getCart(); + const errorProduct = cartproducts.find(c => c.id === error.id); + const listItem = doc.createElement("li"); + if (error.errors.length === 1) { + listItem.innerHTML = `<b>${errorProduct.name}:</b> ${error.errors[0]}`; + } else { + let html = ""; + for (const itemError of error.errors) { + html += `<b>${errorProduct.name}:</b> ${itemError} <br>`; + } + listItem.innerHTML = html; + } + $("#form-errors").appendChild(listItem); + } + } + $("#form-errors").classList.remove("d-none"); + $("#submit-order-form").classList.remove("loading"); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.an_unknown_error_occured, + message: strings.languageSpesific.try_again_soon, + }); + $("#submit-order-form").classList.remove("loading"); + } + }); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.an_unknown_error_occured, + message: strings.languageSpesific.try_again_soon, + }); + $("#submit-order-form").classList.remove("loading"); + } + } + }) + .catch(err => { + console.error(err); + }); + } +} + +window.disposeCart = () => { + cartDispose(); + location.href = "/"; +}; + +function handleCallbackError() { + const urlParams = new URLSearchParams(window.location.search); + const error = urlParams.get("error"); + console.log(error); + switch (error) { + case "cancelled": + $("#order-alert").classList.remove("d-none"); + $("#order-alert").innerHTML = "Din bestilling er kansellert! <span class='btn btn-link' onclick='disposeCart()' title='Slett handlekorgen'>Klikk her for å slette handlekorgen</span>"; + break; + case "failed": + $("#order-alert").classList.remove("d-none"); + $("#order-alert").innerHTML = "Bestillingen feilet, venlegst prøv igjen eller <a href='/#kontakt'>ta kontakt</a> med oss hvis problemet vedvarer!"; + break; + } + urlParams.delete("error"); +} + +if (location.pathname.startsWith("/handlekorg")) { + pageInit(() => { + updatePricesFromApi().then(() => { + $(".submit-vipps").addEventListener("click", () => submitOrderForm(0)); + $(".submit-invoice").addEventListener("click", () => submitOrderForm(1)); + inputEmail.addEventListener("keyup", (e) => { + if (utilites.validators.isEmail(e.target.value)) { + invoiceMail.innerText = e.target.value; + } else { + invoiceMail.innerText = "din e-postadresse"; + } + }); + + renderOverview(); + }); + handleCallbackError(); + }); +} diff --git a/src/wwwroot/scripts/front/logginn.js b/src/wwwroot/scripts/front/logginn.js new file mode 100644 index 0000000..f15a323 --- /dev/null +++ b/src/wwwroot/scripts/front/logginn.js @@ -0,0 +1,92 @@ +import {$, pageInit} from "../base"; +import {utilites} from "../utilities"; +import {login} from "../api/account-api"; +import {strings} from "../i10n.ts"; + +const submitButton = $("#submit"); +const submitButtonSpinner = $("#submit .spinner-border"); +const errorContainer = $("#error"); +const errorMessage = $("#error-message"); +const errorTitle = $("#error-title"); +const continueTo = new URL(location.href).searchParams.get("ReturnUrl") + ? new URL(location.href).searchParams.get("ReturnUrl") + : "/kontoret"; +const email = $("#input-email"); +const password = $("#input-password"); +const persist = $("#persist-session"); +const loginForm = $("#login-form"); + +const loading = { + show() { + submitButton.classList.add("disabled"); + submitButtonSpinner.classList.remove("d-none"); + }, + hide() { + submitButton.classList.remove("disabled"); + submitButtonSpinner.classList.add("d-none"); + }, +}; + +const error = { + show(title = strings.languageSpesific.an_error_occured, message = strings.languageSpesific.try_again_soon) { + errorMessage.innerText = message; + errorTitle.innerText = title; + errorContainer.classList.remove("d-none"); + }, + hide() { + errorMessage.innerText = ""; + errorTitle.innerText = ""; + errorContainer.classList.add("d-none"); + }, +}; + +const form = { + submit() { + loading.show(); + error.hide(); + let payload = { + username: email.value, + password: password.value, + persist: persist.checked, + }; + login(payload, $("input[name=\"xsrf\"]").value).then((response) => { + if (response.status === 200) { + error.hide(); + location.href = continueTo; + } else { + utilites.handleError(response, { + title: strings.languageSpesific.an_unknown_error_occured, + message: strings.languageSpesific.try_again_soon, + }); + loading.hide(); + } + }).catch((err) => console.log(err)); + }, + isValid() { + email.removeAttribute("aria-invalid"); + password.removeAttribute("aria-invalid"); + if (!email.value || !utilites.validators.isEmail(email.value)) { + error.show(undefined, strings.languageSpesific.the_email_address + " " + strings.languageSpesific.is_invalid_LC); + email.setAttribute("aria-invalid", "true"); + return false; + } + if (!password.value) { + error.show(undefined, strings.languageSpesific.the_password + " " + strings.languageSpesific.is_invalid_LC); + password.setAttribute("aria-invalid", "true"); + return false; + } + return true; + }, +}; + +if (location.pathname.startsWith("/logginn")) { + pageInit(() => { + loginForm.addEventListener("submit", (e) => { + e.preventDefault(); + e.stopPropagation(); + if (form.isValid()) { + form.submit(); + } + }); + }); +} diff --git a/src/wwwroot/scripts/front/produkter.js b/src/wwwroot/scripts/front/produkter.js new file mode 100644 index 0000000..86a2afb --- /dev/null +++ b/src/wwwroot/scripts/front/produkter.js @@ -0,0 +1,341 @@ +import {validateOrderProducts} from "../api/order-api"; +import {$, $$, doc, pageInit, toaster} from "../base"; +import Modal from "bootstrap/js/dist/modal"; +import Carousel from "bootstrap/js/dist/carousel"; +import {utilites} from "../utilities"; +import { + addOrUpdateProduct, + cartDispose, + getCart, + priceTotal, + removeProductFromCart, + setProductCount, +} from "../cart-core"; +import {getCounterControl} from "../components"; +import {messages} from "../messages"; +import {strings} from "../i10n.ts"; + +const headerCartButton = $("#header-cart-button"); +const headerCartButtonCount = $("#header-cart-button #item-count"); +const cartViewRoot = $("#cart-modal #product-list"); +const submitCartButton = $("#cart-modal .submit-cart"); +const cartModalElement = $("#cart-modal"); +const cartModal = new Modal(cartModalElement, { + keyboard: false, +}); + +const isProductPage = location.pathname.startsWith("/produktar") && location.pathname.match(/\/./g).length === 3; +const isProductsGridPage = location.pathname.startsWith("/produktar") && location.pathname.match(/\/./g).length <= 2; + +if (!location.pathname.startsWith("/handlekorg")) { + pageInit(() => { + renderHeaderIcon(false); + renderProductButtons(); + cartModalElement.addEventListener("show.bs.modal", () => { + renderCartView(); + renderTotalView(); + }); + headerCartButton.addEventListener("click", () => cartModal.toggle()); + submitCartButton.addEventListener("click", () => submitCart()); + }); +} else { + headerCartButton.classList.add("d-none"); +} + +if (location.pathname.match("(\/produktar\/.*\/.*)") !== null && $("#carousel-navigator") !== null) { + const carousel = new Carousel($("#product-carousel")); + $$(".thumb-button").forEach(el => { + const index = el.dataset.thumbIndex; + el.onclick = () => carousel.to(index); + }); +} + +function dispose() { + cartDispose(); + renderHeaderIcon(); + renderCartView(); + renderTotalView(); + renderProductButtons(); +} + +function renderProductButtons() { + const cartData = getCart(); + if (isProductPage) { + const productWrapper = $("#single-product-wrapper"); + const productId = productWrapper.dataset.id; + const productIndex = utilites.array.isEmpty(cartData) ? -1 : cartData.findIndex(c => c.id === productId); + const bagButton = productWrapper.querySelector(".buttons .bag-button") ?? doc.createElement("dummy"); + const counterWrapper = productWrapper.querySelector(".buttons .counter-wrapper") ?? doc.createElement("dummy"); + bagButton.classList.remove("disabled"); + counterWrapper.innerHTML = ""; + + if (productIndex !== -1) { + const maxProductCount = bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount; + const minProductCount = "0"; + const product = cartData[productIndex]; + bagButton.classList.add("d-none"); + counterWrapper.appendChild(getCounterControl({ + initialCount: product.count, + min: minProductCount, + max: maxProductCount, + onChange: (e) => { + let newCount = e.target.value; + if (newCount <= minProductCount) { + removeProduct(product.id); + bagButton.classList.remove("d-none"); + return; + } + + if (newCount > maxProductCount) newCount = maxProductCount; + setProductCount(product.id, parseInt(newCount)); + renderHeaderIcon(); + $$("[data-id='" + product.id + "'] .counter-wrapper").forEach(el => { + el.querySelector(".number-input input").value = parseInt(newCount); + }); + }, + })); + } else { + bagButton.innerHTML = "Legg i handlekorgen"; + bagButton.onclick = () => addProduct(productId); + bagButton.classList.remove("d-none"); + } + } else if (isProductsGridPage) { + $$(".product-card").forEach(productCard => { + const productId = productCard.dataset.id; + const bagButton = productCard.querySelector(".buttons .bag-button") ?? doc.createElement("dummy"); + const counterWrapper = productCard.querySelector(".buttons .counter-wrapper") ?? doc.createElement("dummy"); + const productIndex = utilites.array.isEmpty(cartData) ? -1 : cartData.findIndex(c => c.id === productId); + bagButton.classList.remove("disabled"); + counterWrapper.innerHTML = ""; + + if (productIndex !== -1) { + const maxProductCount = bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount; + const minProductCount = "0"; + const product = cartData[productIndex]; + bagButton.innerHTML = "Legg i handlekorgen"; + bagButton.classList.add("d-none"); + counterWrapper.appendChild(getCounterControl({ + initialCount: product.count, + min: minProductCount, + max: maxProductCount, + onChange: (e) => { + let newCount = e.target.value; + if (newCount <= minProductCount) { + removeProduct(product.id); + bagButton.classList.remove("d-none"); + return; + } + if (newCount > maxProductCount) newCount = maxProductCount; + setProductCount(product.id, parseInt(newCount)); + renderHeaderIcon(); + $$("[data-id='" + product.id + "'] .counter-wrapper").forEach(el => { + el.querySelector(".number-input input").value = parseInt(newCount); + }); + + }, + })); + } else { + bagButton.innerHTML = "Legg i handlekorgen"; + bagButton.onclick = () => addProduct(productId); + bagButton.classList.remove("d-none"); + } + }); + } +} + +function getProductDataFromHtml(id) { + if (isProductsGridPage) { + const card = $(".product-card[data-id='" + id + "']"); + if (card === undefined) return card; + const bagButton = card.querySelector(".bag-button"); + return { + id: id, + name: card.querySelector(".card-title").innerText, + price: card.querySelector(".product-price").dataset.price, + readablePrice: card.querySelector(".product-price").innerText, + maxCount: bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount, + }; + } else if (isProductPage) { + const productWrapper = $("#single-product-wrapper[data-id='" + id + "']"); + if (productWrapper === undefined) return productWrapper; + const bagButton = productWrapper.querySelector(".bag-button"); + return { + id: id, + name: productWrapper.querySelector(".title").innerText, + description: productWrapper.querySelector(".description").innerText, + price: productWrapper.querySelector(".product-price").dataset.price, + readablePrice: productWrapper.querySelector(".product-price").innerText, + maxCount: bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount, + }; + } +} + +function addProduct(id) { + addOrUpdateProduct(getProductDataFromHtml(id), () => { + renderHeaderIcon(); + renderProductButtons(); + }); +} + +function removeProduct(id) { + removeProductFromCart(id, () => { + renderHeaderIcon(); + renderTotalView(); + renderCartView(); + renderProductButtons(); + }); +} + +function renderHeaderIcon() { + const cartData = getCart(); + if (utilites.array.isEmpty(cartData)) { + headerCartButtonCount.innerText = "0"; + return; + } + const currentCount = parseInt(headerCartButtonCount.innerText); + let count = 0; + for (const product of cartData) + count += product.count; + + if (currentCount !== count) { + headerCartButtonCount.innerText = count >= 1 ? count : "0"; + } +} + +function getProductListItemHTML(product) { + console.log(product); + const wrapper = doc.createElement("div"); + wrapper.dataset.id = product.id; + wrapper.className = "mb-3"; + + const card = doc.createElement("div"); + card.className = "card"; + + const cardHeaderWrapper = doc.createElement("div"); + cardHeaderWrapper.className = "card-header d-flex justify-content-between align-items-center"; + + const cardHeader = doc.createElement("h5"); + cardHeader.className = "mb-0"; + cardHeader.innerText = product.name; + cardHeaderWrapper.appendChild(cardHeader); + const removeProductButton = doc.createElement("button"); + removeProductButton.className = "btn btn-link shadow-none text-danger pe-0"; + removeProductButton.innerText = "Slett"; + removeProductButton.onclick = () => removeProduct(product.id); + cardHeaderWrapper.appendChild(removeProductButton); + + card.appendChild(cardHeaderWrapper); + const cardBody = doc.createElement("div"); + cardBody.className = "card-body"; + + const itemCountWrapper = doc.createElement("div"); + itemCountWrapper.className = "d-flex justify-content-between align-items-center"; + + itemCountWrapper.appendChild(getCounterControl({ + initialCount: product.count, + min: "0", + max: product.maxCount, + onChange: (e) => { + let newCount = e.target.value; + if (newCount <= "0") { + removeProduct(product.id); + return; + } + if (newCount > product.maxCount) newCount = product.maxCount; + setProductCount(product.id, parseInt(newCount)); + renderHeaderIcon(); + $$("[data-id='" + product.id + "'] .counter-wrapper").forEach(el => { + el.querySelector(".number-input input").value = newCount; + }); + renderTotalView(); + }, + })); + + const price = doc.createElement("div"); + price.className = "h3"; + price.innerText = product.readablePrice; + itemCountWrapper.appendChild(price); + + + cardBody.append(itemCountWrapper); + card.appendChild(cardBody); + wrapper.appendChild(card); + return wrapper; +} + +function renderTotalView() { + const cartTotal = priceTotal(); + if (cartTotal == null) { + $("#cart-modal .modal-footer").classList.add("d-none"); + $("#total").innerText = ""; + } else { + $("#cart-modal .modal-footer").classList.remove("d-none"); + $("#total").innerText = cartTotal; + } +} + +function renderCartView() { + const cartData = getCart(); + cartViewRoot.innerHTML = ""; + if (utilites.array.isEmpty(cartData)) { + const noItemsAlert = doc.createElement("div"); + noItemsAlert.className = "alert alert-primary"; + noItemsAlert.role = "alert"; + noItemsAlert.innerHTML = `${strings.languageSpesific.the_shopping_bag_is_empty}, ${strings.languageSpesific.go_to_LC} <a href='/produktar'>/produktar</a> ${strings.languageSpesific.to_add_LC}`; + cartViewRoot.appendChild(noItemsAlert); + } else { + for (const product of cartData) + cartViewRoot.appendChild(getProductListItemHTML(product)); + } +} + +function validateCartModal() { + return new Promise((greatSuccess, graveFailure) => { + const payload = { + products: [], + }; + + const cartData = getCart(); + if (utilites.array.isEmpty(cartData)) { + toaster.error(strings.languageSpesific.the_shopping_bag_is_empty); + return; + } + + for (const product of cartData) { + payload.products.push({ + id: product.id, + count: product.count, + }); + } + + validateOrderProducts(payload).then(res => { + if (res.ok) { + res.json().then(json => { + if (json.isValid) { + return greatSuccess(true); + } else { + toaster.error(strings.languageSpesific.invalid_form); + //TODO: show validation errors + return greatSuccess(false); + } + }); + } else { + utilites.handleError(res, { + title: strings.languageSpesific.could_not_validate_your_order, + message: strings.languageSpesific.try_again_soon, + }); + } + }).catch(err => { + console.error(err); + toaster.errorObj(messages.unknownError); + }); + }); +} + +function submitCart() { + validateCartModal().then(isValid => { + if (isValid === true) { + location.href = "/handlekorg"; + } + }); +} diff --git a/src/wwwroot/scripts/front/status.js b/src/wwwroot/scripts/front/status.js new file mode 100644 index 0000000..3addfac --- /dev/null +++ b/src/wwwroot/scripts/front/status.js @@ -0,0 +1,10 @@ +import {cartDispose} from "../cart-core"; +import {pageInit} from "../base"; + +if (location.pathname.startsWith("/status")) { + pageInit(() => { + const urlParams = new URLSearchParams(window.location.search); + const clearCart = urlParams.get("clearCart"); + if (clearCart) cartDispose(); + }); +} diff --git a/src/wwwroot/scripts/grid.ts b/src/wwwroot/scripts/grid.ts new file mode 100644 index 0000000..ecf708b --- /dev/null +++ b/src/wwwroot/scripts/grid.ts @@ -0,0 +1,390 @@ +import * as JsSearch from "js-search"; + +interface GridProps { + id?: string; + debug?: boolean; + data: Array<Object>; + columns: Array<GridColumn>; + pageSize?: number; + search?: SearchConfiguration; + classes?: GridClasses + strings?: GridStrings +} + +interface GridConfiguration { + id: string; + debug: boolean; + data: Array<Object>; + columns: Array<GridColumn>; + pageSize: number; + search: SearchConfiguration; + classes: GridClasses, + strings: GridStrings +} + +interface GridStrings { + previousPage: string, + nextPage: string, + search: string +} + +interface GridClasses { + table: string, + thead: string +} + +interface SearchConfiguration { + dataIds: Array<string | Array<string>>; +} + +interface GridColumn { + dataId?: string | Array<string>; + columnName: string | Function; + cellValue?: string | Function | Element; + width?: string; + maxWidth?: string; + minWidth?: string; + className?: string; + click?: Function +} + +export default class Grid { + private readonly canRender: boolean; + private readonly defaultOptions: GridConfiguration = { + id: "id", + debug: false, + columns: [], + data: [], + pageSize: 0, + classes: { + table: "table", + thead: "table-light" + }, + search: { + dataIds: [], + }, + strings: { + nextPage: "Neste", + previousPage: "Forrige", + search: "Søk" + } + }; + private configuration: GridConfiguration; + private domElement: Element; + private searchIndex: JsSearch.Search; + public currentPage: number = 0; + + constructor(props: GridProps) { + this.setOptions(props); + this.validateOptions(); + this.canRender = true; + } + + private setOptions(props: GridProps = this.defaultOptions): void { + this.configuration = {} as GridConfiguration; + this.configuration.columns = []; + for (const column of props.columns) { + if (isGridColumn(column)) { + this.configuration.columns.push(column); + } else { + this.log("column is not of type GridColumn: " + JSON.stringify(column)); + } + } + this.configuration.data = props.data ?? this.defaultOptions.data; + this.configuration.id = props.id ?? this.defaultOptions.id; + this.configuration.debug = props.debug ?? this.defaultOptions.debug; + this.configuration.pageSize = props.pageSize ?? this.defaultOptions.pageSize; + this.configuration.classes = props.classes ?? this.defaultOptions.classes; + this.configuration.search = props.search ?? this.defaultOptions.search; + this.configuration.strings = props.strings ?? this.defaultOptions.strings; + } + + private validateOptions(): void { + if (this.configuration.data.length === undefined) { + throw new GridError("props.data.length is undefined"); + } + if (this.configuration.columns.length === undefined || this.configuration.columns.length <= 0) { + throw new GridError("props.columns.length is undefined or <= 0"); + } + } + + private renderCurrentPageIndicator(): void { + if (this.configuration.pageSize <= 0) return; + this.domElement.querySelectorAll(".pagination .page-item").forEach((el) => { + if (el.getAttribute("data-page-number") == this.currentPage.toString()) el.classList.add("active"); + else el.classList.remove("active"); + }); + } + + private renderPaginator(): void { + this.log("start renderPaginator"); + if (this.configuration.pageSize <= 0 || this.configuration.data.length < this.configuration.pageSize) return; + const nav = document.createElement("nav"); + nav.className = "float-right user-select-none"; + const ul = document.createElement("ul"); + ul.className = "pagination"; + const previousItem = document.createElement("li"); + previousItem.className = "page-item"; + previousItem.onclick = () => this.navigate(this.currentPage - 1); + const previousLink = document.createElement("span"); + previousLink.style.cursor = "pointer"; + previousLink.className = "page-link"; + previousLink.innerText = this.configuration.strings.previousPage; + previousItem.appendChild(previousLink); + ul.appendChild(previousItem); + + for (let i = 0; i < this.configuration.data.length / this.configuration.pageSize; i++) { + const item = document.createElement("li"); + item.className = "page-item"; + item.dataset.pageNumber = i.toString(); + item.onclick = () => this.navigate(i); + const link = document.createElement("span"); + link.className = "page-link"; + link.style.cursor = "pointer"; + link.innerText = (i + 1).toString(); + item.appendChild(link); + ul.appendChild(item); + } + + const nextItem = document.createElement("li"); + nextItem.className = "page-item"; + nextItem.onclick = () => this.navigate(this.currentPage + 1); + const nextLink = document.createElement("span"); + nextLink.style.cursor = "pointer"; + nextLink.className = "page-link"; + nextLink.innerText = this.configuration.strings.nextPage; + nextItem.appendChild(nextLink); + + ul.appendChild(nextItem); + nav.appendChild(ul); + this.domElement.appendChild(nav); + this.log("end renderPaginator"); + } + + private renderWrapper(): void { + const wrapper = document.createElement("div"); + wrapper.className = "table-responsive"; + const table = document.createElement("table"); + const thead = document.createElement("thead"); + const tbody = document.createElement("tbody"); + table.className = this.configuration.classes.table; + thead.className = this.configuration.classes.thead; + table.appendChild(thead); + table.appendChild(tbody); + wrapper.appendChild(table); + this.domElement.appendChild(wrapper); + } + + private renderHead(): void { + const wrapper = this.domElement.querySelector("table thead"); + wrapper.innerHTML = ""; + const row = document.createElement("tr"); + for (const col of this.configuration.columns) { + const th = document.createElement("th"); + th.innerText = this.asString(col.columnName); + row.appendChild(th); + } + wrapper.appendChild(row); + } + + // https://github.com/bvaughn/js-search/blob/master/source/getNestedFieldValue.js + private getNestedFieldValue<T>(object: Object, path: Array<string>): T { + path = path || []; + object = object || {}; + + let value = object; + + // walk down the property path + for (let i = 0; i < path.length; i++) { + value = value[path[i]]; + if (value == null) { + return null; + } + } + + return value as T; + } + + private renderBody(data: Array<Object> = null, isSearchResult: boolean = false): void { + let wrapper: Element; + if (isSearchResult) { + this.domElement.querySelector("table tbody:not(.search-results)").classList.add("d-none"); + this.domElement.querySelector("table tbody.search-results").classList.remove("d-none"); + wrapper = this.domElement.querySelector("table tbody.search-results"); + } else { + this.domElement.querySelector("table tbody.search-results")?.classList.add("d-none"); + this.domElement.querySelector("table tbody:not(.search-results)").classList.remove("d-none"); + wrapper = this.domElement.querySelector("table tbody:not(.search-results)"); + } + wrapper.innerHTML = ""; + let items = data ?? this.configuration.data; + if (this.configuration.pageSize > 0) { + items = items.slice(0, this.configuration.pageSize); + } + for (const item of items) { + const row = document.createElement("tr"); + // @ts-ignore + row.dataset.id = item[this.configuration.id]; + for (const val of this.configuration.columns) { + const cell = document.createElement("td"); + cell.className = "text-break"; + if (val.width) cell.style.width = val.width; + if (val.maxWidth) cell.style.maxWidth = val.maxWidth; + if (val.minWidth) cell.style.minWidth = val.minWidth; + + if (val.click instanceof Function) cell.onclick = () => val.click(item); + if (val.className) { + this.log(val.className) + val.className.split(" ").forEach(className => { + cell.classList.add(className) + }) + } + if (val.cellValue instanceof Function) { + const computed = val.cellValue(item); + if (computed instanceof Element) cell.appendChild(computed); + else if (typeof computed === "string" || typeof computed === "number") cell.innerText = computed as string; + } else if (Array.isArray(val.dataId)) { + cell.innerText = this.getNestedFieldValue(item, val.dataId); + } else if (typeof val.dataId === "string" && val.dataId.length > 0) { + cell.innerText = item[val.dataId]; + } else if (typeof val.cellValue === "string" || typeof val.cellValue === "number") { + cell.innerText = val.cellValue; + } else if (val.cellValue instanceof Element) { + cell.appendChild(val.cellValue); + } + row.appendChild(cell); + } + wrapper.appendChild(row); + } + } + + private asString(val: string | Function, callbackData: any = undefined) { + if (val instanceof Function) { + return val(callbackData); + } else { + return val; + } + } + + private static id(): string { + return Math.random().toString(36).substring(2) + Date.now().toString(36); + } + + private log(message: any): void { + if (!this.configuration.debug) return; + console.log("Grid Debug: " + message); + } + + private renderSearch() { + if (this.configuration.search.dataIds.length < 1) return; + const wrapper = document.createElement("div"); + const searchInput = document.createElement("input"); + searchInput.type = "text"; + searchInput.className = "form-control"; + searchInput.placeholder = this.configuration.strings.search; + searchInput.oninput = () => this.search(searchInput.value); + wrapper.appendChild(searchInput); + this.domElement.appendChild(wrapper); + } + + private renderSearchResultWrapper() { + if (this.configuration.search.dataIds.length < 1) return; + const searchWrapper = document.createElement("tbody"); + searchWrapper.className = "search-results"; + this.domElement.querySelector("table").appendChild(searchWrapper); + } + + private populateSearchIndex() { + if (this.configuration.search.dataIds.length < 1) return; + this.searchIndex = new JsSearch.Search(this.configuration.id); + this.searchIndex.indexStrategy = new JsSearch.PrefixIndexStrategy(); + this.configuration.search.dataIds.forEach((id) => this.searchIndex.addIndex(id)); + this.searchIndex.addDocuments(this.configuration.data); + } + + public search(query: string): void { + if (this.configuration.search.dataIds.length < 1) return; + let result = this.searchIndex.search(query); + if (result.length === 0) { + this.renderBody(this.configuration.data); + } else { + this.renderBody(result, true); + } + } + + public navigate(pageNumber: number): void { + const maxPage = Math.ceil(this.configuration.data.length / this.configuration.pageSize - 1); + if (this.configuration.pageSize <= 0 || pageNumber < 0 || pageNumber === this.currentPage || pageNumber > maxPage) return; + this.log("Navigating to page: " + pageNumber); + const skipCount = this.configuration.pageSize * pageNumber; + const endIndex = + this.configuration.data.length < skipCount + this.configuration.pageSize + ? this.configuration.data.length + : skipCount + this.configuration.pageSize; + this.renderBody(this.configuration.data.slice(skipCount, endIndex)); + this.currentPage = pageNumber; + this.renderCurrentPageIndicator(); + } + + public removeByID(id: string): void { + // @ts-ignore + const itemIndex = this.configuration.data.findIndex((c) => c[this.configuration.id] === id); + if (itemIndex !== -1) { + delete this.configuration.data[itemIndex]; + this.domElement.querySelector(`tr[data-id="${id}"]`).remove(); + } else { + this.log("Grid does not contain id: " + id); + } + } + + public refresh(data?: Array<Object>) { + this.renderPaginator(); + this.navigate(0); + if (data !== undefined) this.configuration.data = data; + this.renderBody(); + this.populateSearchIndex(); + } + + public render(el: Element): void { + if (this.canRender) { + this.log("Grid starting render"); + this.domElement = el; + this.renderSearch(); + this.populateSearchIndex(); + this.renderWrapper(); + this.renderHead(); + this.renderBody(); + this.renderPaginator(); + this.renderCurrentPageIndicator(); + this.renderSearchResultWrapper(); + this.log("Grid was rendered"); + } else { + throw new GridError("render is not allowed due to invalid props"); + } + } +} + +class GridError extends Error { + constructor(message: string) { + super(message); + this.name = "GridError"; + } +} + +function isArrayOfGridColumn(array: Array<GridColumn> | Array<string>): array is Array<GridColumn> { + try { + // @ts-ignore + return !(array.map((element) => "name" in element).indexOf(false) !== -1); + } catch (e) { + return false; + } +} + +function isGridColumn(val: GridColumn | string): val is GridColumn { + try { + // @ts-ignore + return "columnName" in val && ("cellValue" in val || "dataId" in val); + } catch (e) { + return false; + } +} diff --git a/src/wwwroot/scripts/i10n.ts b/src/wwwroot/scripts/i10n.ts new file mode 100644 index 0000000..e26b0be --- /dev/null +++ b/src/wwwroot/scripts/i10n.ts @@ -0,0 +1,95 @@ +/** + * _LC = lowercase + * _V = verb + */ + +/* +import {configuration} from "./configuration"; +import Cookies from "js-cookie"; +*/ + +const versions = [ + { + id: "nb", + isDefault: true, + value: { + could_not_reach_server: "Kunne ikkje kontakte serveren", + an_unknown_error_occured: "Ein uventa feil oppstod", + an_error_occured: "Ein feil oppstod", + try_again_soon: "Prøv igjen snart", + new_password_is_applied: "Nytt passord er sett", + are_you_sure: "Er du sikker?", + are_you_sure_you_want_to_delete: "Er du sikker på at du vil slette", + is_deleted_LC: "er sletta", + has_invalid_file_format_LC: "har ugyldig filformat", + delete: "Slett", + cancel: "Kanseller", + view: "Inspiser", + edit: "Rediger", + invalid_form: "Ugyldig skjema", + the_product_is_updated: "Produktet er oppdatert", + the_product_is_added: "Produktet er lagt til", + could_not: "Kunne ikkje", + could_not_update_the_product: "Kunne ikkje oppdatere produktet", + could_not_add_the_product: "Kunne ikkje legge til produktet", + could_not_add_the_category: "Kunne ikkje legge til kategorien", + could_not_retrieve_products: "Kunne ikkje hente produktene", + could_not_retrieve_orders: "Kunne ikkje hente bestillingene", + could_not_retrieve_categories: "Kunne ikkje hente kategoriene", + could_not_delete_product: "Kunne ikkje slette produktet", + could_not_delete_category: "Kunne ikkje slette kategorien", + could_not_upload: "Kunne ikkje laste opp", + too_many_files: "For mange filer", + max_five_files_at_a_time: "Maks 5 filer om gangen", + invalid_file: "Ugyldig fil", + is_too_big_LC: "er for stor", + too_big_file: "For stor fil", + the_image: "Bildet", + the_images: "Bildene", + is_uploaded_LC: "er lasta opp", + picture_of_the_product: "Bilde av produktet", + save: "Lagre", + new_product: "Nytt produkt", + create: "Opprett", + hide_V: "Gjemme", + show_V: "Vise", + show: "Vis", + hide: "Gjem", + are_you_sure_you_want_to: "Er du sikker på at du vil", + in_the_store: "I butikken", + is_required_LC: "er påkrevd", + is_invalid_LC: "er ugyldig", + name: "Namn", + the_email_address: "E-postadressen", + the_password: "Passordet", + could_not_validate_your_order: "Kunne ikkje validere din ordre", + the_shopping_bag_is_empty: "Handlekorgen er tom", + to_add_LC: "for å legge til", + go_to: "Gå til", + go_to_LC: "gå til", + click_on: "Trykk på", + search: "Søk", + next_page: "Neste side", + previous_page: "Forrige side", + }, + }, +]; + +/*function getIsoCodeFromCultureCookie(v) { + if (v === undefined) return ""; + return v.slice(v.lastIndexOf('=') + 1) +} +// uses js-cookie +const prefferedLanguage = getIsoCodeFromCultureCookie(Cookies.get(configuration.cookies.culture)); +const indexOfPrefferedLanguage = versions.findIndex(version => version.id === prefferedLanguage); +const indexOfDefaultLanguage = versions.findIndex(version => version.isDefault === true); +export const strings = { + languageSpesific: indexOfPrefferedLanguage !== -1 + ? versions[indexOfPrefferedLanguage].value + : versions[indexOfDefaultLanguage].value, +}; + */ + +export const strings = { + languageSpesific: versions[0].value +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/icons.js b/src/wwwroot/scripts/icons.js new file mode 100644 index 0000000..6fa3559 --- /dev/null +++ b/src/wwwroot/scripts/icons.js @@ -0,0 +1,58 @@ +export function bagDashIcon(height = "1em", width = "1em") { + return ` +<svg width="${height}" height="${height}" viewBox="0 0 16 16" class="bi bi-bag-plus" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" d="M8 1a2.5 2.5 0 0 0-2.5 2.5V4h5v-.5A2.5 2.5 0 0 0 8 1zm3.5 3v-.5a3.5 3.5 0 1 0-7 0V4H1v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4h-3.5zM2 5v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5H2z"/> + <path fill-rule="evenodd" d="M5.5 10a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1H6a.5.5 0 0 1-.5-.5z"/> +</svg> +`; +} + +export function bagPlusIcon(height = "1em", width = "1em") { + return ` +<svg width="${height}" height="${height}" viewBox="0 0 16 16" class="bi bi-bag-plus" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" d="M8 1a2.5 2.5 0 0 0-2.5 2.5V4h5v-.5A2.5 2.5 0 0 0 8 1zm3.5 3v-.5a3.5 3.5 0 1 0-7 0V4H1v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4h-3.5zM2 5v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5H2z"/> + <path fill-rule="evenodd" d="M8 7.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V12a.5.5 0 0 1-1 0v-1.5H6a.5.5 0 0 1 0-1h1.5V8a.5.5 0 0 1 .5-.5z"/> +</svg> +`; +} + +export function trashIcon(height = "1em", width = "1em") { + return ` +<svg width="${height}" height="${height}" viewBox="0 0 16 16" class="bi bi-trash2" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" d="M3.18 4l1.528 9.164a1 1 0 0 0 .986.836h4.612a1 1 0 0 0 .986-.836L12.82 4H3.18zm.541 9.329A2 2 0 0 0 5.694 15h4.612a2 2 0 0 0 1.973-1.671L14 3H2l1.721 10.329z"/> + <path d="M14 3c0 1.105-2.686 2-6 2s-6-.895-6-2 2.686-2 6-2 6 .895 6 2z"/> + <path fill-rule="evenodd" d="M12.9 3c-.18-.14-.497-.307-.974-.466C10.967 2.214 9.58 2 8 2s-2.968.215-3.926.534c-.477.16-.795.327-.975.466.18.14.498.307.975.466C5.032 3.786 6.42 4 8 4s2.967-.215 3.926-.534c.477-.16.795-.327.975-.466zM8 5c3.314 0 6-.895 6-2s-2.686-2-6-2-6 .895-6 2 2.686 2 6 2z"/> +</svg>`; +} + +export function plusIcon(height = "1em", width = "1em") { + return ` +<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-plus" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/> +</svg> +`; +} + +export function pencilSquareIcon(height = "1em", width = "1em") { + return ` +<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-pencil-square" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456l-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z"/> + <path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5v11z"/> +</svg> +`; +} + +export function threeDotsVerticalIcon(height = "1em", width = "1em") { + return ` +<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-three-dots-vertical" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/> +</svg>`; +} + +export function eyeIcon(height = "1em", width = "1em") { + return ` +<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-eye" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.134 13.134 0 0 0 1.66 2.043C4.12 11.332 5.88 12.5 8 12.5c2.12 0 3.879-1.168 5.168-2.457A13.134 13.134 0 0 0 14.828 8a13.133 13.133 0 0 0-1.66-2.043C11.879 4.668 10.119 3.5 8 3.5c-2.12 0-3.879 1.168-5.168 2.457A13.133 13.133 0 0 0 1.172 8z"/> + <path fill-rule="evenodd" d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/> +</svg>`; +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/messages.js b/src/wwwroot/scripts/messages.js new file mode 100644 index 0000000..a426677 --- /dev/null +++ b/src/wwwroot/scripts/messages.js @@ -0,0 +1,12 @@ +import {strings} from "./i10n.ts"; + +export const messages = { + networkRequestFailed: { + title: strings.languageSpesific.could_not_reach_server, + message: strings.languageSpesific.try_again_soon, + }, + unknownError: { + title: strings.languageSpesific.an_unknown_error_occured, + message: strings.languageSpesific.try_again_soon, + }, +};
\ No newline at end of file diff --git a/src/wwwroot/scripts/tabs.js b/src/wwwroot/scripts/tabs.js new file mode 100644 index 0000000..69d670c --- /dev/null +++ b/src/wwwroot/scripts/tabs.js @@ -0,0 +1,31 @@ +export function initTabs() { + let firstActiveIsShown = false; + document.querySelectorAll(".tab-content-container[data-tab]").forEach(contentContainer => { + if (contentContainer.classList.contains("active") && !firstActiveIsShown) { + firstActiveIsShown = true; + return; + } + contentContainer.style.display = "none"; + }); + + document.querySelectorAll(".tab-button[data-tab]").forEach(button => { + button.addEventListener("click", handleButtonClick); + }); + + function handleButtonClick(element) { + if (element.originalTarget.dataset.tab) { + document.querySelectorAll(".tab-button[data-tab]").forEach(b => { + if (b.dataset.tab === element.originalTarget.dataset.tab) + b.classList.add("active"); + else + b.classList.remove("active"); + }); + document.querySelectorAll(".tab-content-container[data-tab]").forEach(c => { + if (c.dataset.tab === element.originalTarget.dataset.tab) + c.style.display = ""; + else + c.style.display = "none"; + }); + } + } +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/toaster.js b/src/wwwroot/scripts/toaster.js new file mode 100644 index 0000000..c0e039d --- /dev/null +++ b/src/wwwroot/scripts/toaster.js @@ -0,0 +1,131 @@ +import Toast from "bootstrap/js/dist/toast"; + +export class Toaster { + constructor(options) { + if (!options) { + options = {hideAfter: 3500, position: "top-right"}; + } + this.root = document.createElement("div"); + this.root.id = "toaster-container"; + switch (options.position) { + case"top-right": + this.root.style = "display: flex; align-items: end; flex-direction: column; position: absolute; top: 0; right: 0; padding: 15px; z-index: 9999;"; + break; + case"top-left": + this.root.style = "position: absolute; top: 0; padding: 15px; z-index: 9999;"; + break; + case"bottom-right": + this.root.style = "display: flex; align-items: end; flex-direction: column; position: absolute; bottom: 0; right: 0; padding: 15px; z-index: 9999;"; + break; + case"bottom-left": + this.root.style = "position: absolute; bottom: 0; padding: 15px; z-index: 9999;"; + break; + default: + this.root.style = "display: flex; align-items: end; flex-direction: column; position: absolute; top: 0; right: 0; padding: 15px; z-index: 9999;"; + break; + } + document.body.appendChild(this.root); + this.defaultTimeout = options.hideAfter ? options.hideAfter : 3500; + this.toastTypes = {error: "error", success: "success", info: "info"}; + } + + display(title, message, autohide, type) { + if (!title || typeof title !== "string" || typeof message !== "string") { + throw new Error("Toaster: title &| message is empty or not a string"); + } + let toast = document.createElement("div"); + toast.className = "toast"; + toast.role = "alert"; + toast.id = Math.random().toString(36).substring(2) + Date.now().toString(36); + let toastHeader = document.createElement("div"); + toastHeader.className = "toast-header"; + let toastTypeIndicator = document.createElement("div"); + switch (type) { + case this.toastTypes.error: + toastTypeIndicator.className = "toast-type-indicator rounded me-2 bg-danger"; + toast.style = "width: max-content; min-width: 300px; border-color: var(--bs-danger);"; + break; + case this.toastTypes.success: + toastTypeIndicator.className = "toast-type-indicator rounded me-2 bg-success"; + toast.style = "width: max-content; min-width: 300px; border-color: var(--bs-success);"; + break; + case this.toastTypes.info: + toastTypeIndicator.className = "toast-type-indicator rounded me-2 bg-info"; + toast.style = "width: max-content; min-width: 300px; border-color: var(--bs-info);"; + break; + } + toastTypeIndicator.style = "width: 18px; height: 18px;"; + toastHeader.appendChild(toastTypeIndicator); + let toastTitle = document.createElement("strong"); + toastTitle.className = "me-auto text-truncate"; + toastTitle.innerText = title; + toastHeader.appendChild(toastTitle); + let toastCloseButton = document.createElement("button"); + toastCloseButton.className = "ms-2 mb-1 close"; + toastCloseButton.setAttribute("data-bs-dismiss","toast"); + toastCloseButton.onclick = () => { + setTimeout(() => { + toast.parentNode.removeChild(toast); + }, parseInt(1e3)); + }; + if (!autohide) { + let toastCloseButtonIcon = document.createElement("img"); + toastCloseButtonIcon.src = "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M14 1H2a1 1 0 00-1 1v12a1 1 0 001 1h12a1 1 0 001-1V2a1 1 0 00-1-1zM2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V2a2 2 0 00-2-2H2z\" clip-rule=\"evenodd\"/><path fill-rule=\"evenodd\" d=\"M11.854 4.146a.5.5 0 010 .708l-7 7a.5.5 0 01-.708-.708l7-7a.5.5 0 01.708 0z\" clip-rule=\"evenodd\"/><path fill-rule=\"evenodd\" d=\"M4.146 4.146a.5.5 0 000 .708l7 7a.5.5 0 00.708-.708l-7-7a.5.5 0 00-.708 0z\" clip-rule=\"evenodd\"/></svg>"; + toastCloseButtonIcon.alt = "x"; + toastCloseButtonIcon.dataset.ariaHidden = "true"; + toastCloseButton.appendChild(toastCloseButtonIcon); + toastHeader.appendChild(toastCloseButton); + } + toast.appendChild(toastHeader); + if (message) { + let toastBody = document.createElement("div"); + toastBody.className = "toast-body"; + toastBody.style = "word-wrap: break-word;"; + toastBody.innerText = message; + toast.appendChild(toastBody); + } + this.root.appendChild(toast); + let delay = 0; + if (typeof autohide === "number" && autohide !== 0) { + delay = autohide; + autohide = true; + } else if (autohide) { + delay = this.defaultTimeout; + } + new Toast(document.getElementById(toast.id), { + animation: true, + autohide: autohide, + delay: delay + }).show(); + if (delay) setTimeout(() => { + toast.parentNode.removeChild(toast); + }, parseInt(delay + 1e3)); + } + + error(title, message = "", autohide = true) { + this.display(title, message, autohide, this.toastTypes.error); + } + + errorObj(props) { + if (props.autohide === undefined) props.autohide = true; + this.display(props.title, props.message, props.autohide, this.toastTypes.error); + } + + success(title, message = "", autohide = true) { + this.display(title, message, autohide, this.toastTypes.success); + } + + successObj(props) { + if (props.autohide === undefined) props.autohide = true; + this.display(props.title, props.message, props.autohide, this.toastTypes.success); + } + + info(title, message = "", autohide = true) { + this.display(title, message, autohide, this.toastTypes.info); + } + + infoObj(props) { + if (props.autohide === undefined) props.autohide = true; + this.display(props.title, props.message, props.autohide, this.toastTypes.info); + } +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/utilities.js b/src/wwwroot/scripts/utilities.js new file mode 100644 index 0000000..02af8b5 --- /dev/null +++ b/src/wwwroot/scripts/utilities.js @@ -0,0 +1,254 @@ +import {toaster} from "./base"; +import {messages} from "./messages"; + +export const utilites = { + dom: { + restrictInputToNumbers(el, specials, mergeSpecialsWithDefaults) { + el.addEventListener("keydown", e => { + const defaultSpecials = [ + "Backspace", + "ArrowLeft", + "ArrowRight", + "Tab", + ]; + let keys = specials ?? defaultSpecials; + if (mergeSpecialsWithDefaults && specials) keys = [...specials, ...defaultSpecials]; + if (keys.indexOf(e.key) !== -1) { + return; + } + if (isNaN(parseInt(e.key))) { + e.preventDefault(); + } + }); + }, + elementHasFocus: (el) => el === document.activeElement, + moveFocus(element) { + if (!element) element = document.getElementsByTagName("body")[0]; + element.focus(); + if (!this.elementHasFocus(element)) { + element.setAttribute("tabindex", "-1"); + element.focus(); + } + }, + }, + array: { + isEmpty: (arr) => arr === undefined || !Array.isArray(arr) || arr.length <= 0, + removeItemOnce(arr, value) { + const index = arr.indexOf(value); + if (index > -1) { + arr.splice(index, 1); + } + return arr; + }, + pushOrUpdate(arr, obj) { + const index = arr.findIndex((e) => e.id === obj.id); + if (index === -1) { + arr.push(obj); + } else { + arr[index] = obj; + } + }, + removeItemAll(arr, value) { + let i = 0; + while (i < arr.length) { + if (arr[i] === value) { + arr.splice(i, 1); + } else { + ++i; + } + } + return arr; + }, + removeItemByIdAll(arr, value) { + let i = 0; + while (i < arr.length) { + if (arr[i].id === value.id) { + arr.splice(i, 1); + } else { + ++i; + } + } + return arr; + }, + }, + object: { + // http://youmightnotneedjquery.com/#deep_extend + extend(object, ext) { + ext = ext || {}; + for (let i = 1; i < object.length; i++) { + let obj = object[i]; + if (!obj) continue; + for (let key in obj) { + if (obj.hasOwnProperty(key)) { + if (typeof obj[key] === "object") { + if (obj[key] instanceof Array) + ext[key] = obj[key].slice(0); + else + ext[key] = this.extend(ext[key], obj[key]); + } else + ext[key] = obj[key]; + } + } + } + return ext; + }, + isEmptyObj(obj) { + return obj !== undefined && Object.keys(obj).length > 0; + }, + }, + validators: { + isEmail(input) { + const re = /\S+@\S+\.\S+/; + return re.test(input); + }, + }, + getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; + }, + isInternetExplorer() { + const ua = navigator.userAgent; + return ua.indexOf("MSIE") > -1 || ua.indexOf("Trident") > -1; + }, + toReadableDateString(date) { + date.setMinutes(date.getMinutes() - date.getTimezoneOffset()); + return date.toLocaleString("nb-NO"); + }, + toReadableBytes(bytes) { + const s = ["bytes", "kB", "MB", "GB", "TB", "PB"]; + const e = Math.floor(Math.log(bytes) / Math.log(1024)); + return (bytes / Math.pow(1024, e)).toFixed(2) + " " + s[e]; + }, + toReadablePriceSuffix(suffix) { + switch (suffix) { + case 0: + return ",-"; + case 1: + return ",- kg"; + case 2: + return ",- stk"; + } + }, + setSessionStorageJSON(key, object) { + sessionStorage.setItem(key, JSON.stringify(object)); + }, + getSessionStorageJSON(key) { + const dataString = sessionStorage.getItem(key); + if (dataString === null) return undefined; + return JSON.parse(dataString); + }, + setLocalStorageJSON(key, object) { + localStorage.setItem(key, JSON.stringify(object)); + }, + getLocalStorageJSON(key) { + const dataString = localStorage.getItem(key); + if (dataString === null) return undefined; + return JSON.parse(dataString); + }, + handleError: (httpResult, fallback) => { + if (httpResult.headers !== undefined && httpResult.headers.get("ContentType") === "application/json") { + httpResult.json().then(error => { + console.error(error); + toaster.errorObj(utilites.errorOrDefault(error, fallback)); + }); + } else { + toaster.errorObj(fallback); + } + }, + getOrderStatusName: (status) => { + switch (status) { + case 0: + return "Pågående"; + case 1: + return "Kansellert"; + case 2: + return "Feilet"; + case 3: + return "Fullført"; + case 4: + return "Venter på faktura"; + case 5: + return "Venter på vipps"; + default: + return "Ukjent"; + } + }, + getOrderPaymentName: (status) => { + switch (status) { + case 0: + return "Vipps"; + case 1: + return "Faktura på mail"; + default: + return "Ukjent"; + } + }, + errorOrDefault: (res, fallback) => { + let title; + let message; + + if (res.title) title = res.title; + else if (fallback.title) title = fallback.title; + else title = messages.unknownError.title; + + if (res.message) message = res.message; + else if (fallback.message) message = fallback.message; + else message = messages.unknownError.message; + + return { + title, + message, + }; + }, + // https://stackoverflow.com/a/15757499/11961742 + resolveReferences(json) { + if (typeof json === "string") + json = JSON.parse(json); + + const byid = {}, // all objects by id + refs = []; // references to objects that could not be resolved + json = (function recurse(obj, prop, parent) { + if (typeof obj !== "object" || !obj) // a primitive value + return obj; + if (Object.prototype.toString.call(obj) === "[object Array]") { + for (let i = 0; i < obj.length; i++) { + // check also if the array element is not a primitive value + if (typeof obj[i] !== "object" || !obj[i]) {// a primitive value + continue; + } else if ("$ref" in obj[i]) { + obj[i] = recurse(obj[i], i, obj); + } else { + obj[i] = recurse(obj[i], prop, obj); + } + } + return obj; + } + if ("$ref" in obj) { // a reference + let ref = obj.$ref; + if (ref in byid) + return byid[ref]; + // else we have to make it lazy: + refs.push([parent, prop, ref]); + return; + } else if ("$id" in obj) { + let id = obj.$id; + delete obj.$id; + if ("$values" in obj) // an array + obj = obj.$values.map(recurse); + else // a plain object + for (let prop in obj) + obj[prop] = recurse(obj[prop], prop, obj); + byid[id] = obj; + } + return obj; + })(json); // run it! + + for (let i = 0; i < refs.length; i++) { // resolve previously unknown references + let ref = refs[i]; + ref[0][ref[1]] = byid[ref[2]]; + // Notice that this throws if you put in a reference at top-level + } + return json; + }, +}; diff --git a/src/wwwroot/scripts/vendor/cycle.js b/src/wwwroot/scripts/vendor/cycle.js new file mode 100644 index 0000000..10262a9 --- /dev/null +++ b/src/wwwroot/scripts/vendor/cycle.js @@ -0,0 +1,174 @@ +/* + cycle.js + 2018-05-15 + Public Domain. + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. +*/ + +// The file uses the WeakMap feature of ES6. + +/*jslint eval */ + +/*property + $ref, decycle, forEach, get, indexOf, isArray, keys, length, push, + retrocycle, set, stringify, test +*/ + +export function decycle(object, replacer) { + "use strict"; + +// Make a deep copy of an object or array, assuring that there is at most +// one instance of each object or array in the resulting structure. The +// duplicate references (which might be forming cycles) are replaced with +// an object of the form + +// {"$ref": PATH} + +// where the PATH is a JSONPath string that locates the first occurance. + +// So, + +// var a = []; +// a[0] = a; +// return JSON.stringify(JSON.decycle(a)); + +// produces the string '[{"$ref":"$"}]'. + +// If a replacer function is provided, then it will be called for each value. +// A replacer function receives a value and returns a replacement value. + +// JSONPath is used to locate the unique object. $ indicates the top level of +// the object or array. [NUMBER] or [STRING] indicates a child element or +// property. + + var objects = new WeakMap(); // object to path mappings + + return (function derez(value, path) { + +// The derez function recurses through the object, producing the deep copy. + + var old_path; // The path of an earlier occurance of value + var nu; // The new object or array + +// If a replacer function was provided, then call it to get a replacement value. + + if (replacer !== undefined) { + value = replacer(value); + } + +// typeof null === "object", so go on if this value is really an object but not +// one of the weird builtin objects. + + if ( + typeof value === "object" + && value !== null + && !(value instanceof Boolean) + && !(value instanceof Date) + && !(value instanceof Number) + && !(value instanceof RegExp) + && !(value instanceof String) + ) { + +// If the value is an object or array, look to see if we have already +// encountered it. If so, return a {"$ref":PATH} object. This uses an +// ES6 WeakMap. + + old_path = objects.get(value); + if (old_path !== undefined) { + return {$ref: old_path}; + } + +// Otherwise, accumulate the unique value and its path. + + objects.set(value, path); + +// If it is an array, replicate the array. + + if (Array.isArray(value)) { + nu = []; + value.forEach(function (element, i) { + nu[i] = derez(element, path + "[" + i + "]"); + }); + } else { + +// If it is an object, replicate the object. + + nu = {}; + Object.keys(value).forEach(function (name) { + nu[name] = derez( + value[name], + path + "[" + JSON.stringify(name) + "]", + ); + }); + } + return nu; + } + return value; + }(object, "$")); +} + + +export function retrocycle($) { + "use strict"; + +// Restore an object that was reduced by decycle. Members whose values are +// objects of the form +// {$ref: PATH} +// are replaced with references to the value found by the PATH. This will +// restore cycles. The object will be mutated. + +// The eval function is used to locate the values described by a PATH. The +// root object is kept in a $ variable. A regular expression is used to +// assure that the PATH is extremely well formed. The regexp contains nested +// * quantifiers. That has been known to have extremely bad performance +// problems on some browsers for very long strings. A PATH is expected to be +// reasonably short. A PATH is allowed to belong to a very restricted subset of +// Goessner's JSONPath. + +// So, +// var s = '[{"$ref":"$"}]'; +// return JSON.retrocycle(JSON.parse(s)); +// produces an array containing a single element which is the array itself. + + var px = /^\$(?:\[(?:\d+|"(?:[^\\"\u0000-\u001f]|\\(?:[\\"\/bfnrt]|u[0-9a-zA-Z]{4}))*")\])*$/; + + (function rez(value) { + +// The rez function walks recursively through the object looking for $ref +// properties. When it finds one that has a value that is a path, then it +// replaces the $ref object with a reference to the value that is found by +// the path. + + if (value && typeof value === "object") { + if (Array.isArray(value)) { + value.forEach(function (element, i) { + if (typeof element === "object" && element !== null) { + var path = element.$ref; + if (typeof path === "string" && px.test(path)) { + value[i] = eval(path); + } else { + rez(element); + } + } + }); + } else { + Object.keys(value).forEach(function (name) { + var item = value[name]; + if (typeof item === "object" && item !== null) { + var path = item.$ref; + if (typeof path === "string" && px.test(path)) { + value[name] = eval(path); + } else { + rez(item); + } + } + }); + } + } + }($)); + return $; +}
\ No newline at end of file diff --git a/src/wwwroot/scripts/vendor/quill.js b/src/wwwroot/scripts/vendor/quill.js new file mode 100644 index 0000000..fa7e400 --- /dev/null +++ b/src/wwwroot/scripts/vendor/quill.js @@ -0,0 +1,25 @@ +import Quill from "quill/core"; + +import Toolbar from "quill/modules/toolbar"; +import Snow from "quill/themes/snow"; + +import Bold from "quill/formats/bold"; +import Italic from "quill/formats/italic"; +import Header from "quill/formats/header"; +import ImageUploader from "quill-image-uploader"; +import BlotFormatter from "quill-blot-formatter"; +import {ImageDrop} from "quill-image-drop-module"; + +Quill.register({ + "modules/toolbar": Toolbar, + "modules/imageDrop": ImageDrop, + "modules/blotFormatter": BlotFormatter, + "modules/imageUploader": ImageUploader, + "themes/snow": Snow, + "formats/bold": Bold, + "formats/italic": Italic, + "formats/header": Header, +}); + + +export default Quill; diff --git a/src/wwwroot/styles/back.scss b/src/wwwroot/styles/back.scss new file mode 100644 index 0000000..145ee54 --- /dev/null +++ b/src/wwwroot/styles/back.scss @@ -0,0 +1,45 @@ + +.product-form-image-thumbnail { + max-width: 250px; + min-width: 250px; + + .card { + height: 100%; + } + + img { + object-fit: cover; + height: 100%; + } + + .context-menu-button { + margin: -1rem; + background: rgba(0, 0, 0, .4); + color: white; + border: none; + border-radius: 0 0 0 0.25rem; + padding: 0 0 2px 0; + cursor: pointer !important; + } +} + + +#input-images-row { + flex-wrap: unset; + overflow-x: auto; +} + +.draghandle { + margin-left: -74px; + padding-right: 24px; + cursor: move; + display: none; +} + +#products.dragging .draghandle { + display: inline-block !important; +} + +#products.dragging .products-wrapper { + display: none !important; +} diff --git a/src/wwwroot/styles/base.scss b/src/wwwroot/styles/base.scss new file mode 100644 index 0000000..493c4eb --- /dev/null +++ b/src/wwwroot/styles/base.scss @@ -0,0 +1,168 @@ +.cursor-pointer { + cursor: pointer; +} + +label { + user-select: none; +} + +img { + user-select: none; +} + +.btn { + .spinner-border { + display: none; + } + + .disabled { + user-select: none; + pointer-events: none; + cursor: not-allowed; + opacity: .4; + } + + &.loading { + user-select: none; + pointer-events: none; + cursor: wait; + opacity: .5; + + > .spinner-border { + display: inline-block; + } + } +} + +form { + .loader { + display: none; + } + + .disabled { + user-select: none; + pointer-events: none; + cursor: not-allowed; + opacity: .4; + } + + &.loading { + user-select: none; + pointer-events: none; + cursor: wait; + opacity: .5; + } +} + +img { + &.object-fit-cover { + object-fit: cover; + } + + &.object-fit-fill { + object-fit: fill; + } + + &.object-fit-contain { + object-fit: contain; + } +} + +.text-bold { + font-weight: 600; +} + +.btn { + border-radius: 0; + + &.btn-primary { + color: white; + } + + &.btn-outline-primary:hover { + color: white; + } + +} + +.m-0-auto { + margin: 0 auto; +} + +.flex-1 { + flex: 1; +} + +.w-150px { + width: 150px; +} + +.mw-150px { + max-width: 150px; +} + +.mw-450px { + max-width: 450px; +} + +.w-100px { + width: 100px +} + +.w-max-content { + width: max-content; +} + +.mw-100px { + max-width: 100px +} + +.mh-150px { + min-height: 150px; +} + +.number-input { + max-width: 90px; + width: 90px; + display: flex; + height: 30px; + background: rgba($vsh-orange, 0.8); + border-radius: 0; + border: 1px solid rgba($vsh-orange, 0.8); + + input { + max-width: 5ch; + border: none; + text-align: center; + -moz-appearance: textfield; + } + + button { + border: none; + height: 100%; + display: flex; + align-items: center; + width: 30px; + background: transparent; + font-size: 22px; + cursor: pointer; + padding: 0 5px; + } + + + input::-webkit-inner-spin-button, + input::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } +} + +.blur-up { + opacity: 0; + transition: opacity 200ms; + + &.lazyloaded { + opacity: 1; + } +} + diff --git a/src/wwwroot/styles/front.scss b/src/wwwroot/styles/front.scss new file mode 100644 index 0000000..e2fa4b8 --- /dev/null +++ b/src/wwwroot/styles/front.scss @@ -0,0 +1,190 @@ +:root { + --navbar-height: 72px; +} + +body { + padding-top: var(--navbar-height); + color: #333; +} + +.big-text { + font-size: 1.875rem; +} + +.navbar { + height: var(--navbar-height); + + .nav-link.active { + border-bottom: 2px solid; + font-weight: 600; + } + + .navbar-brand { + width: 200px; + } + + .navbar-toggler { + position: absolute; + right: 0; + top: 0; + width: 72px; + height: var(--navbar-height); + } +} + +#frontpage-image { + margin-right: -5rem; + margin-left: -12.5rem; +} + +@media (max-width: 1200px) { + #frontpage-image { + margin-right: -20rem; + margin-left: -8.5rem; + } +} + +#header-cart-button { + position: absolute; + z-index: 10000; + top: 0; + right: 0; + padding: 10px 20px; + margin-right: 25px; + max-height: var(--navbar-height); +} + +.contact-section { + ul { + list-style: none; + } +} + +.favorites { + display: flex; + width: 100%; + overflow-x: auto; + gap: 15px; + flex-direction: row; + + .favorite-card { + width: 450px; + + img { + width: 100%; + min-width: 275px; + height: calc(100% - 50px); + object-fit: contain; + } + + h4 { + padding: 10px 12px; + } + } +} + +@media (max-width: 992px) { + #header-cart-button { + margin-right: 58px; + padding: 0; + } + .navbar { + + .nav-link { + padding-left: 3rem; + } + } + + #carousel-navigator { + display: none !important; + } +} + +#product-carousel { + min-height: 400px; + + .carousel-item img { + max-height: 400px; + object-fit: contain; + } +} + +.thumb-button { + img { + max-width: 200px; + width: 200px; + max-height: 128px; + height: 128px; + object-fit: cover; + } + + &:hover > img { + background: $vsh-orange; + } +} + +.add-to-cart-button { + box-shadow: .125rem .125rem #e00751; + padding: .3125rem; + font-size: 1.25rem; + background: $vsh-orange; + color: #fafafa !important; + display: flex; + align-items: center; + + .counter-wrapper .number-input { + margin-right: 15px; + } + + .bag-button { + color: white; + font-weight: 600; + font-style: italic; + } +} + + +.product-card { + border: none; + + .card-img-top { + height: 220px; + min-height: 220px; + max-height: 220px; + object-fit: contain; + } + + .card-body { + padding: .5rem; + } + + .placeholder { + object-fit: contain; + padding: 0 25px; + } +} + +.dynamic-content img { + max-width: 100% !important; + object-fit: contain; +} + +#payment-tab-content .tab-pane { + min-height: 75px; +} + +#cart-modal { + padding: 0 !important; + + .modal-dialog { + width: 450px; + } + + @media (max-width: 451px) { + .modal-dialog { + width: 100%; + max-width: 100%; + transition: none; + } + } +} diff --git a/src/wwwroot/styles/variables.scss b/src/wwwroot/styles/variables.scss new file mode 100644 index 0000000..6c51ebd --- /dev/null +++ b/src/wwwroot/styles/variables.scss @@ -0,0 +1,3 @@ +$border-radius: 0; +$vsh-orange: #ee741e; +$primary: $vsh-orange; diff --git a/src/wwwroot/styles/vendor/bootstrap-icons.all.scss b/src/wwwroot/styles/vendor/bootstrap-icons.all.scss new file mode 100644 index 0000000..c7edcde --- /dev/null +++ b/src/wwwroot/styles/vendor/bootstrap-icons.all.scss @@ -0,0 +1,1202 @@ +//v1.2.0 +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-4k-fill::before { content: "\f15a"; } +.bi-badge-4k::before { content: "\f15b"; } +.bi-badge-8k-fill::before { content: "\f15c"; } +.bi-badge-8k::before { content: "\f15d"; } +.bi-badge-ad-fill::before { content: "\f15e"; } +.bi-badge-ad::before { content: "\f15f"; } +.bi-badge-cc-fill::before { content: "\f160"; } +.bi-badge-cc::before { content: "\f161"; } +.bi-badge-hd-fill::before { content: "\f162"; } +.bi-badge-hd::before { content: "\f163"; } +.bi-badge-tm-fill::before { content: "\f164"; } +.bi-badge-tm::before { content: "\f165"; } +.bi-badge-vo-fill::before { content: "\f166"; } +.bi-badge-vo::before { content: "\f167"; } +.bi-bag-check-fill::before { content: "\f168"; } +.bi-bag-check::before { content: "\f169"; } +.bi-bag-dash-fill::before { content: "\f16a"; } +.bi-bag-dash::before { content: "\f16b"; } +.bi-bag-fill::before { content: "\f16c"; } +.bi-bag-plus-fill::before { content: "\f16d"; } +.bi-bag-plus::before { content: "\f16e"; } +.bi-bag-x-fill::before { content: "\f16f"; } +.bi-bag-x::before { content: "\f170"; } +.bi-bag::before { content: "\f171"; } +.bi-bar-chart-fill::before { content: "\f172"; } +.bi-bar-chart-line-fill::before { content: "\f173"; } +.bi-bar-chart-line::before { content: "\f174"; } +.bi-bar-chart-steps::before { content: "\f175"; } +.bi-bar-chart::before { content: "\f176"; } +.bi-basket-fill::before { content: "\f177"; } +.bi-basket::before { content: "\f178"; } +.bi-basket2-fill::before { content: "\f179"; } +.bi-basket2::before { content: "\f17a"; } +.bi-basket3-fill::before { content: "\f17b"; } +.bi-basket3::before { content: "\f17c"; } +.bi-battery-charging::before { content: "\f17d"; } +.bi-battery-full::before { content: "\f17e"; } +.bi-battery-half::before { content: "\f17f"; } +.bi-battery::before { content: "\f180"; } +.bi-bell-fill::before { content: "\f181"; } +.bi-bell::before { content: "\f182"; } +.bi-bezier::before { content: "\f183"; } +.bi-bezier2::before { content: "\f184"; } +.bi-bicycle::before { content: "\f185"; } +.bi-binoculars-fill::before { content: "\f186"; } +.bi-binoculars::before { content: "\f187"; } +.bi-blockquote-left::before { content: "\f188"; } +.bi-blockquote-right::before { content: "\f189"; } +.bi-book-fill::before { content: "\f18a"; } +.bi-book-half::before { content: "\f18b"; } +.bi-book::before { content: "\f18c"; } +.bi-bookmark-check-fill::before { content: "\f18d"; } +.bi-bookmark-check::before { content: "\f18e"; } +.bi-bookmark-dash-fill::before { content: "\f18f"; } +.bi-bookmark-dash::before { content: "\f190"; } +.bi-bookmark-fill::before { content: "\f191"; } +.bi-bookmark-heart-fill::before { content: "\f192"; } +.bi-bookmark-heart::before { content: "\f193"; } +.bi-bookmark-plus-fill::before { content: "\f194"; } +.bi-bookmark-plus::before { content: "\f195"; } +.bi-bookmark-star-fill::before { content: "\f196"; } +.bi-bookmark-star::before { content: "\f197"; } +.bi-bookmark-x-fill::before { content: "\f198"; } +.bi-bookmark-x::before { content: "\f199"; } +.bi-bookmark::before { content: "\f19a"; } +.bi-bookmarks-fill::before { content: "\f19b"; } +.bi-bookmarks::before { content: "\f19c"; } +.bi-bookshelf::before { content: "\f19d"; } +.bi-bootstrap-fill::before { content: "\f19e"; } +.bi-bootstrap-reboot::before { content: "\f19f"; } +.bi-bootstrap::before { content: "\f1a0"; } +.bi-border-style::before { content: "\f1a1"; } +.bi-border-width::before { content: "\f1a2"; } +.bi-bounding-box-circles::before { content: "\f1a3"; } +.bi-bounding-box::before { content: "\f1a4"; } +.bi-box-arrow-down-left::before { content: "\f1a5"; } +.bi-box-arrow-down-right::before { content: "\f1a6"; } +.bi-box-arrow-down::before { content: "\f1a7"; } +.bi-box-arrow-in-down-left::before { content: "\f1a8"; } +.bi-box-arrow-in-down-right::before { content: "\f1a9"; } +.bi-box-arrow-in-down::before { content: "\f1aa"; } +.bi-box-arrow-in-left::before { content: "\f1ab"; } +.bi-box-arrow-in-right::before { content: "\f1ac"; } +.bi-box-arrow-in-up-left::before { content: "\f1ad"; } +.bi-box-arrow-in-up-right::before { content: "\f1ae"; } +.bi-box-arrow-in-up::before { content: "\f1af"; } +.bi-box-arrow-left::before { content: "\f1b0"; } +.bi-box-arrow-right::before { content: "\f1b1"; } +.bi-box-arrow-up-left::before { content: "\f1b2"; } +.bi-box-arrow-up-right::before { content: "\f1b3"; } +.bi-box-arrow-up::before { content: "\f1b4"; } +.bi-box-seam::before { content: "\f1b5"; } +.bi-box::before { content: "\f1b6"; } +.bi-braces::before { content: "\f1b7"; } +.bi-bricks::before { content: "\f1b8"; } +.bi-briefcase-fill::before { content: "\f1b9"; } +.bi-briefcase::before { content: "\f1ba"; } +.bi-brightness-alt-high-fill::before { content: "\f1bb"; } +.bi-brightness-alt-high::before { content: "\f1bc"; } +.bi-brightness-alt-low-fill::before { content: "\f1bd"; } +.bi-brightness-alt-low::before { content: "\f1be"; } +.bi-brightness-high-fill::before { content: "\f1bf"; } +.bi-brightness-high::before { content: "\f1c0"; } +.bi-brightness-low-fill::before { content: "\f1c1"; } +.bi-brightness-low::before { content: "\f1c2"; } +.bi-broadcast-pin::before { content: "\f1c3"; } +.bi-broadcast::before { content: "\f1c4"; } +.bi-brush-fill::before { content: "\f1c5"; } +.bi-brush::before { content: "\f1c6"; } +.bi-bucket-fill::before { content: "\f1c7"; } +.bi-bucket::before { content: "\f1c8"; } +.bi-bug-fill::before { content: "\f1c9"; } +.bi-bug::before { content: "\f1ca"; } +.bi-building::before { content: "\f1cb"; } +.bi-bullseye::before { content: "\f1cc"; } +.bi-calculator-fill::before { content: "\f1cd"; } +.bi-calculator::before { content: "\f1ce"; } +.bi-calendar-check-fill::before { content: "\f1cf"; } +.bi-calendar-check::before { content: "\f1d0"; } +.bi-calendar-date-fill::before { content: "\f1d1"; } +.bi-calendar-date::before { content: "\f1d2"; } +.bi-calendar-day-fill::before { content: "\f1d3"; } +.bi-calendar-day::before { content: "\f1d4"; } +.bi-calendar-event-fill::before { content: "\f1d5"; } +.bi-calendar-event::before { content: "\f1d6"; } +.bi-calendar-fill::before { content: "\f1d7"; } +.bi-calendar-minus-fill::before { content: "\f1d8"; } +.bi-calendar-minus::before { content: "\f1d9"; } +.bi-calendar-month-fill::before { content: "\f1da"; } +.bi-calendar-month::before { content: "\f1db"; } +.bi-calendar-plus-fill::before { content: "\f1dc"; } +.bi-calendar-plus::before { content: "\f1dd"; } +.bi-calendar-range-fill::before { content: "\f1de"; } +.bi-calendar-range::before { content: "\f1df"; } +.bi-calendar-week-fill::before { content: "\f1e0"; } +.bi-calendar-week::before { content: "\f1e1"; } +.bi-calendar-x-fill::before { content: "\f1e2"; } +.bi-calendar-x::before { content: "\f1e3"; } +.bi-calendar::before { content: "\f1e4"; } +.bi-calendar2-check-fill::before { content: "\f1e5"; } +.bi-calendar2-check::before { content: "\f1e6"; } +.bi-calendar2-date-fill::before { content: "\f1e7"; } +.bi-calendar2-date::before { content: "\f1e8"; } +.bi-calendar2-day-fill::before { content: "\f1e9"; } +.bi-calendar2-day::before { content: "\f1ea"; } +.bi-calendar2-event-fill::before { content: "\f1eb"; } +.bi-calendar2-event::before { content: "\f1ec"; } +.bi-calendar2-fill::before { content: "\f1ed"; } +.bi-calendar2-minus-fill::before { content: "\f1ee"; } +.bi-calendar2-minus::before { content: "\f1ef"; } +.bi-calendar2-month-fill::before { content: "\f1f0"; } +.bi-calendar2-month::before { content: "\f1f1"; } +.bi-calendar2-plus-fill::before { content: "\f1f2"; } +.bi-calendar2-plus::before { content: "\f1f3"; } +.bi-calendar2-range-fill::before { content: "\f1f4"; } +.bi-calendar2-range::before { content: "\f1f5"; } +.bi-calendar2-week-fill::before { content: "\f1f6"; } +.bi-calendar2-week::before { content: "\f1f7"; } +.bi-calendar2-x-fill::before { content: "\f1f8"; } +.bi-calendar2-x::before { content: "\f1f9"; } +.bi-calendar2::before { content: "\f1fa"; } +.bi-calendar3-event-fill::before { content: "\f1fb"; } +.bi-calendar3-event::before { content: "\f1fc"; } +.bi-calendar3-fill::before { content: "\f1fd"; } +.bi-calendar3-range-fill::before { content: "\f1fe"; } +.bi-calendar3-range::before { content: "\f1ff"; } +.bi-calendar3-week-fill::before { content: "\f200"; } +.bi-calendar3-week::before { content: "\f201"; } +.bi-calendar3::before { content: "\f202"; } +.bi-calendar4-event::before { content: "\f203"; } +.bi-calendar4-range::before { content: "\f204"; } +.bi-calendar4-week::before { content: "\f205"; } +.bi-calendar4::before { content: "\f206"; } +.bi-camera-fill::before { content: "\f207"; } +.bi-camera-reels-fill::before { content: "\f208"; } +.bi-camera-reels::before { content: "\f209"; } +.bi-camera-video-fill::before { content: "\f20a"; } +.bi-camera-video-off-fill::before { content: "\f20b"; } +.bi-camera-video-off::before { content: "\f20c"; } +.bi-camera-video::before { content: "\f20d"; } +.bi-camera::before { content: "\f20e"; } +.bi-camera2::before { content: "\f20f"; } +.bi-capslock-fill::before { content: "\f210"; } +.bi-capslock::before { content: "\f211"; } +.bi-card-checklist::before { content: "\f212"; } +.bi-card-heading::before { content: "\f213"; } +.bi-card-image::before { content: "\f214"; } +.bi-card-list::before { content: "\f215"; } +.bi-card-text::before { content: "\f216"; } +.bi-caret-down-fill::before { content: "\f217"; } +.bi-caret-down-square-fill::before { content: "\f218"; } +.bi-caret-down-square::before { content: "\f219"; } +.bi-caret-down::before { content: "\f21a"; } +.bi-caret-left-fill::before { content: "\f21b"; } +.bi-caret-left-square-fill::before { content: "\f21c"; } +.bi-caret-left-square::before { content: "\f21d"; } +.bi-caret-left::before { content: "\f21e"; } +.bi-caret-right-fill::before { content: "\f21f"; } +.bi-caret-right-square-fill::before { content: "\f220"; } +.bi-caret-right-square::before { content: "\f221"; } +.bi-caret-right::before { content: "\f222"; } +.bi-caret-up-fill::before { content: "\f223"; } +.bi-caret-up-square-fill::before { content: "\f224"; } +.bi-caret-up-square::before { content: "\f225"; } +.bi-caret-up::before { content: "\f226"; } +.bi-cart-check-fill::before { content: "\f227"; } +.bi-cart-check::before { content: "\f228"; } +.bi-cart-dash-fill::before { content: "\f229"; } +.bi-cart-dash::before { content: "\f22a"; } +.bi-cart-fill::before { content: "\f22b"; } +.bi-cart-plus-fill::before { content: "\f22c"; } +.bi-cart-plus::before { content: "\f22d"; } +.bi-cart-x-fill::before { content: "\f22e"; } +.bi-cart-x::before { content: "\f22f"; } +.bi-cart::before { content: "\f230"; } +.bi-cart2::before { content: "\f231"; } +.bi-cart3::before { content: "\f232"; } +.bi-cart4::before { content: "\f233"; } +.bi-cash-stack::before { content: "\f234"; } +.bi-cash::before { content: "\f235"; } +.bi-cast::before { content: "\f236"; } +.bi-chat-dots-fill::before { content: "\f237"; } +.bi-chat-dots::before { content: "\f238"; } +.bi-chat-fill::before { content: "\f239"; } +.bi-chat-left-dots-fill::before { content: "\f23a"; } +.bi-chat-left-dots::before { content: "\f23b"; } +.bi-chat-left-fill::before { content: "\f23c"; } +.bi-chat-left-quote-fill::before { content: "\f23d"; } +.bi-chat-left-quote::before { content: "\f23e"; } +.bi-chat-left-text-fill::before { content: "\f23f"; } +.bi-chat-left-text::before { content: "\f240"; } +.bi-chat-left::before { content: "\f241"; } +.bi-chat-quote-fill::before { content: "\f242"; } +.bi-chat-quote::before { content: "\f243"; } +.bi-chat-right-dots-fill::before { content: "\f244"; } +.bi-chat-right-dots::before { content: "\f245"; } +.bi-chat-right-fill::before { content: "\f246"; } +.bi-chat-right-quote-fill::before { content: "\f247"; } +.bi-chat-right-quote::before { content: "\f248"; } +.bi-chat-right-text-fill::before { content: "\f249"; } +.bi-chat-right-text::before { content: "\f24a"; } +.bi-chat-right::before { content: "\f24b"; } +.bi-chat-square-dots-fill::before { content: "\f24c"; } +.bi-chat-square-dots::before { content: "\f24d"; } +.bi-chat-square-fill::before { content: "\f24e"; } +.bi-chat-square-quote-fill::before { content: "\f24f"; } +.bi-chat-square-quote::before { content: "\f250"; } +.bi-chat-square-text-fill::before { content: "\f251"; } +.bi-chat-square-text::before { content: "\f252"; } +.bi-chat-square::before { content: "\f253"; } +.bi-chat-text-fill::before { content: "\f254"; } +.bi-chat-text::before { content: "\f255"; } +.bi-chat::before { content: "\f256"; } +.bi-check-all::before { content: "\f257"; } +.bi-check-circle-fill::before { content: "\f258"; } +.bi-check-circle::before { content: "\f259"; } +.bi-check-square-fill::before { content: "\f25a"; } +.bi-check-square::before { content: "\f25b"; } +.bi-check::before { content: "\f25c"; } +.bi-check2-all::before { content: "\f25d"; } +.bi-check2-circle::before { content: "\f25e"; } +.bi-check2-square::before { content: "\f25f"; } +.bi-check2::before { content: "\f260"; } +.bi-chevron-bar-contract::before { content: "\f261"; } +.bi-chevron-bar-down::before { content: "\f262"; } +.bi-chevron-bar-expand::before { content: "\f263"; } +.bi-chevron-bar-left::before { content: "\f264"; } +.bi-chevron-bar-right::before { content: "\f265"; } +.bi-chevron-bar-up::before { content: "\f266"; } +.bi-chevron-compact-down::before { content: "\f267"; } +.bi-chevron-compact-left::before { content: "\f268"; } +.bi-chevron-compact-right::before { content: "\f269"; } +.bi-chevron-compact-up::before { content: "\f26a"; } +.bi-chevron-contract::before { content: "\f26b"; } +.bi-chevron-double-down::before { content: "\f26c"; } +.bi-chevron-double-left::before { content: "\f26d"; } +.bi-chevron-double-right::before { content: "\f26e"; } +.bi-chevron-double-up::before { content: "\f26f"; } +.bi-chevron-down::before { content: "\f270"; } +.bi-chevron-expand::before { content: "\f271"; } +.bi-chevron-left::before { content: "\f272"; } +.bi-chevron-right::before { content: "\f273"; } +.bi-chevron-up::before { content: "\f274"; } +.bi-circle-fill::before { content: "\f275"; } +.bi-circle-half::before { content: "\f276"; } +.bi-circle-square::before { content: "\f277"; } +.bi-circle::before { content: "\f278"; } +.bi-clipboard-check::before { content: "\f279"; } +.bi-clipboard-data::before { content: "\f27a"; } +.bi-clipboard-minus::before { content: "\f27b"; } +.bi-clipboard-plus::before { content: "\f27c"; } +.bi-clipboard-x::before { content: "\f27d"; } +.bi-clipboard::before { content: "\f27e"; } +.bi-clock-fill::before { content: "\f27f"; } +.bi-clock-history::before { content: "\f280"; } +.bi-clock::before { content: "\f281"; } +.bi-cloud-arrow-down-fill::before { content: "\f282"; } +.bi-cloud-arrow-down::before { content: "\f283"; } +.bi-cloud-arrow-up-fill::before { content: "\f284"; } +.bi-cloud-arrow-up::before { content: "\f285"; } +.bi-cloud-check-fill::before { content: "\f286"; } +.bi-cloud-check::before { content: "\f287"; } +.bi-cloud-download-fill::before { content: "\f288"; } +.bi-cloud-download::before { content: "\f289"; } +.bi-cloud-fill::before { content: "\f28a"; } +.bi-cloud-minus-fill::before { content: "\f28b"; } +.bi-cloud-minus::before { content: "\f28c"; } +.bi-cloud-plus-fill::before { content: "\f28d"; } +.bi-cloud-plus::before { content: "\f28e"; } +.bi-cloud-slash-fill::before { content: "\f28f"; } +.bi-cloud-slash::before { content: "\f290"; } +.bi-cloud-upload-fill::before { content: "\f291"; } +.bi-cloud-upload::before { content: "\f292"; } +.bi-cloud::before { content: "\f293"; } +.bi-code-slash::before { content: "\f294"; } +.bi-code-square::before { content: "\f295"; } +.bi-code::before { content: "\f296"; } +.bi-collection-fill::before { content: "\f297"; } +.bi-collection-play-fill::before { content: "\f298"; } +.bi-collection-play::before { content: "\f299"; } +.bi-collection::before { content: "\f29a"; } +.bi-columns-gap::before { content: "\f29b"; } +.bi-columns::before { content: "\f29c"; } +.bi-command::before { content: "\f29d"; } +.bi-compass-fill::before { content: "\f29e"; } +.bi-compass::before { content: "\f29f"; } +.bi-cone-striped::before { content: "\f2a0"; } +.bi-cone::before { content: "\f2a1"; } +.bi-controller::before { content: "\f2a2"; } +.bi-cpu-fill::before { content: "\f2a3"; } +.bi-cpu::before { content: "\f2a4"; } +.bi-credit-card-2-back-fill::before { content: "\f2a5"; } +.bi-credit-card-2-back::before { content: "\f2a6"; } +.bi-credit-card-2-front-fill::before { content: "\f2a7"; } +.bi-credit-card-2-front::before { content: "\f2a8"; } +.bi-credit-card-fill::before { content: "\f2a9"; } +.bi-credit-card::before { content: "\f2aa"; } +.bi-crop::before { content: "\f2ab"; } +.bi-cup-fill::before { content: "\f2ac"; } +.bi-cup-straw::before { content: "\f2ad"; } +.bi-cup::before { content: "\f2ae"; } +.bi-cursor-fill::before { content: "\f2af"; } +.bi-cursor-text::before { content: "\f2b0"; } +.bi-cursor::before { content: "\f2b1"; } +.bi-dash-circle-fill::before { content: "\f2b2"; } +.bi-dash-circle::before { content: "\f2b3"; } +.bi-dash-square-fill::before { content: "\f2b4"; } +.bi-dash-square::before { content: "\f2b5"; } +.bi-dash::before { content: "\f2b6"; } +.bi-diagram-2-fill::before { content: "\f2b7"; } +.bi-diagram-2::before { content: "\f2b8"; } +.bi-diagram-3-fill::before { content: "\f2b9"; } +.bi-diagram-3::before { content: "\f2ba"; } +.bi-diamond-fill::before { content: "\f2bb"; } +.bi-diamond-half::before { content: "\f2bc"; } +.bi-diamond::before { content: "\f2bd"; } +.bi-dice-1-fill::before { content: "\f2be"; } +.bi-dice-1::before { content: "\f2bf"; } +.bi-dice-2-fill::before { content: "\f2c0"; } +.bi-dice-2::before { content: "\f2c1"; } +.bi-dice-3-fill::before { content: "\f2c2"; } +.bi-dice-3::before { content: "\f2c3"; } +.bi-dice-4-fill::before { content: "\f2c4"; } +.bi-dice-4::before { content: "\f2c5"; } +.bi-dice-5-fill::before { content: "\f2c6"; } +.bi-dice-5::before { content: "\f2c7"; } +.bi-dice-6-fill::before { content: "\f2c8"; } +.bi-dice-6::before { content: "\f2c9"; } +.bi-disc-fill::before { content: "\f2ca"; } +.bi-disc::before { content: "\f2cb"; } +.bi-discord::before { content: "\f2cc"; } +.bi-display-fill::before { content: "\f2cd"; } +.bi-display::before { content: "\f2ce"; } +.bi-distribute-horizontal::before { content: "\f2cf"; } +.bi-distribute-vertical::before { content: "\f2d0"; } +.bi-door-closed-fill::before { content: "\f2d1"; } +.bi-door-closed::before { content: "\f2d2"; } +.bi-door-open-fill::before { content: "\f2d3"; } +.bi-door-open::before { content: "\f2d4"; } +.bi-dot::before { content: "\f2d5"; } +.bi-download::before { content: "\f2d6"; } +.bi-droplet-fill::before { content: "\f2d7"; } +.bi-droplet-half::before { content: "\f2d8"; } +.bi-droplet::before { content: "\f2d9"; } +.bi-earbuds::before { content: "\f2da"; } +.bi-easel-fill::before { content: "\f2db"; } +.bi-easel::before { content: "\f2dc"; } +.bi-egg-fill::before { content: "\f2dd"; } +.bi-egg-fried::before { content: "\f2de"; } +.bi-egg::before { content: "\f2df"; } +.bi-eject-fill::before { content: "\f2e0"; } +.bi-eject::before { content: "\f2e1"; } +.bi-emoji-angry-fill::before { content: "\f2e2"; } +.bi-emoji-angry::before { content: "\f2e3"; } +.bi-emoji-dizzy-fill::before { content: "\f2e4"; } +.bi-emoji-dizzy::before { content: "\f2e5"; } +.bi-emoji-expressionless-fill::before { content: "\f2e6"; } +.bi-emoji-expressionless::before { content: "\f2e7"; } +.bi-emoji-frown-fill::before { content: "\f2e8"; } +.bi-emoji-frown::before { content: "\f2e9"; } +.bi-emoji-heart-eyes-fill::before { content: "\f2ea"; } +.bi-emoji-heart-eyes::before { content: "\f2eb"; } +.bi-emoji-laughing-fill::before { content: "\f2ec"; } +.bi-emoji-laughing::before { content: "\f2ed"; } +.bi-emoji-neutral-fill::before { content: "\f2ee"; } +.bi-emoji-neutral::before { content: "\f2ef"; } +.bi-emoji-smile-fill::before { content: "\f2f0"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f2f1"; } +.bi-emoji-smile-upside-down::before { content: "\f2f2"; } +.bi-emoji-smile::before { content: "\f2f3"; } +.bi-emoji-sunglasses-fill::before { content: "\f2f4"; } +.bi-emoji-sunglasses::before { content: "\f2f5"; } +.bi-emoji-wink-fill::before { content: "\f2f6"; } +.bi-emoji-wink::before { content: "\f2f7"; } +.bi-envelope-fill::before { content: "\f2f8"; } +.bi-envelope-open-fill::before { content: "\f2f9"; } +.bi-envelope-open::before { content: "\f2fa"; } +.bi-envelope::before { content: "\f2fb"; } +.bi-exclamation-circle-fill::before { content: "\f2fc"; } +.bi-exclamation-circle::before { content: "\f2fd"; } +.bi-exclamation-diamond-fill::before { content: "\f2fe"; } +.bi-exclamation-diamond::before { content: "\f2ff"; } +.bi-exclamation-octagon-fill::before { content: "\f300"; } +.bi-exclamation-octagon::before { content: "\f301"; } +.bi-exclamation-square-fill::before { content: "\f302"; } +.bi-exclamation-square::before { content: "\f303"; } +.bi-exclamation-triangle-fill::before { content: "\f304"; } +.bi-exclamation-triangle::before { content: "\f305"; } +.bi-exclamation::before { content: "\f306"; } +.bi-exclude::before { content: "\f307"; } +.bi-eye-fill::before { content: "\f308"; } +.bi-eye-slash-fill::before { content: "\f309"; } +.bi-eye-slash::before { content: "\f30a"; } +.bi-eye::before { content: "\f30b"; } +.bi-eyeglasses::before { content: "\f30c"; } +.bi-facebook::before { content: "\f30d"; } +.bi-file-arrow-down-fill::before { content: "\f30e"; } +.bi-file-arrow-down::before { content: "\f30f"; } +.bi-file-arrow-up-fill::before { content: "\f310"; } +.bi-file-arrow-up::before { content: "\f311"; } +.bi-file-bar-graph-fill::before { content: "\f312"; } +.bi-file-bar-graph::before { content: "\f313"; } +.bi-file-binary-fill::before { content: "\f314"; } +.bi-file-binary::before { content: "\f315"; } +.bi-file-break-fill::before { content: "\f316"; } +.bi-file-break::before { content: "\f317"; } +.bi-file-check-fill::before { content: "\f318"; } +.bi-file-check::before { content: "\f319"; } +.bi-file-code-fill::before { content: "\f31a"; } +.bi-file-code::before { content: "\f31b"; } +.bi-file-diff-fill::before { content: "\f31c"; } +.bi-file-diff::before { content: "\f31d"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f31e"; } +.bi-file-earmark-arrow-down::before { content: "\f31f"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f320"; } +.bi-file-earmark-arrow-up::before { content: "\f321"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f322"; } +.bi-file-earmark-bar-graph::before { content: "\f323"; } +.bi-file-earmark-binary-fill::before { content: "\f324"; } +.bi-file-earmark-binary::before { content: "\f325"; } +.bi-file-earmark-break-fill::before { content: "\f326"; } +.bi-file-earmark-break::before { content: "\f327"; } +.bi-file-earmark-check-fill::before { content: "\f328"; } +.bi-file-earmark-check::before { content: "\f329"; } +.bi-file-earmark-code-fill::before { content: "\f32a"; } +.bi-file-earmark-code::before { content: "\f32b"; } +.bi-file-earmark-diff-fill::before { content: "\f32c"; } +.bi-file-earmark-diff::before { content: "\f32d"; } +.bi-file-earmark-easel-fill::before { content: "\f32e"; } +.bi-file-earmark-easel::before { content: "\f32f"; } +.bi-file-earmark-excel-fill::before { content: "\f330"; } +.bi-file-earmark-excel::before { content: "\f331"; } +.bi-file-earmark-fill::before { content: "\f332"; } +.bi-file-earmark-font-fill::before { content: "\f333"; } +.bi-file-earmark-font::before { content: "\f334"; } +.bi-file-earmark-image-fill::before { content: "\f335"; } +.bi-file-earmark-image::before { content: "\f336"; } +.bi-file-earmark-lock-fill::before { content: "\f337"; } +.bi-file-earmark-lock::before { content: "\f338"; } +.bi-file-earmark-lock2-fill::before { content: "\f339"; } +.bi-file-earmark-lock2::before { content: "\f33a"; } +.bi-file-earmark-medical-fill::before { content: "\f33b"; } +.bi-file-earmark-medical::before { content: "\f33c"; } +.bi-file-earmark-minus-fill::before { content: "\f33d"; } +.bi-file-earmark-minus::before { content: "\f33e"; } +.bi-file-earmark-music-fill::before { content: "\f33f"; } +.bi-file-earmark-music::before { content: "\f340"; } +.bi-file-earmark-person-fill::before { content: "\f341"; } +.bi-file-earmark-person::before { content: "\f342"; } +.bi-file-earmark-play-fill::before { content: "\f343"; } +.bi-file-earmark-play::before { content: "\f344"; } +.bi-file-earmark-plus-fill::before { content: "\f345"; } +.bi-file-earmark-plus::before { content: "\f346"; } +.bi-file-earmark-post-fill::before { content: "\f347"; } +.bi-file-earmark-post::before { content: "\f348"; } +.bi-file-earmark-ppt-fill::before { content: "\f349"; } +.bi-file-earmark-ppt::before { content: "\f34a"; } +.bi-file-earmark-richtext-fill::before { content: "\f34b"; } +.bi-file-earmark-richtext::before { content: "\f34c"; } +.bi-file-earmark-ruled-fill::before { content: "\f34d"; } +.bi-file-earmark-ruled::before { content: "\f34e"; } +.bi-file-earmark-slides-fill::before { content: "\f34f"; } +.bi-file-earmark-slides::before { content: "\f350"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f351"; } +.bi-file-earmark-spreadsheet::before { content: "\f352"; } +.bi-file-earmark-text-fill::before { content: "\f353"; } +.bi-file-earmark-text::before { content: "\f354"; } +.bi-file-earmark-word-fill::before { content: "\f355"; } +.bi-file-earmark-word::before { content: "\f356"; } +.bi-file-earmark-x-fill::before { content: "\f357"; } +.bi-file-earmark-x::before { content: "\f358"; } +.bi-file-earmark-zip-fill::before { content: "\f359"; } +.bi-file-earmark-zip::before { content: "\f35a"; } +.bi-file-earmark::before { content: "\f35b"; } +.bi-file-easel-fill::before { content: "\f35c"; } +.bi-file-easel::before { content: "\f35d"; } +.bi-file-excel-fill::before { content: "\f35e"; } +.bi-file-excel::before { content: "\f35f"; } +.bi-file-fill::before { content: "\f360"; } +.bi-file-font-fill::before { content: "\f361"; } +.bi-file-font::before { content: "\f362"; } +.bi-file-image-fill::before { content: "\f363"; } +.bi-file-image::before { content: "\f364"; } +.bi-file-lock-fill::before { content: "\f365"; } +.bi-file-lock::before { content: "\f366"; } +.bi-file-lock2-fill::before { content: "\f367"; } +.bi-file-lock2::before { content: "\f368"; } +.bi-file-medical-fill::before { content: "\f369"; } +.bi-file-medical::before { content: "\f36a"; } +.bi-file-minus-fill::before { content: "\f36b"; } +.bi-file-minus::before { content: "\f36c"; } +.bi-file-music-fill::before { content: "\f36d"; } +.bi-file-music::before { content: "\f36e"; } +.bi-file-person-fill::before { content: "\f36f"; } +.bi-file-person::before { content: "\f370"; } +.bi-file-play-fill::before { content: "\f371"; } +.bi-file-play::before { content: "\f372"; } +.bi-file-plus-fill::before { content: "\f373"; } +.bi-file-plus::before { content: "\f374"; } +.bi-file-post-fill::before { content: "\f375"; } +.bi-file-post::before { content: "\f376"; } +.bi-file-ppt-fill::before { content: "\f377"; } +.bi-file-ppt::before { content: "\f378"; } +.bi-file-richtext-fill::before { content: "\f379"; } +.bi-file-richtext::before { content: "\f37a"; } +.bi-file-ruled-fill::before { content: "\f37b"; } +.bi-file-ruled::before { content: "\f37c"; } +.bi-file-slides-fill::before { content: "\f37d"; } +.bi-file-slides::before { content: "\f37e"; } +.bi-file-spreadsheet-fill::before { content: "\f37f"; } +.bi-file-spreadsheet::before { content: "\f380"; } +.bi-file-text-fill::before { content: "\f381"; } +.bi-file-text::before { content: "\f382"; } +.bi-file-word-fill::before { content: "\f383"; } +.bi-file-word::before { content: "\f384"; } +.bi-file-x-fill::before { content: "\f385"; } +.bi-file-x::before { content: "\f386"; } +.bi-file-zip-fill::before { content: "\f387"; } +.bi-file-zip::before { content: "\f388"; } +.bi-file::before { content: "\f389"; } +.bi-files-alt::before { content: "\f38a"; } +.bi-files::before { content: "\f38b"; } +.bi-film::before { content: "\f38c"; } +.bi-filter-circle-fill::before { content: "\f38d"; } +.bi-filter-circle::before { content: "\f38e"; } +.bi-filter-left::before { content: "\f38f"; } +.bi-filter-right::before { content: "\f390"; } +.bi-filter-square-fill::before { content: "\f391"; } +.bi-filter-square::before { content: "\f392"; } +.bi-filter::before { content: "\f393"; } +.bi-flag-fill::before { content: "\f394"; } +.bi-flag::before { content: "\f395"; } +.bi-flower1::before { content: "\f396"; } +.bi-flower2::before { content: "\f397"; } +.bi-flower3::before { content: "\f398"; } +.bi-folder-check::before { content: "\f399"; } +.bi-folder-fill::before { content: "\f39a"; } +.bi-folder-minus::before { content: "\f39b"; } +.bi-folder-plus::before { content: "\f39c"; } +.bi-folder-symlink-fill::before { content: "\f39d"; } +.bi-folder-symlink::before { content: "\f39e"; } +.bi-folder-x::before { content: "\f39f"; } +.bi-folder::before { content: "\f3a0"; } +.bi-folder2-open::before { content: "\f3a1"; } +.bi-folder2::before { content: "\f3a2"; } +.bi-fonts::before { content: "\f3a3"; } +.bi-forward-fill::before { content: "\f3a4"; } +.bi-forward::before { content: "\f3a5"; } +.bi-front::before { content: "\f3a6"; } +.bi-fullscreen-exit::before { content: "\f3a7"; } +.bi-fullscreen::before { content: "\f3a8"; } +.bi-funnel-fill::before { content: "\f3a9"; } +.bi-funnel::before { content: "\f3aa"; } +.bi-gear-fill::before { content: "\f3ab"; } +.bi-gear-wide-connected::before { content: "\f3ac"; } +.bi-gear-wide::before { content: "\f3ad"; } +.bi-gear::before { content: "\f3ae"; } +.bi-gem::before { content: "\f3af"; } +.bi-geo-alt-fill::before { content: "\f3b0"; } +.bi-geo-alt::before { content: "\f3b1"; } +.bi-geo-fill::before { content: "\f3b2"; } +.bi-geo::before { content: "\f3b3"; } +.bi-gift-fill::before { content: "\f3b4"; } +.bi-gift::before { content: "\f3b5"; } +.bi-github::before { content: "\f3b6"; } +.bi-globe::before { content: "\f3b7"; } +.bi-globe2::before { content: "\f3b8"; } +.bi-google::before { content: "\f3b9"; } +.bi-graph-down::before { content: "\f3ba"; } +.bi-graph-up::before { content: "\f3bb"; } +.bi-grid-1x2-fill::before { content: "\f3bc"; } +.bi-grid-1x2::before { content: "\f3bd"; } +.bi-grid-3x2-gap-fill::before { content: "\f3be"; } +.bi-grid-3x2-gap::before { content: "\f3bf"; } +.bi-grid-3x2::before { content: "\f3c0"; } +.bi-grid-3x3-gap-fill::before { content: "\f3c1"; } +.bi-grid-3x3-gap::before { content: "\f3c2"; } +.bi-grid-3x3::before { content: "\f3c3"; } +.bi-grid-fill::before { content: "\f3c4"; } +.bi-grid::before { content: "\f3c5"; } +.bi-grip-horizontal::before { content: "\f3c6"; } +.bi-grip-vertical::before { content: "\f3c7"; } +.bi-hammer::before { content: "\f3c8"; } +.bi-hand-index-thumb::before { content: "\f3c9"; } +.bi-hand-index::before { content: "\f3ca"; } +.bi-hand-thumbs-down::before { content: "\f3cb"; } +.bi-hand-thumbs-up::before { content: "\f3cc"; } +.bi-handbag-fill::before { content: "\f3cd"; } +.bi-handbag::before { content: "\f3ce"; } +.bi-hash::before { content: "\f3cf"; } +.bi-hdd-fill::before { content: "\f3d0"; } +.bi-hdd-network-fill::before { content: "\f3d1"; } +.bi-hdd-network::before { content: "\f3d2"; } +.bi-hdd-rack-fill::before { content: "\f3d3"; } +.bi-hdd-rack::before { content: "\f3d4"; } +.bi-hdd-stack-fill::before { content: "\f3d5"; } +.bi-hdd-stack::before { content: "\f3d6"; } +.bi-hdd::before { content: "\f3d7"; } +.bi-headphones::before { content: "\f3d8"; } +.bi-headset::before { content: "\f3d9"; } +.bi-heart-fill::before { content: "\f3da"; } +.bi-heart-half::before { content: "\f3db"; } +.bi-heart::before { content: "\f3dc"; } +.bi-heptagon-fill::before { content: "\f3dd"; } +.bi-heptagon-half::before { content: "\f3de"; } +.bi-heptagon::before { content: "\f3df"; } +.bi-hexagon-fill::before { content: "\f3e0"; } +.bi-hexagon-half::before { content: "\f3e1"; } +.bi-hexagon::before { content: "\f3e2"; } +.bi-hourglass-bottom::before { content: "\f3e3"; } +.bi-hourglass-split::before { content: "\f3e4"; } +.bi-hourglass-top::before { content: "\f3e5"; } +.bi-hourglass::before { content: "\f3e6"; } +.bi-house-door-fill::before { content: "\f3e7"; } +.bi-house-door::before { content: "\f3e8"; } +.bi-house-fill::before { content: "\f3e9"; } +.bi-house::before { content: "\f3ea"; } +.bi-hr::before { content: "\f3eb"; } +.bi-image-alt::before { content: "\f3ec"; } +.bi-image-fill::before { content: "\f3ed"; } +.bi-image::before { content: "\f3ee"; } +.bi-images::before { content: "\f3ef"; } +.bi-inbox-fill::before { content: "\f3f0"; } +.bi-inbox::before { content: "\f3f1"; } +.bi-inboxes-fill::before { content: "\f3f2"; } +.bi-inboxes::before { content: "\f3f3"; } +.bi-info-circle-fill::before { content: "\f3f4"; } +.bi-info-circle::before { content: "\f3f5"; } +.bi-info-square-fill::before { content: "\f3f6"; } +.bi-info-square::before { content: "\f3f7"; } +.bi-info::before { content: "\f3f8"; } +.bi-input-cursor-text::before { content: "\f3f9"; } +.bi-input-cursor::before { content: "\f3fa"; } +.bi-instagram::before { content: "\f3fb"; } +.bi-intersect::before { content: "\f3fc"; } +.bi-journal-album::before { content: "\f3fd"; } +.bi-journal-arrow-down::before { content: "\f3fe"; } +.bi-journal-arrow-up::before { content: "\f3ff"; } +.bi-journal-bookmark-fill::before { content: "\f400"; } +.bi-journal-bookmark::before { content: "\f401"; } +.bi-journal-check::before { content: "\f402"; } +.bi-journal-code::before { content: "\f403"; } +.bi-journal-medical::before { content: "\f404"; } +.bi-journal-minus::before { content: "\f405"; } +.bi-journal-plus::before { content: "\f406"; } +.bi-journal-richtext::before { content: "\f407"; } +.bi-journal-text::before { content: "\f408"; } +.bi-journal-x::before { content: "\f409"; } +.bi-journal::before { content: "\f40a"; } +.bi-journals::before { content: "\f40b"; } +.bi-joystick::before { content: "\f40c"; } +.bi-justify-left::before { content: "\f40d"; } +.bi-justify-right::before { content: "\f40e"; } +.bi-justify::before { content: "\f40f"; } +.bi-kanban-fill::before { content: "\f410"; } +.bi-kanban::before { content: "\f411"; } +.bi-key-fill::before { content: "\f412"; } +.bi-key::before { content: "\f413"; } +.bi-keyboard-fill::before { content: "\f414"; } +.bi-keyboard::before { content: "\f415"; } +.bi-ladder::before { content: "\f416"; } +.bi-lamp-fill::before { content: "\f417"; } +.bi-lamp::before { content: "\f418"; } +.bi-laptop-fill::before { content: "\f419"; } +.bi-laptop::before { content: "\f41a"; } +.bi-layers-fill::before { content: "\f41b"; } +.bi-layers-half::before { content: "\f41c"; } +.bi-layers::before { content: "\f41d"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f41e"; } +.bi-layout-sidebar-inset::before { content: "\f41f"; } +.bi-layout-sidebar-reverse::before { content: "\f420"; } +.bi-layout-sidebar::before { content: "\f421"; } +.bi-layout-split::before { content: "\f422"; } +.bi-layout-text-sidebar-reverse::before { content: "\f423"; } +.bi-layout-text-sidebar::before { content: "\f424"; } +.bi-layout-text-window-reverse::before { content: "\f425"; } +.bi-layout-text-window::before { content: "\f426"; } +.bi-layout-three-columns::before { content: "\f427"; } +.bi-layout-wtf::before { content: "\f428"; } +.bi-life-preserver::before { content: "\f429"; } +.bi-lightning-fill::before { content: "\f42a"; } +.bi-lightning::before { content: "\f42b"; } +.bi-link-45deg::before { content: "\f42c"; } +.bi-link::before { content: "\f42d"; } +.bi-linkedin::before { content: "\f42e"; } +.bi-list-check::before { content: "\f42f"; } +.bi-list-nested::before { content: "\f430"; } +.bi-list-ol::before { content: "\f431"; } +.bi-list-stars::before { content: "\f432"; } +.bi-list-task::before { content: "\f433"; } +.bi-list-ul::before { content: "\f434"; } +.bi-list::before { content: "\f435"; } +.bi-lock-fill::before { content: "\f436"; } +.bi-lock::before { content: "\f437"; } +.bi-mailbox::before { content: "\f438"; } +.bi-mailbox2::before { content: "\f439"; } +.bi-map-fill::before { content: "\f43a"; } +.bi-map::before { content: "\f43b"; } +.bi-markdown-fill::before { content: "\f43c"; } +.bi-markdown::before { content: "\f43d"; } +.bi-menu-app-fill::before { content: "\f43e"; } +.bi-menu-app::before { content: "\f43f"; } +.bi-menu-button-fill::before { content: "\f440"; } +.bi-menu-button-wide-fill::before { content: "\f441"; } +.bi-menu-button-wide::before { content: "\f442"; } +.bi-menu-button::before { content: "\f443"; } +.bi-menu-down::before { content: "\f444"; } +.bi-menu-up::before { content: "\f445"; } +.bi-mic-fill::before { content: "\f446"; } +.bi-mic-mute-fill::before { content: "\f447"; } +.bi-mic-mute::before { content: "\f448"; } +.bi-mic::before { content: "\f449"; } +.bi-minecart-loaded::before { content: "\f44a"; } +.bi-minecart::before { content: "\f44b"; } +.bi-moon::before { content: "\f44c"; } +.bi-mouse::before { content: "\f44d"; } +.bi-mouse2::before { content: "\f44e"; } +.bi-mouse3::before { content: "\f44f"; } +.bi-music-note-beamed::before { content: "\f450"; } +.bi-music-note-list::before { content: "\f451"; } +.bi-music-note::before { content: "\f452"; } +.bi-music-player-fill::before { content: "\f453"; } +.bi-music-player::before { content: "\f454"; } +.bi-newspaper::before { content: "\f455"; } +.bi-node-minus-fill::before { content: "\f456"; } +.bi-node-minus::before { content: "\f457"; } +.bi-node-plus-fill::before { content: "\f458"; } +.bi-node-plus::before { content: "\f459"; } +.bi-nut-fill::before { content: "\f45a"; } +.bi-nut::before { content: "\f45b"; } +.bi-octagon-fill::before { content: "\f45c"; } +.bi-octagon-half::before { content: "\f45d"; } +.bi-octagon::before { content: "\f45e"; } +.bi-option::before { content: "\f45f"; } +.bi-outlet::before { content: "\f460"; } +.bi-paperclip::before { content: "\f461"; } +.bi-paragraph::before { content: "\f462"; } +.bi-patch-check-fll::before { content: "\f463"; } +.bi-patch-check::before { content: "\f464"; } +.bi-patch-exclamation-fll::before { content: "\f465"; } +.bi-patch-exclamation::before { content: "\f466"; } +.bi-patch-minus-fll::before { content: "\f467"; } +.bi-patch-minus::before { content: "\f468"; } +.bi-patch-plus-fll::before { content: "\f469"; } +.bi-patch-plus::before { content: "\f46a"; } +.bi-patch-question-fll::before { content: "\f46b"; } +.bi-patch-question::before { content: "\f46c"; } +.bi-pause-btn-fill::before { content: "\f46d"; } +.bi-pause-btn::before { content: "\f46e"; } +.bi-pause-circle-fill::before { content: "\f46f"; } +.bi-pause-circle::before { content: "\f470"; } +.bi-pause-fill::before { content: "\f471"; } +.bi-pause::before { content: "\f472"; } +.bi-peace-fill::before { content: "\f473"; } +.bi-peace::before { content: "\f474"; } +.bi-pen-fill::before { content: "\f475"; } +.bi-pen::before { content: "\f476"; } +.bi-pencil-fill::before { content: "\f477"; } +.bi-pencil-square::before { content: "\f478"; } +.bi-pencil::before { content: "\f479"; } +.bi-pentagon-fill::before { content: "\f47a"; } +.bi-pentagon-half::before { content: "\f47b"; } +.bi-pentagon::before { content: "\f47c"; } +.bi-people-fill::before { content: "\f47d"; } +.bi-people::before { content: "\f47e"; } +.bi-percent::before { content: "\f47f"; } +.bi-person-badge-fill::before { content: "\f480"; } +.bi-person-badge::before { content: "\f481"; } +.bi-person-bounding-box::before { content: "\f482"; } +.bi-person-check-fill::before { content: "\f483"; } +.bi-person-check::before { content: "\f484"; } +.bi-person-circle::before { content: "\f485"; } +.bi-person-dash-fill::before { content: "\f486"; } +.bi-person-dash::before { content: "\f487"; } +.bi-person-fill::before { content: "\f488"; } +.bi-person-lines-fill::before { content: "\f489"; } +.bi-person-plus-fill::before { content: "\f48a"; } +.bi-person-plus::before { content: "\f48b"; } +.bi-person-square::before { content: "\f48c"; } +.bi-person-x-fill::before { content: "\f48d"; } +.bi-person-x::before { content: "\f48e"; } +.bi-person::before { content: "\f48f"; } +.bi-phone-fill::before { content: "\f490"; } +.bi-phone-landscape-fill::before { content: "\f491"; } +.bi-phone-landscape::before { content: "\f492"; } +.bi-phone-vibrate::before { content: "\f493"; } +.bi-phone::before { content: "\f494"; } +.bi-pie-chart-fill::before { content: "\f495"; } +.bi-pie-chart::before { content: "\f496"; } +.bi-pip-fill::before { content: "\f497"; } +.bi-pip::before { content: "\f498"; } +.bi-play-btn-fill::before { content: "\f499"; } +.bi-play-btn::before { content: "\f49a"; } +.bi-play-circle-fill::before { content: "\f49b"; } +.bi-play-circle::before { content: "\f49c"; } +.bi-play-fill::before { content: "\f49d"; } +.bi-play::before { content: "\f49e"; } +.bi-plug-fill::before { content: "\f49f"; } +.bi-plug::before { content: "\f4a0"; } +.bi-plus-circle-fill::before { content: "\f4a1"; } +.bi-plus-circle::before { content: "\f4a2"; } +.bi-plus-square-fill::before { content: "\f4a3"; } +.bi-plus-square::before { content: "\f4a4"; } +.bi-plus::before { content: "\f4a5"; } +.bi-power::before { content: "\f4a6"; } +.bi-printer-fill::before { content: "\f4a7"; } +.bi-printer::before { content: "\f4a8"; } +.bi-puzzle-fill::before { content: "\f4a9"; } +.bi-puzzle::before { content: "\f4aa"; } +.bi-question-circle-fill::before { content: "\f4ab"; } +.bi-question-circle::before { content: "\f4ac"; } +.bi-question-diamond-fill::before { content: "\f4ad"; } +.bi-question-diamond::before { content: "\f4ae"; } +.bi-question-octagon-fill::before { content: "\f4af"; } +.bi-question-octagon::before { content: "\f4b0"; } +.bi-question-square-fill::before { content: "\f4b1"; } +.bi-question-square::before { content: "\f4b2"; } +.bi-question::before { content: "\f4b3"; } +.bi-receipt-cutoff::before { content: "\f4b4"; } +.bi-receipt::before { content: "\f4b5"; } +.bi-reception-0::before { content: "\f4b6"; } +.bi-reception-1::before { content: "\f4b7"; } +.bi-reception-2::before { content: "\f4b8"; } +.bi-reception-3::before { content: "\f4b9"; } +.bi-reception-4::before { content: "\f4ba"; } +.bi-record-btn-fill::before { content: "\f4bb"; } +.bi-record-btn::before { content: "\f4bc"; } +.bi-record-circle-fill::before { content: "\f4bd"; } +.bi-record-circle::before { content: "\f4be"; } +.bi-record-fill::before { content: "\f4bf"; } +.bi-record::before { content: "\f4c0"; } +.bi-record2-fill::before { content: "\f4c1"; } +.bi-record2::before { content: "\f4c2"; } +.bi-reply-all-fill::before { content: "\f4c3"; } +.bi-reply-all::before { content: "\f4c4"; } +.bi-reply-fill::before { content: "\f4c5"; } +.bi-reply::before { content: "\f4c6"; } +.bi-rss-fill::before { content: "\f4c7"; } +.bi-rss::before { content: "\f4c8"; } +.bi-scissors::before { content: "\f4c9"; } +.bi-screwdriver::before { content: "\f4ca"; } +.bi-search::before { content: "\f4cb"; } +.bi-segmented-nav::before { content: "\f4cc"; } +.bi-server::before { content: "\f4cd"; } +.bi-share-fill::before { content: "\f4ce"; } +.bi-share::before { content: "\f4cf"; } +.bi-shield-check::before { content: "\f4d0"; } +.bi-shield-exclamation::before { content: "\f4d1"; } +.bi-shield-fill-check::before { content: "\f4d2"; } +.bi-shield-fill-exclamation::before { content: "\f4d3"; } +.bi-shield-fill-minus::before { content: "\f4d4"; } +.bi-shield-fill-plus::before { content: "\f4d5"; } +.bi-shield-fill-x::before { content: "\f4d6"; } +.bi-shield-fill::before { content: "\f4d7"; } +.bi-shield-lock-fill::before { content: "\f4d8"; } +.bi-shield-lock::before { content: "\f4d9"; } +.bi-shield-minus::before { content: "\f4da"; } +.bi-shield-plus::before { content: "\f4db"; } +.bi-shield-shaded::before { content: "\f4dc"; } +.bi-shield-slash-fill::before { content: "\f4dd"; } +.bi-shield-slash::before { content: "\f4de"; } +.bi-shield-x::before { content: "\f4df"; } +.bi-shield::before { content: "\f4e0"; } +.bi-shift-fill::before { content: "\f4e1"; } +.bi-shift::before { content: "\f4e2"; } +.bi-shop-window::before { content: "\f4e3"; } +.bi-shop::before { content: "\f4e4"; } +.bi-shuffle::before { content: "\f4e5"; } +.bi-signpost-2-fill::before { content: "\f4e6"; } +.bi-signpost-2::before { content: "\f4e7"; } +.bi-signpost-fill::before { content: "\f4e8"; } +.bi-signpost-split-fill::before { content: "\f4e9"; } +.bi-signpost-split::before { content: "\f4ea"; } +.bi-signpost::before { content: "\f4eb"; } +.bi-sim-fill::before { content: "\f4ec"; } +.bi-sim::before { content: "\f4ed"; } +.bi-skip-backward-btn-fill::before { content: "\f4ee"; } +.bi-skip-backward-btn::before { content: "\f4ef"; } +.bi-skip-backward-circle-fill::before { content: "\f4f0"; } +.bi-skip-backward-circle::before { content: "\f4f1"; } +.bi-skip-backward-fill::before { content: "\f4f2"; } +.bi-skip-backward::before { content: "\f4f3"; } +.bi-skip-end-btn-fill::before { content: "\f4f4"; } +.bi-skip-end-btn::before { content: "\f4f5"; } +.bi-skip-end-circle-fill::before { content: "\f4f6"; } +.bi-skip-end-circle::before { content: "\f4f7"; } +.bi-skip-end-fill::before { content: "\f4f8"; } +.bi-skip-end::before { content: "\f4f9"; } +.bi-skip-forward-btn-fill::before { content: "\f4fa"; } +.bi-skip-forward-btn::before { content: "\f4fb"; } +.bi-skip-forward-circle-fill::before { content: "\f4fc"; } +.bi-skip-forward-circle::before { content: "\f4fd"; } +.bi-skip-forward-fill::before { content: "\f4fe"; } +.bi-skip-forward::before { content: "\f4ff"; } +.bi-skip-start-btn-fill::before { content: "\f500"; } +.bi-skip-start-btn::before { content: "\f501"; } +.bi-skip-start-circle-fill::before { content: "\f502"; } +.bi-skip-start-circle::before { content: "\f503"; } +.bi-skip-start-fill::before { content: "\f504"; } +.bi-skip-start::before { content: "\f505"; } +.bi-slack::before { content: "\f506"; } +.bi-slash-circle-fill::before { content: "\f507"; } +.bi-slash-circle::before { content: "\f508"; } +.bi-slash-square-fill::before { content: "\f509"; } +.bi-slash-square::before { content: "\f50a"; } +.bi-slash::before { content: "\f50b"; } +.bi-sliders::before { content: "\f50c"; } +.bi-smartwatch::before { content: "\f50d"; } +.bi-sort-alpha-down-alt::before { content: "\f50e"; } +.bi-sort-alpha-down::before { content: "\f50f"; } +.bi-sort-alpha-up-alt::before { content: "\f510"; } +.bi-sort-alpha-up::before { content: "\f511"; } +.bi-sort-down-alt::before { content: "\f512"; } +.bi-sort-down::before { content: "\f513"; } +.bi-sort-numeric-down-alt::before { content: "\f514"; } +.bi-sort-numeric-down::before { content: "\f515"; } +.bi-sort-numeric-up-alt::before { content: "\f516"; } +.bi-sort-numeric-up::before { content: "\f517"; } +.bi-sort-up-alt::before { content: "\f518"; } +.bi-sort-up::before { content: "\f519"; } +.bi-soundwave::before { content: "\f51a"; } +.bi-speaker-fill::before { content: "\f51b"; } +.bi-speaker::before { content: "\f51c"; } +.bi-spellcheck::before { content: "\f51d"; } +.bi-square-fill::before { content: "\f51e"; } +.bi-square-half::before { content: "\f51f"; } +.bi-square::before { content: "\f520"; } +.bi-star-fill::before { content: "\f521"; } +.bi-star-half::before { content: "\f522"; } +.bi-star::before { content: "\f523"; } +.bi-stickies-fill::before { content: "\f524"; } +.bi-stickies::before { content: "\f525"; } +.bi-sticky-fill::before { content: "\f526"; } +.bi-sticky::before { content: "\f527"; } +.bi-stop-btn-fill::before { content: "\f528"; } +.bi-stop-btn::before { content: "\f529"; } +.bi-stop-circle-fill::before { content: "\f52a"; } +.bi-stop-circle::before { content: "\f52b"; } +.bi-stop-fill::before { content: "\f52c"; } +.bi-stop::before { content: "\f52d"; } +.bi-stoplights-fill::before { content: "\f52e"; } +.bi-stoplights::before { content: "\f52f"; } +.bi-stopwatch-fill::before { content: "\f530"; } +.bi-stopwatch::before { content: "\f531"; } +.bi-subtract::before { content: "\f532"; } +.bi-suit-club-fill::before { content: "\f533"; } +.bi-suit-club::before { content: "\f534"; } +.bi-suit-diamond-fill::before { content: "\f535"; } +.bi-suit-diamond::before { content: "\f536"; } +.bi-suit-heart-fill::before { content: "\f537"; } +.bi-suit-heart::before { content: "\f538"; } +.bi-suit-spade-fill::before { content: "\f539"; } +.bi-suit-spade::before { content: "\f53a"; } +.bi-sun::before { content: "\f53b"; } +.bi-sunglasses::before { content: "\f53c"; } +.bi-table::before { content: "\f53d"; } +.bi-tablet-fill::before { content: "\f53e"; } +.bi-tablet-landscape-fill::before { content: "\f53f"; } +.bi-tablet-landscape::before { content: "\f540"; } +.bi-tablet::before { content: "\f541"; } +.bi-tag-fill::before { content: "\f542"; } +.bi-tag::before { content: "\f543"; } +.bi-tags-fill::before { content: "\f544"; } +.bi-tags::before { content: "\f545"; } +.bi-telephone-fill::before { content: "\f546"; } +.bi-telephone-forward-fill::before { content: "\f547"; } +.bi-telephone-forward::before { content: "\f548"; } +.bi-telephone-inbound-fill::before { content: "\f549"; } +.bi-telephone-inbound::before { content: "\f54a"; } +.bi-telephone-minus-fill::before { content: "\f54b"; } +.bi-telephone-minus::before { content: "\f54c"; } +.bi-telephone-outbound-fill::before { content: "\f54d"; } +.bi-telephone-outbound::before { content: "\f54e"; } +.bi-telephone-plus-fill::before { content: "\f54f"; } +.bi-telephone-plus::before { content: "\f550"; } +.bi-telephone-x-fill::before { content: "\f551"; } +.bi-telephone-x::before { content: "\f552"; } +.bi-telephone::before { content: "\f553"; } +.bi-terminal-fill::before { content: "\f554"; } +.bi-terminal::before { content: "\f555"; } +.bi-text-center::before { content: "\f556"; } +.bi-text-indent-left::before { content: "\f557"; } +.bi-text-indent-right::before { content: "\f558"; } +.bi-text-left::before { content: "\f559"; } +.bi-text-paragraph::before { content: "\f55a"; } +.bi-text-right::before { content: "\f55b"; } +.bi-textarea-resize::before { content: "\f55c"; } +.bi-textarea-t::before { content: "\f55d"; } +.bi-textarea::before { content: "\f55e"; } +.bi-thermometer-half::before { content: "\f55f"; } +.bi-thermometer::before { content: "\f560"; } +.bi-three-dots-vertical::before { content: "\f561"; } +.bi-three-dots::before { content: "\f562"; } +.bi-toggle-off::before { content: "\f563"; } +.bi-toggle-on::before { content: "\f564"; } +.bi-toggle2-off::before { content: "\f565"; } +.bi-toggle2-on::before { content: "\f566"; } +.bi-toggles::before { content: "\f567"; } +.bi-toggles2::before { content: "\f568"; } +.bi-tools::before { content: "\f569"; } +.bi-trash-fill::before { content: "\f56a"; } +.bi-trash::before { content: "\f56b"; } +.bi-trash2-fill::before { content: "\f56c"; } +.bi-trash2::before { content: "\f56d"; } +.bi-tree-fill::before { content: "\f56e"; } +.bi-tree::before { content: "\f56f"; } +.bi-triangle-fill::before { content: "\f570"; } +.bi-triangle-half::before { content: "\f571"; } +.bi-triangle::before { content: "\f572"; } +.bi-trophy-fill::before { content: "\f573"; } +.bi-trophy::before { content: "\f574"; } +.bi-truck-flatbed::before { content: "\f575"; } +.bi-truck::before { content: "\f576"; } +.bi-tv-fill::before { content: "\f577"; } +.bi-tv::before { content: "\f578"; } +.bi-twitch::before { content: "\f579"; } +.bi-twitter::before { content: "\f57a"; } +.bi-type-bold::before { content: "\f57b"; } +.bi-type-h1::before { content: "\f57c"; } +.bi-type-h2::before { content: "\f57d"; } +.bi-type-h3::before { content: "\f57e"; } +.bi-type-italic::before { content: "\f57f"; } +.bi-type-strikethrough::before { content: "\f580"; } +.bi-type-underline::before { content: "\f581"; } +.bi-type::before { content: "\f582"; } +.bi-ui-checks-grid::before { content: "\f583"; } +.bi-ui-checks::before { content: "\f584"; } +.bi-ui-radios-grid::before { content: "\f585"; } +.bi-ui-radios::before { content: "\f586"; } +.bi-union::before { content: "\f587"; } +.bi-unlock-fill::before { content: "\f588"; } +.bi-unlock::before { content: "\f589"; } +.bi-upc-scan::before { content: "\f58a"; } +.bi-upc::before { content: "\f58b"; } +.bi-upload::before { content: "\f58c"; } +.bi-vector-pen::before { content: "\f58d"; } +.bi-view-list::before { content: "\f58e"; } +.bi-view-stacked::before { content: "\f58f"; } +.bi-vinyl-fill::before { content: "\f590"; } +.bi-vinyl::before { content: "\f591"; } +.bi-voicemail::before { content: "\f592"; } +.bi-volume-down-fill::before { content: "\f593"; } +.bi-volume-down::before { content: "\f594"; } +.bi-volume-mute-fill::before { content: "\f595"; } +.bi-volume-mute::before { content: "\f596"; } +.bi-volume-off-fill::before { content: "\f597"; } +.bi-volume-off::before { content: "\f598"; } +.bi-volume-up-fill::before { content: "\f599"; } +.bi-volume-up::before { content: "\f59a"; } +.bi-vr::before { content: "\f59b"; } +.bi-wallet-fill::before { content: "\f59c"; } +.bi-wallet::before { content: "\f59d"; } +.bi-wallet2::before { content: "\f59e"; } +.bi-watch::before { content: "\f59f"; } +.bi-wifi-1::before { content: "\f5a0"; } +.bi-wifi-2::before { content: "\f5a1"; } +.bi-wifi-off::before { content: "\f5a2"; } +.bi-wifi::before { content: "\f5a3"; } +.bi-window::before { content: "\f5a4"; } +.bi-wrench::before { content: "\f5a5"; } +.bi-x-circle-fill::before { content: "\f5a6"; } +.bi-x-circle::before { content: "\f5a7"; } +.bi-x-diamond-fill::before { content: "\f5a8"; } +.bi-x-diamond::before { content: "\f5a9"; } +.bi-x-octagon-fill::before { content: "\f5aa"; } +.bi-x-octagon::before { content: "\f5ab"; } +.bi-x-square-fill::before { content: "\f5ac"; } +.bi-x-square::before { content: "\f5ad"; } +.bi-x::before { content: "\f5ae"; } +.bi-youtube::before { content: "\f5af"; } +.bi-zoom-in::before { content: "\f5b0"; } +.bi-zoom-out::before { content: "\f5b1"; } diff --git a/src/wwwroot/styles/vendor/bootstrap-icons.scss b/src/wwwroot/styles/vendor/bootstrap-icons.scss new file mode 100644 index 0000000..f820c52 --- /dev/null +++ b/src/wwwroot/styles/vendor/bootstrap-icons.scss @@ -0,0 +1,28 @@ +@font-face { + font-family: "bootstrap-icons"; + src: url("/fonts/bootstrap-icons.woff") format("woff"), url("/fonts/bootstrap-icons.woff2") format("woff2"); +} + +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: "bootstrap-icons" !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: text-bottom; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-bag-plus::before { content: "\f16e"; } +.bi-trash2::before { content: "\f56d"; } +.bi-bag-plus::before { content: "\f16e"; } +.bi-pencil-square::before { content: "\f478"; } +.bi-three-dots-vertical::before { content: "\f561"; } +.bi-eye::before { content: "\f30b"; } +.bi-file-earmark-person::before { content: "\f342"; } +.bi-list::before { content: "\f435"; } +.bi-cloud-upload::before { content: "\f292"; } diff --git a/src/wwwroot/styles/vendor/bootstrap-menu-kit.scss b/src/wwwroot/styles/vendor/bootstrap-menu-kit.scss new file mode 100644 index 0000000..69936ee --- /dev/null +++ b/src/wwwroot/styles/vendor/bootstrap-menu-kit.scss @@ -0,0 +1,383 @@ +/* --- bootstrap-menu styling http://bootstrap-menu.com */ +body.offcanvas-active { + overflow: hidden; +} + +.offcanvas-header { + display: none; +} + +.screen-overlay { + width: 0%; + height: 100%; + z-index: 30; + position: fixed; + top: 0; + left: 0; + opacity: 0; + visibility: hidden; + background-color: rgba(34, 34, 34, 0.6); + transition: opacity 0.2s linear, visibility 0.1s, width 1s ease-in; +} + +.screen-overlay.show { + transition: opacity 0.5s ease, width 0s; + opacity: 1; + width: 100%; + visibility: visible; +} + +.modal .modal-dialog-aside { + width: 350px; + max-width: 80%; + height: 100%; + margin: 0; + transform: translate(0); + transition: transform 0.2s; +} + +.modal .modal-dialog-aside .modal-content { + height: inherit; + border: 0; + border-radius: 0; +} + +.modal .modal-dialog-aside .modal-content .modal-body { + overflow-y: auto; +} + +.modal.fixed-left .modal-dialog-aside { + margin-right: auto; + transform: translateX(-100%); +} + +.modal.fixed-right .modal-dialog-aside { + margin-left: auto; + transform: translateX(100%); +} + +.modal.show .modal-dialog-aside { + transform: translateX(0); +} + +.dropdown-large, +.megasubmenu, +.megamenu { + padding: 20px; +} + +.dropdown-menu .dropdown-menu { + margin-left: 0; + margin-right: 0; +} + +.dropdown-menu .dropdown-toggle:after { + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.navbar { + .icon-arrow:after { + content: "\276F"; + line-height: 1; + display: inline-block; + vertical-align: middle; + margin-left: 7px; + margin-top: -2px; + opacity: 0.3; + font-size: 80%; + } +} + +.dropdown.has-dimmer:after { + content: ""; + top: 0; + right: 0; + bottom: 0; + left: 0; + transition: opacity 0.15s ease-in-out; + opacity: 0; + visibility: hidden; + background-color: rgba(0, 0, 0, 0.5); + pointer-events: none; +} + +.navbar:not(.navbar-hover) { + .dropdown.show.has-dimmer:hover .nav-link { + position: relative; + z-index: 12; + } + + .dropdown.show.has-dimmer:after { + z-index: 10; + opacity: 1; + visibility: visible; + position: fixed; + } +} + +/* ============ desktop view ============ */ +@media all and (min-width: 992px) { + .navbar { + padding-top: 0; + padding-bottom: 0; + + .has-megamenu { + position: static !important; + } + + .dropdown-menu { + margin-top: 0; + } + + .megamenu { + left: 0; + right: 0; + width: 100%; + padding: 20px; + } + + .megasubmenu { + left: 100%; + top: 0; + min-height: 100%; + min-width: 500px; + } + + .dropdown-large { + min-width: 500px; + } + + .nav-link { + padding-top: 1rem; + padding-bottom: 1rem; + } + } + + .submenu, + .dropdown-menu .dropdown-menu { + display: none; + position: absolute; + left: 100%; + top: -7px; + + &.submenu-left { + right: 100%; + left: auto; + } + } + + .navbar-hover { + .dropdown.has-dimmer:hover .nav-link { + position: relative; + z-index: 12; + } + + .dropdown.has-dimmer:hover:after { + z-index: 10; + opacity: 1; + visibility: visible; + position: fixed; + } + + &.navbar-dark { + .nav-item:hover .nav-link { + color: #fff; + } + } + + &.navbar-light { + .nav-item:hover .nav-link { + color: #000; + } + } + + .dropdown-menu:not(.animate) { + display: none; + } + + .animate { + display: block; + opacity: 0; + visibility: hidden; + transition: 0.4s; + margin-top: 0; + } + + .dropdown-menu .animate { + transition: 0.1s; + } + + .fade-down { + top: 90%; + transform: rotateX(-80deg); + transform-origin: 0% 0%; + } + + .fade-up { + top: 100px; + } + + .dropdown-menu .fade-down { + top: 0; + } + + .nav-item:hover, + .dropdown:hover { + > .dropdown-menu { + display: block; + transition: 0.4s; + opacity: 1; + visibility: visible; + top: 100%; + transform: rotateX(0deg); + } + } + } + + .dropdown-menu { + > li:hover { + background-color: #f1f1f1; + } + + li { + position: relative; + } + + li.has-megasubmenu { + position: static; + } + + li:hover { + > .submenu, + > .dropdown-menu { + display: block; + transition: 0.4s; + opacity: 1; + visibility: visible; + top: 0%; + transform: rotateX(0deg); + } + + > .megasubmenu { + display: block; + transition: 0.4s; + opacity: 1; + visibility: visible; + top: 0%; + transform: rotateX(0deg); + } + } + } +} + +/* ============ desktop view .end// ============ */ + +/* ============ small screen ============ */ +@media all and (max-width: 991px) { + .offcanvas-header { + display: block; + } + + .mobile-offcanvas { + visibility: hidden; + transform: translateX(-100%); + border-radius: 0; + display: block; + position: fixed; + top: 0; + left: 0; + height: 100%; + z-index: 1200; + width: 80%; + overflow-y: scroll; + overflow-x: hidden; + transition: visibility 0.2s ease-in-out, transform 0.2s ease-in-out; + + .container { + display: block; + } + } + + .mobile-offcanvas.show { + visibility: visible; + transform: translateX(0); + } +} + +/* ============ small screen //end ============ */ + +/* ============ THEME SOFT ============ */ +.navbar-soft { + background-color: white; + box-shadow: 0 2px 3px rgba(100, 100, 100, 0.1); + font-size: 14px; + + .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); + } + + .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + } + + .navbar-brand { + color: #111; + font-weight: 600; + font-size: 18px; + } + + .navbar-nav { + .nav-item { + margin-left: 5px; + margin-right: 5px; + } + + .nav-link { + padding: 1.4rem 0.5rem; + font-weight: 600; + text-transform: uppercase; + color: #888; + border: 2px solid transparent; + } + + .nav-item:hover, + .nav-item.show { + .nav-link { + border-bottom: 2px solid orange; + color: #111; + } + } + } + + .dropdown-menu { + border: 0; + background-clip: initial; + border-radius: 0; + box-shadow: 0 1px 5px rgba(70, 70, 70, 0.2); + + .dropdown-item { + padding: 0.6rem 1.5rem; + border-bottom: 1px solid #f1f1f1; + } + } +} + +/* ============ small screen ============ */ +@media all and (max-width: 991px) { + .navbar-soft { + .navbar-nav { + margin-bottom: 10px; + margin-top: 10px; + + .nav-link { + padding: 0.6rem 0rem; + } + } + } +} + +/* ============ small screen //end ============ */ diff --git a/src/wwwroot/styles/vendor/bootstrap-side-modal.scss b/src/wwwroot/styles/vendor/bootstrap-side-modal.scss new file mode 100644 index 0000000..63bbf4d --- /dev/null +++ b/src/wwwroot/styles/vendor/bootstrap-side-modal.scss @@ -0,0 +1,48 @@ +.modal-left .modal-dialog, +.modal-right .modal-dialog { + width: 350px; + max-width: 80%; + height: 100%; + margin: 0; + transform: translate(0); + transition: transform 0.2s; +} + +@media (prefers-reduced-motion: reduce) { + .modal-left .modal-dialog, + .modal-right .modal-dialog { + transition: none; + } +} + +.modal-left .modal-content, +.modal-right .modal-content { + height: inherit; + border: 0; + border-radius: 0; +} + +.modal-left .modal-body, +.modal-right .modal-body { + overflow-y: auto; +} + +.modal-left.modal.fade .modal-dialog, +.modal-right.modal.fade .modal-dialog { + transform: translateX(0); +} + +.modal-left.modal.show .modal-dialog, +.modal-right.modal.show .modal-dialog { + transform: none; +} + +.modal.modal-left .modal-dialog { + margin-right: auto; + transform: translateX(-100%); +} + +.modal.modal-right .modal-dialog { + margin-left: auto; + transform: translateX(100%); +}
\ No newline at end of file diff --git a/src/wwwroot/styles/vendor/quill.imageUploader.min.css b/src/wwwroot/styles/vendor/quill.imageUploader.min.css new file mode 100644 index 0000000..56a1d94 --- /dev/null +++ b/src/wwwroot/styles/vendor/quill.imageUploader.min.css @@ -0,0 +1,33 @@ +.image-uploading { + position: relative; + display: inline-block; +} + +.image-uploading img { + max-width: 98% !important; + filter: blur(5px); + opacity: 0.3; +} + +.image-uploading::before { + content: ""; + box-sizing: border-box; + position: absolute; + top: 50%; + left: 50%; + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + border-radius: 50%; + border: 3px solid #ccc; + border-top-color: #1e986c; + z-index: 1; + animation: spinner 0.6s linear infinite; +} + +@keyframes spinner { + to { + transform: rotate(360deg); + } +} diff --git a/src/wwwroot/styles/vendor/quill.snow.css b/src/wwwroot/styles/vendor/quill.snow.css new file mode 100644 index 0000000..ccf825d --- /dev/null +++ b/src/wwwroot/styles/vendor/quill.snow.css @@ -0,0 +1,945 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: '\2022'; +} +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none; +} +.ql-editor ul[data-checked=true] > li *, +.ql-editor ul[data-checked=false] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before, +.ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before { + content: '\2611'; +} +.ql-editor ul[data-checked=false] > li::before { + content: '\2610'; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; +} +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100%; +} +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none; +} +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none; +} +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; +} +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} +.ql-snow { + box-sizing: border-box; +} +.ql-snow * { + box-sizing: border-box; +} +.ql-snow .ql-hidden { + display: none; +} +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden; +} +.ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px); +} +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; +} +.ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px); +} +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; +} +.ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table; +} +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; +} +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; +} +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444; +} +.ql-snow .ql-empty { + fill: none; +} +.ql-snow .ql-even { + fill-rule: evenodd; +} +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1; +} +.ql-snow .ql-transparent { + opacity: 0.4; +} +.ql-snow .ql-direction svg:last-child { + display: none; +} +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline; +} +.ql-snow .ql-direction.ql-active svg:first-child { + display: none; +} +.ql-snow .ql-editor h1 { + font-size: 2em; +} +.ql-snow .ql-editor h2 { + font-size: 1.5em; +} +.ql-snow .ql-editor h3 { + font-size: 1.17em; +} +.ql-snow .ql-editor h4 { + font-size: 1em; +} +.ql-snow .ql-editor h5 { + font-size: 0.83em; +} +.ql-snow .ql-editor h6 { + font-size: 0.67em; +} +.ql-snow .ql-editor a { + text-decoration: underline; +} +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; +} +.ql-snow .ql-editor code, +.ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; +} +.ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; +} +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; +} +.ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; +} +.ql-snow .ql-editor img { + max-width: 100%; +} +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; +} +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; +} +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; +} +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; +} +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; +} +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px; +} +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; +} +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; +} +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; +} +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; +} +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); +} +.ql-snow .ql-picker.ql-header { + width: 98px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; +} +.ql-snow .ql-picker.ql-font { + width: 108px; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; +} +.ql-snow .ql-picker.ql-size { + width: 98px; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; +} +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; +} +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; +} +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px; +} +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; +} +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; +} +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0,0,0,0.2) 0 2px 8px; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; +} +.ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; +} +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; +} +.ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; +} +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top; +} +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px; +} +.ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px; +} +.ql-snow .ql-tooltip a { + line-height: 26px; +} +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; +} +.ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: 'Save'; + padding-right: 0px; +} +.ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:"; +} +.ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:"; +} +.ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:"; +} +.ql-snow a { + color: #06c; +} +.ql-container.ql-snow { + border: 1px solid #ccc; +} diff --git a/src/wwwroot/tsconfig.json b/src/wwwroot/tsconfig.json new file mode 100644 index 0000000..1ca0483 --- /dev/null +++ b/src/wwwroot/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "outDir": "./dist/", + "noImplicitAny": false, + "module": "es6", + "target": "es5", + "moduleResolution": "Node", + "allowJs": true + } +} diff --git a/src/wwwroot/version.txt b/src/wwwroot/version.txt new file mode 100644 index 0000000..60c921b --- /dev/null +++ b/src/wwwroot/version.txt @@ -0,0 +1 @@ +19e4d37 diff --git a/src/wwwroot/webpack.config.js b/src/wwwroot/webpack.config.js new file mode 100644 index 0000000..2ab3436 --- /dev/null +++ b/src/wwwroot/webpack.config.js @@ -0,0 +1,156 @@ +const path = require("path"); +const globImporter = require("node-sass-glob-importer"); + +module.exports = [ + { + mode: "development", + entry: ["./frontbundle.js", "./frontbundle.scss"], + watch: (process.argv.indexOf("--watch") > -1), + watchOptions: { + ignored: /node_modules/, + }, + module: { + rules: [ + { + test: /\.ts?$/, + exclude: /node_modules/, + use: "ts-loader", + }, + { + test: /\.svg$/, + use: [{ + loader: "html-loader", + options: { + minimize: true, + }, + }], + }, + { + test: /\.(css|scss)$/i, + use: [ + { + loader: "file-loader", + options: { + name: "[name].css", + }, + }, + { + loader: "extract-loader", + }, + { + loader: "css-loader?-url", + }, + { + loader: "postcss-loader", + options: { + postcssOptions: { + plugins: ["autoprefixer"], + }, + }, + }, + { + loader: "sass-loader", + options: { + sourceMap: true, + sassOptions: { + outputStyle: "compressed", + importer: globImporter(), + }, + }, + }, + ], + }, + ], + }, + resolve: { + extensions: [".ts", ".js", ".scss", ".css"], + }, + devtool: "source-map", + output: { + filename: "frontbundle.min.js", + path: path.resolve(__dirname, "dist"), + }, + }, + { + mode: "development", + entry: ["./backbundle.js", "./backbundle.scss"], + watch: (process.argv.indexOf("--watch") > -1), + watchOptions: { + ignored: /node_modules/, + }, + module: { + rules: [ + { + test: /\.ts$/, + use: [{ + loader: "ts-loader", + options: { + compilerOptions: { + declaration: false, + target: "es5", + module: "commonjs", + }, + transpileOnly: true, + }, + }], + }, + { + test: /\.svg$/, + use: [{ + loader: "html-loader", + options: { + minimize: true, + }, + }], + }, + { + test: /\.(css|scss)$/i, + use: [ + { + loader: "file-loader", + options: { + name: "[name].css", + }, + }, + { + loader: "extract-loader", + }, + { + loader: "css-loader?-url", + }, + { + loader: "postcss-loader", + options: { + postcssOptions: { + plugins: ["autoprefixer"], + }, + }, + }, + { + loader: "sass-loader", + options: { + sourceMap: true, + sassOptions: { + outputStyle: "compressed", + importer: globImporter(), + }, + }, + }, + ], + }, + ], + }, + resolve: { + extensions: [".ts", ".js", ".scss", ".css"], + alias: { + "parchment": path.resolve(__dirname, "node_modules/parchment/src/parchment.ts"), + "quill$": path.resolve(__dirname, "node_modules/quill/quill.js"), + }, + }, + devtool: "source-map", + output: { + filename: "backbundle.min.js", + path: path.resolve(__dirname, "dist"), + }, + }, +];
\ No newline at end of file |
