From 6b0a5be1afee0160a7f97f911e04b4aec34c7f1e Mon Sep 17 00:00:00 2001 From: Deep Blue Date: Tue, 19 Dec 2023 07:16:43 -0600 Subject: [PATCH 1/2] Render quick replies in chat-box. --- .../Agents/Models/Agent.cs | 4 +- .../Messaging/IRichMessage.cs | 2 + .../RichContentJsonConverter .cs | 2 +- .../TemplateMessageJsonConverter.cs | 2 +- .../Models/RichContent/RichContent.cs | 10 + .../BotSharp.OpenAPI/BotSharp.OpenAPI.csproj | 2 + .../BotSharpOpenApiExtensions.cs | 48 ++ .../Conversations/ChatResponseModel.cs | 13 +- .../Hooks/ChatHubConversationHook.cs | 30 +- .../Services/MessageHandleService.cs | 2 +- .../BotSharp.Plugin.RoutingSpeeder.csproj | 2 +- .../Models/DialoguePredictionModel.cs | 6 +- src/WebStarter/Program.cs | 40 +- src/WebStarter/WebStarter.csproj | 2 - .../templates/welcome.liquid | 15 +- src/web-live-chat/package-lock.json | 496 ++++++++++++------ src/web-live-chat/src/lib/helpers/typedefs.js | 54 ++ .../src/lib/scss/_variables.scss | 2 +- .../src/lib/services/signalr-service.js | 3 +- .../[conversationId]/chat-box.svelte | 12 +- .../[conversationId]/rc-quick-reply.svelte | 12 + .../[agentId]/[conversationId]/rc-text.svelte | 6 + .../static/images/users/chatbot.png | Bin 0 -> 3403 bytes 23 files changed, 521 insertions(+), 244 deletions(-) rename src/Infrastructure/BotSharp.Abstraction/Messaging/{ => JsonConverters}/RichContentJsonConverter .cs (89%) rename src/Infrastructure/BotSharp.Abstraction/Messaging/{ => JsonConverters}/TemplateMessageJsonConverter.cs (89%) create mode 100644 src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs create mode 100644 src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte create mode 100644 src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte create mode 100644 src/web-live-chat/static/images/users/chatbot.png diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs index f6e10fd0..251af6b0 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs @@ -21,7 +21,7 @@ public class Agent /// Instruction /// [JsonIgnore] - public string Instruction { get; set; } + public string? Instruction { get; set; } /// /// Templates @@ -52,7 +52,7 @@ public class Agent /// Domain knowledges /// [JsonIgnore] - public string Knowledges { get; set; } + public string? Knowledges { get; set; } public bool IsPublic { get; set; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs index c81f7e91..fb87f381 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs @@ -3,5 +3,7 @@ namespace BotSharp.Abstraction.Messaging; public interface IRichMessage { string Text { get; set; } + + [JsonPropertyName("rich_type")] string RichType => "text"; } diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs similarity index 89% rename from src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs rename to src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs index 5234f7fd..7f01132e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs +++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs @@ -1,6 +1,6 @@ using System.Text.Json; -namespace BotSharp.Abstraction.Messaging; +namespace BotSharp.Abstraction.Messaging.JsonConverters; public class RichContentJsonConverter : JsonConverter { diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs similarity index 89% rename from src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs rename to src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs index 36e68a71..9b990193 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs @@ -1,6 +1,6 @@ using System.Text.Json; -namespace BotSharp.Abstraction.Messaging; +namespace BotSharp.Abstraction.Messaging.JsonConverters; public class TemplateMessageJsonConverter : JsonConverter { diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs index 61a89af8..95f4e6e9 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs @@ -9,4 +9,14 @@ public class RichContent where T : IRichMessage [JsonPropertyName("messaging_type")] public string MessagingType => "RESPONSE"; public T Message { get; set; } + + public RichContent() + { + + } + + public RichContent(T message) + { + Message = message; + } } diff --git a/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj b/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj index cef8a0e6..2df5badd 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj +++ b/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj @@ -11,6 +11,8 @@ + + diff --git a/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs b/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs new file mode 100644 index 00000000..89d7b099 --- /dev/null +++ b/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs @@ -0,0 +1,48 @@ +using BotSharp.Abstraction.Messaging.JsonConverters; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.Extensions.Configuration; +using Microsoft.IdentityModel.Tokens; + +namespace BotSharp.OpenAPI; + +public static class BotSharpOpenApiExtensions +{ + public static IServiceCollection AddBotSharpOpenAPI(this IServiceCollection services, IConfiguration config) + { + // Add services to the container. + services.AddControllers() + .AddJsonOptions(options => + { + options.JsonSerializerOptions.Converters.Add(new RichContentJsonConverter()); + options.JsonSerializerOptions.Converters.Add(new TemplateMessageJsonConverter()); + }); + + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + services.AddEndpointsApiExplorer(); + services.AddSwaggerGen(); + + services.AddHttpContextAccessor(); + + // Add bearer authentication + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(o => + { + o.TokenValidationParameters = new TokenValidationParameters + { + ValidIssuer = config["Jwt:Issuer"], + ValidAudience = config["Jwt:Audience"], + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["Jwt:Key"])), + ValidateIssuer = true, + ValidateAudience = true, + ValidateLifetime = false, + ValidateIssuerSigningKey = true + }; + }); + + return services; + } +} diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs index 6fda2ade..cf71b8f9 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs @@ -1,6 +1,7 @@ using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Instructs.Models; -using BotSharp.OpenAPI.ViewModels.Users; +using BotSharp.Abstraction.Messaging; +using BotSharp.Abstraction.Messaging.Models.RichContent; using System.Text.Json.Serialization; namespace BotSharp.OpenAPI.ViewModels.Conversations; @@ -8,24 +9,24 @@ namespace BotSharp.OpenAPI.ViewModels.Conversations; public class ChatResponseModel : InstructResult { [JsonPropertyName("conversation_id")] - public string ConversationId { get; set; } + public string ConversationId { get; set; } = string.Empty; - public UserViewModel Sender { get; set; } + public UserViewModel Sender { get; set; } = new UserViewModel(); - public string Function { get; set; } + public string? Function { get; set; } /// /// Planner instruction /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public FunctionCallFromLlm Instruction { get; set; } + public FunctionCallFromLlm? Instruction { get; set; } /// /// Rich message for UI rendering /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("rich_content")] - public object? RichContent { get; set; } + public RichContent? RichContent { get; set; } [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs index 766ca858..590e65f2 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs @@ -1,6 +1,8 @@ using BotSharp.Abstraction.Messaging; +using BotSharp.Abstraction.Messaging.JsonConverters; using BotSharp.Abstraction.Messaging.Models.RichContent; using Microsoft.AspNetCore.SignalR; +using System.Text.Json.Serialization.Metadata; namespace BotSharp.Plugin.ChatHub.Hooks; @@ -9,7 +11,7 @@ public class ChatHubConversationHook : ConversationHookBase private readonly IServiceProvider _services; private readonly IHubContext _chatHub; private readonly IUserIdentity _user; - + private readonly JsonSerializerOptions _serializerOptions; public ChatHubConversationHook(IServiceProvider services, IHubContext chatHub, IUserIdentity user) @@ -17,15 +19,25 @@ public class ChatHubConversationHook : ConversationHookBase _services = services; _chatHub = chatHub; _user = user; + + _serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = + { + new RichContentJsonConverter(), + new TemplateMessageJsonConverter(), + } + }; } public override async Task OnUserAgentConnectedInitially(Conversation conversation) { - var agentService = _services.GetService(); + var agentService = _services.GetRequiredService(); var agent = await agentService.LoadAgent(conversation.AgentId); // Check if the Welcome template exists. - var welcomeTemplate = agent.Templates.FirstOrDefault(x => x.Name == "welcome"); + var welcomeTemplate = agent.Templates?.FirstOrDefault(x => x.Name == "welcome"); if (welcomeTemplate != null) { var richContentService = _services.GetRequiredService(); @@ -33,19 +45,22 @@ public class ChatHubConversationHook : ConversationHookBase foreach (var message in messages) { - await Task.Delay(300); - - await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", new ChatResponseModel() + var json = JsonSerializer.Serialize(new ChatResponseModel() { ConversationId = conversation.Id, Text = message.Text, + RichContent = new RichContent(message), Sender = new UserViewModel() { FirstName = "AI", LastName = "Assistant", Role = AgentRole.Assistant } - }); + }, _serializerOptions); + + await Task.Delay(300); + + await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", json); } } @@ -92,6 +107,7 @@ public class ChatHubConversationHook : ConversationHookBase ConversationId = conv.ConversationId, MessageId = message.MessageId, Text = message.Content, + RichContent = message.RichContent, Sender = new UserViewModel() { FirstName = "AI", diff --git a/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs b/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs index bf83ea70..242b5cea 100644 --- a/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs +++ b/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs @@ -1,7 +1,7 @@ using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.Conversations.Enums; +using BotSharp.Abstraction.Messaging.JsonConverters; using BotSharp.Abstraction.Messaging.Models.RichContent; -using BotSharp.Abstraction.Utilities; using System.Text.Json.Serialization.Metadata; namespace BotSharp.Plugin.MetaMessenger.Services; diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj index cc28ea40..63a83977 100644 --- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj +++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj @@ -6,7 +6,7 @@ $(LangVersion) $(BotSharpVersion) $(GeneratePackageOnBuild) - True + $(GenerateDocumentationFile) diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs index 36b7c38c..a061fe61 100644 --- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs +++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs @@ -1,13 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Text; - namespace BotSharp.Plugin.RoutingSpeeder.Providers.Models; public class DialoguePredictionModel { public int Id { get; set; } - public string Text { get; set; } + public string Text { get; set; } = string.Empty; public string? Label { get; set; } public string? Prediction { get; set; } } diff --git a/src/WebStarter/Program.cs b/src/WebStarter/Program.cs index c8ba1a94..3da77ad9 100644 --- a/src/WebStarter/Program.cs +++ b/src/WebStarter/Program.cs @@ -1,53 +1,17 @@ -using BotSharp.Abstraction.Messaging; using BotSharp.Abstraction.Users; using BotSharp.Core; +using BotSharp.OpenAPI; using BotSharp.Core.Users.Services; using BotSharp.Logger; using BotSharp.Plugin.ChatHub; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.IdentityModel.Tokens; -using System.Text; var builder = WebApplication.CreateBuilder(args); -// Add services to the container. -builder.Services.AddControllers() - .AddJsonOptions(options => - { - options.JsonSerializerOptions.Converters.Add(new RichContentJsonConverter()); - options.JsonSerializerOptions.Converters.Add(new TemplateMessageJsonConverter()); - }); - -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); - -builder.Services.AddHttpContextAccessor(); - -// Add bearer authentication -builder.Services.AddAuthentication(options => -{ - options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; -}).AddJwtBearer(o => -{ - o.TokenValidationParameters = new TokenValidationParameters - { - ValidIssuer = builder.Configuration["Jwt:Issuer"], - ValidAudience = builder.Configuration["Jwt:Audience"], - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])), - ValidateIssuer = true, - ValidateAudience = true, - ValidateLifetime = false, - ValidateIssuerSigningKey = true - }; -}); - builder.Services.AddScoped(); // Add BotSharp builder.Services.AddBotSharpCore(builder.Configuration); +builder.Services.AddBotSharpOpenAPI(builder.Configuration); builder.Services.AddBotSharpLogger(builder.Configuration); builder.Services.AddCors(options => diff --git a/src/WebStarter/WebStarter.csproj b/src/WebStarter/WebStarter.csproj index 767af598..1e47e808 100644 --- a/src/WebStarter/WebStarter.csproj +++ b/src/WebStarter/WebStarter.csproj @@ -39,9 +39,7 @@ - - diff --git a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid index 6a0b2780..beabbccc 100644 --- a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid +++ b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid @@ -3,6 +3,17 @@ "text": "Hello, I'm an AI assistant that help you do variety of tasks." }, { - "text": "How can I help you today?" - } + "rich_type": "quick_reply", + "text": "How can I help you today?", + "quick_replies": [ + { + "title":"Order a pizza", + "payload":"order a pizza" + }, + { + "title":"Who are you?", + "payload":"who are you?" + } + ] + } ] \ No newline at end of file diff --git a/src/web-live-chat/package-lock.json b/src/web-live-chat/package-lock.json index c28973b0..0f233357 100644 --- a/src/web-live-chat/package-lock.json +++ b/src/web-live-chat/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@microsoft/signalr": "^8.0.0", - "@sveltejs/adapter-static": "^2.0.3", + "@sveltejs/adapter-static": "^3.0.0", "axios": "^1.6.2", "bootstrap": "^5.3.2", "overlayscrollbars": "^2.4.4", @@ -17,8 +17,9 @@ "sveltestrap": "^5.11.2" }, "devDependencies": { - "@sveltejs/adapter-auto": "^2.0.0", - "@sveltejs/kit": "^1.27.6", + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0", "eslint": "^8.28.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-svelte": "^2.30.0", @@ -28,7 +29,7 @@ "svelte": "^4.2.8", "svelte-check": "^3.6.0", "typescript": "^5.0.0", - "vite": "^4.5.1" + "vite": "^5.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -53,9 +54,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", + "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", "cpu": [ "arm" ], @@ -68,9 +69,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", + "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", "cpu": [ "arm64" ], @@ -83,9 +84,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", + "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", "cpu": [ "x64" ], @@ -98,9 +99,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", + "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", "cpu": [ "arm64" ], @@ -113,9 +114,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", + "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", "cpu": [ "x64" ], @@ -128,9 +129,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", + "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", "cpu": [ "arm64" ], @@ -143,9 +144,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", + "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", "cpu": [ "x64" ], @@ -158,9 +159,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", + "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", "cpu": [ "arm" ], @@ -173,9 +174,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", + "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", "cpu": [ "arm64" ], @@ -188,9 +189,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", + "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", "cpu": [ "ia32" ], @@ -203,9 +204,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", + "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", "cpu": [ "loong64" ], @@ -218,9 +219,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", + "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", "cpu": [ "mips64el" ], @@ -233,9 +234,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", + "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", "cpu": [ "ppc64" ], @@ -248,9 +249,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", + "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", "cpu": [ "riscv64" ], @@ -263,9 +264,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", + "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", "cpu": [ "s390x" ], @@ -278,9 +279,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", + "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", "cpu": [ "x64" ], @@ -293,9 +294,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", + "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", "cpu": [ "x64" ], @@ -308,9 +309,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", + "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", "cpu": [ "x64" ], @@ -323,9 +324,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", + "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", "cpu": [ "x64" ], @@ -338,9 +339,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", + "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", "cpu": [ "arm64" ], @@ -353,9 +354,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", + "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", "cpu": [ "ia32" ], @@ -368,9 +369,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", + "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", "cpu": [ "x64" ], @@ -438,14 +439,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "engines": { - "node": ">=14" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", @@ -583,98 +576,253 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz", + "integrity": "sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz", + "integrity": "sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz", + "integrity": "sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz", + "integrity": "sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz", + "integrity": "sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz", + "integrity": "sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz", + "integrity": "sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz", + "integrity": "sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz", + "integrity": "sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz", + "integrity": "sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz", + "integrity": "sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz", + "integrity": "sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz", + "integrity": "sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sveltejs/adapter-auto": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.1.tgz", - "integrity": "sha512-nzi6x/7/3Axh5VKQ8Eed3pYxastxoa06Y/bFhWb7h3Nu+nGRVxKAy3+hBJgmPCwWScy8n0TsstZjSVKfyrIHkg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.0.0.tgz", + "integrity": "sha512-UNWSs/rOReBRfI/xFwSO2WYF1a7PT74SrWOHJmSNLY3Lq+zbH0uuvnlP+TmrTUBvOTkou3WJDjL6lK3n6aOUgQ==", "dev": true, "dependencies": { "import-meta-resolve": "^4.0.0" }, "peerDependencies": { - "@sveltejs/kit": "^1.0.0" + "@sveltejs/kit": "^2.0.0" } }, "node_modules/@sveltejs/adapter-static": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", - "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.0.tgz", + "integrity": "sha512-nNsm8XChhJgQdeVegdXU+EnpznSUlsIjlLJa9SNmvSVN3rcPtB2BAnGuS/EWCtgPLkVcy9V2kW5knronqmF+KQ==", "peerDependencies": { - "@sveltejs/kit": "^1.5.0" + "@sveltejs/kit": "^2.0.0" } }, "node_modules/@sveltejs/kit": { - "version": "1.27.7", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.7.tgz", - "integrity": "sha512-AzXYDoYt42clCBwLF9GTHsXyg2DFR31Ncyt8yxu8Aw4tgB433V+w+hcr1RTfAN9zKW2J2PY9FMQ8FoX/4Vw8CA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.3.tgz", + "integrity": "sha512-TjqRBC7I3qnGeRfmxAkkwbQVnto9x+DsSDTtHC4qC+MgHPImIVzSgUiw//tZ3/uB5/MXhGNLhi5mztWZVM0sjw==", "hasInstallScript": true, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^2.5.0", - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0", - "devalue": "^4.3.1", + "@types/cookie": "^0.6.0", + "cookie": "^0.6.0", + "devalue": "^4.3.2", "esm-env": "^1.0.0", "kleur": "^4.1.5", - "magic-string": "^0.30.0", + "magic-string": "^0.30.5", "mrmime": "^1.0.1", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", - "sirv": "^2.0.2", - "tiny-glob": "^0.2.9", - "undici": "~5.26.2" + "sirv": "^2.0.3", + "tiny-glob": "^0.2.9" }, "bin": { "svelte-kit": "svelte-kit.js" }, "engines": { - "node": "^16.14 || >=18" + "node": ">=18.13" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", - "vite": "^4.0.0" + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3" } }, - "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.3.tgz", - "integrity": "sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==", + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.1.tgz", + "integrity": "sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA==", "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", + "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0-next.0 || ^2.0.0", "debug": "^4.3.4", "deepmerge": "^4.3.1", "kleur": "^4.1.5", - "magic-string": "^0.30.3", + "magic-string": "^0.30.5", "svelte-hmr": "^0.15.3", - "vitefu": "^0.2.4" + "vitefu": "^0.2.5" }, "engines": { - "node": "^14.18.0 || >= 16" + "node": "^18.0.0 || >=20" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", - "vite": "^4.0.0" + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" } }, - "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", - "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz", + "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==", "dependencies": { "debug": "^4.3.4" }, "engines": { - "node": "^14.18.0 || >= 16" + "node": "^18.0.0 || >=20" }, "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^2.2.0", - "svelte": "^3.54.0 || ^4.0.0", - "vite": "^4.0.0" + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" } }, "node_modules/@types/cookie": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", - "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "node_modules/@types/estree": { "version": "1.0.5", @@ -990,9 +1138,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -1114,9 +1262,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -1125,28 +1273,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/android-arm": "0.19.9", + "@esbuild/android-arm64": "0.19.9", + "@esbuild/android-x64": "0.19.9", + "@esbuild/darwin-arm64": "0.19.9", + "@esbuild/darwin-x64": "0.19.9", + "@esbuild/freebsd-arm64": "0.19.9", + "@esbuild/freebsd-x64": "0.19.9", + "@esbuild/linux-arm": "0.19.9", + "@esbuild/linux-arm64": "0.19.9", + "@esbuild/linux-ia32": "0.19.9", + "@esbuild/linux-loong64": "0.19.9", + "@esbuild/linux-mips64el": "0.19.9", + "@esbuild/linux-ppc64": "0.19.9", + "@esbuild/linux-riscv64": "0.19.9", + "@esbuild/linux-s390x": "0.19.9", + "@esbuild/linux-x64": "0.19.9", + "@esbuild/netbsd-x64": "0.19.9", + "@esbuild/openbsd-x64": "0.19.9", + "@esbuild/sunos-x64": "0.19.9", + "@esbuild/win32-arm64": "0.19.9", + "@esbuild/win32-ia32": "0.19.9", + "@esbuild/win32-x64": "0.19.9" } }, "node_modules/escape-string-regexp": { @@ -2426,17 +2574,30 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.1.tgz", + "integrity": "sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==", "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.1", + "@rollup/rollup-android-arm64": "4.9.1", + "@rollup/rollup-darwin-arm64": "4.9.1", + "@rollup/rollup-darwin-x64": "4.9.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.1", + "@rollup/rollup-linux-arm64-gnu": "4.9.1", + "@rollup/rollup-linux-arm64-musl": "4.9.1", + "@rollup/rollup-linux-riscv64-gnu": "4.9.1", + "@rollup/rollup-linux-x64-gnu": "4.9.1", + "@rollup/rollup-linux-x64-musl": "4.9.1", + "@rollup/rollup-win32-arm64-msvc": "4.9.1", + "@rollup/rollup-win32-ia32-msvc": "4.9.1", + "@rollup/rollup-win32-x64-msvc": "4.9.1", "fsevents": "~2.3.2" } }, @@ -2904,17 +3065,6 @@ "node": ">=14.17" } }, - "node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -2948,28 +3098,28 @@ "dev": true }, "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz", + "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", diff --git a/src/web-live-chat/src/lib/helpers/typedefs.js b/src/web-live-chat/src/lib/helpers/typedefs.js index f52bdb02..e4246b3e 100644 --- a/src/web-live-chat/src/lib/helpers/typedefs.js +++ b/src/web-live-chat/src/lib/helpers/typedefs.js @@ -40,12 +40,66 @@ * @property {Date} created_time - The conversation created time. */ +/** + * @interface + * @class + * @classdesc A basic rich content interface. + */ +function IRichContent() {} + +/** + * The type of the rich content. + * + * @name rich_type + * @type {string} + * @instance + */ +IRichContent.prototype.rich_type; + +/** + * The text of the rich content. + * + * @name text + * @type {string} + * @instance + */ +IRichContent.prototype.text; + +/** + * @typedef {IRichContent} TextMessage + * @implements {IRichContent} + * @property {string} text + * @property {string} rich_type + */ + +/** + * @typedef {Object} QuickReplyElement + * @property {string} content_type + * @property {string} title + * @property {string} payload + * @property {string} image_url + */ + +/** + * @typedef {IRichContent} QuickReplyMessage + * @property {string} text + * @property {string} rich_type + * @property {QuickReplyElement[]} quick_replies + */ + +/** + * @typedef {Object} RichContent + * @property {string} messaging_type + * @property {IRichContent} message + */ + /** * @typedef {Object} ChatResponseModel * @property {string} conversation_id - The conversation id. * @property {UserModel} sender - The message sender. * @property {string} message_id - The message id. * @property {string} text - The message content. + * @property {RichContent} rich_content - Rich content * @property {Date} created_at - The message sent time. */ diff --git a/src/web-live-chat/src/lib/scss/_variables.scss b/src/web-live-chat/src/lib/scss/_variables.scss index 67f77ef2..8ce230ed 100644 --- a/src/web-live-chat/src/lib/scss/_variables.scss +++ b/src/web-live-chat/src/lib/scss/_variables.scss @@ -138,7 +138,7 @@ $colors: ( // scss-docs-end colors-map // scss-docs-start theme-color-variables -$primary: $blue; +$primary: $purple; $secondary: $gray-600; $success: $green; $info: $cyan; diff --git a/src/web-live-chat/src/lib/services/signalr-service.js b/src/web-live-chat/src/lib/services/signalr-service.js index 57300207..780a1ff3 100644 --- a/src/web-live-chat/src/lib/services/signalr-service.js +++ b/src/web-live-chat/src/lib/services/signalr-service.js @@ -66,8 +66,9 @@ export const signalr = { } }); - connection.on('OnMessageReceivedFromAssistant', (message) => { + connection.on('OnMessageReceivedFromAssistant', (json) => { // do something when receiving a message, such as updating the UI or showing a notification + const message = JSON.parse(json); if (conversationId === message.conversation_id) { console.log(`[OnMessageReceivedFromAssistant] ${message.sender.role}: ${message.text}`); this.onMessageReceivedFromAssistant(message); diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte index 097c52eb..4ce81b2c 100644 --- a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte +++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte @@ -17,6 +17,8 @@ import { signalr } from '$lib/services/signalr-service.js'; import { sendMessageToHub, GetDialogs } from '$lib/services/conversation-service.js'; import { format } from '$lib/helpers/datetime'; + import RcText from './rc-text.svelte'; + import RcQuickReply from './rc-quick-reply.svelte'; const options = { scrollbars: { @@ -31,7 +33,7 @@ }; const params = $page.params; - let text = "Hi"; + let text = ""; /** @type {import('$typedefs').AgentModel} */ export let agent; @@ -170,8 +172,12 @@

{:else}
- avatar - {message.text} + avatar + {#if message.rich_content.message.rich_type == 'text'} + + {:else if message.rich_content.message.rich_type == 'quick_reply'} + + {/if}
{/if} diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte new file mode 100644 index 00000000..45697302 --- /dev/null +++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte @@ -0,0 +1,12 @@ + + +{message.text} +
+{#each message.quick_replies as reply} + +{/each} +
\ No newline at end of file diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte new file mode 100644 index 00000000..36b92f26 --- /dev/null +++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte @@ -0,0 +1,6 @@ + + +{message.text} diff --git a/src/web-live-chat/static/images/users/chatbot.png b/src/web-live-chat/static/images/users/chatbot.png new file mode 100644 index 0000000000000000000000000000000000000000..600988775c76f30b1a9fb350371dbb4d2f791183 GIT binary patch literal 3403 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 literal 0 HcmV?d00001 From fe197fd3eaeada966692cf52736c46ab3a31e168 Mon Sep 17 00:00:00 2001 From: Deep Blue Date: Tue, 19 Dec 2023 20:28:56 -0600 Subject: [PATCH 2/2] quick reply submit. --- docs/static/screenshots/web-live-chat.png | Bin 24295 -> 27843 bytes .../Hooks/ChatHubConversationHook.cs | 6 ++--- src/WebStarter/appsettings.json | 2 +- .../agent.json | 6 +---- src/web-live-chat/src/lib/helpers/typedefs.js | 5 ++-- .../[conversationId]/chat-box.svelte | 6 ++++- .../[conversationId]/rc-quick-reply.svelte | 22 +++++++++++++++++- 7 files changed, 33 insertions(+), 14 deletions(-) diff --git a/docs/static/screenshots/web-live-chat.png b/docs/static/screenshots/web-live-chat.png index feffd6e349879f9e076e27f921991fb967291a4a..131895345f808cd3996cde60439b04201c805f3b 100644 GIT binary patch literal 27843 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 literal 24295 zcmcG$by!?aw=PHw5=cV?35^5|4nZ210Kwg@8-h#Y?j&fC#wEBrG{GH$yG!Hl8r{P1%ZdTef#@hGC;$oZuZk!rPh3z?o+iJ1 zicFCJhw3B0p4cgh38BCT3Ad3C&y59T1W`~*!!T}jUm%}fS&M7fp`c*4J${~aS>+iZ z6W`g3sM{-98QDAO+8UyW*%}&J+L>6{Ypc9OX3^G`_$sLEti7M?ri{Iv++3b0;5d{r zU(V&mT8dV^W z!?8oH340IS?NP%Zdad)wvmYy^WTO;NY^Ar)U1lsK zVnH&Lrt=JCm@p(A1%>y|2XvG_&vakEK%k&hpl(7Rldga$C|K4_sK_6ZN}iznMS=e> zE?=wxO^-zZ-Q%#3FV{Tg`1hp+RD=2A&z$pTE(fpMmaWF4h>@doo(nXwPU_R|DT<^r z8TeC0!NlMb)Nhm0GJJ&f58s@ldkn9K&DmHPT5+|DtQ`ivxVV~Kk+?nmqtx9N5Ox5Q zp*GK8sUTs1gF5-`bZt6X)=mdzF9Q5KP)mX_webuk*ka_lWU^gMWUF4|%^f5JrW6E? zDnfy-pQe1pGDQ*_-T4|Y7Yv5x+iKD^tLlOhi+xt3%tv3pu6lJsP&AA7=XHpjv?iLQ z9R`DJ%Rg9Mc3wyVsos#r{h&V=U zD}yv_+D6ceC6b8xNo1UDM%N+AIg0JyJx2 zTY-!^9yiA~P0>Rbojdc8ykF6di{0K=BX#FFa|UuO1}Ts{Uy-QA@D#{*%3})rr4fIc zqEtS`8K}X}9Rl0MDBgB^v zXq8B^@ffje;USPC7%q8YX0tln!+e4-9f57K_r8HqF+JppGID2JoMWbDV*plal2|t87Gl_8*k3}H>VX;~{WCc3GOh1-r%26B}Q@6VSI$om8K29If3p+zWnPlN{i}qQwj1i`$A#R)ML1 z*6Gwn_QWLvBOIb8`OWN zvgOO+ph~(0ts$}r(Yu2EA_hbCT-59`s3n(ywesDvga z`lrH#+cna-iafty7N)ywgDzOZq1-%MBF)E+5Z|Et2OAgd#59^6Wi6`UM`d zzXcq3?D)9E9xj2f>Zsk>Y)-ygvs}VpUFCV7H_M&w>`Shs1^kaaEG`_5u$zy-d7*1( zmWqrry*%$LlW@T{e{-@}di2t}OdT#oKgxf0eE1=Rmf)}2rONxBqql&=vqCK$l|cw< zbBMSlj)Ep>FF0z7OJl}D3S`3=>-9!`jLG-oS+n7usiXGqg-PlBD%e3pN zGs_YKrm=U{$BFf$hU=f8E8iDK)e9Bs)1?F==X&MAxOjSH%>_m2EF=@Z73Zk-g1>XW z8UN)UHr`)JiZ$Pb$8SYyN{1S>%avL~(;aG$ta4I_5h#CxZ&tx*@`@(e=4Wskdibx7 z_1s`sXKe4+`qtAGT)PPommd3chY{d(-6jD1?E5=d6E&~LxI66fn{AyC+St0a#?4kH znnyK5oka7(#nMO~>BDdHlz1Vi!EOo%(uhlnimKEb4TF`YNBKDS^&Qe<$|mYXZ!>-? zqK$RrB-Z})U+FAVczjXW%g>6!E$%PEF{M7}8qBXszrs?XSmlb~yd{PO{j76g6KSl} z2o}9=B&a%Yd4@nq`>Oi{VUr7`Mm9aZ(!}>CUxL_i%XrZ{hGN(IKOhup1?q2gHCC@h zbPJsZ_8|KB+#YaFr%ZliWeF|ILurJWEgyRC31P>|r3v3&zxW>8zcTmxX64?l&CqC_ z3#h=+$)eFC-BPQI!e;OTeBvl(JwSj0&>&e{PjvbV;YX=>;gw0UZhB4NceK15(Xt$& zTj{07u5%r{RIJtpE?F7yH%YckuUQ7m8+9NGK3p8HVyeq4! zaMd%llvzFPT|wOg6|4HaQ94N&Ah}oT;XI!kFc!%nI?P+TJ1Nq!rg6(@NX=iv!AY;G z={VLxMouH4zRJ8EP)p2bhFzyWd8V5B`o7}jYHcpwEh@EEYNB;Bw15`dv$XGm)@UaN z7DpMx2NZmxFgY@ESCCmsAW%pcas5fZ8cXb}hbEc5+g_J^KPc?=v=-uH;WzXetC3js z9t9~%EN+&}jFli9avocm@y^U@N;JOD28ZB_ZLSe^ncNH1F6~JvA{R0;vfPo8_S<1C=631#&zQjXGmUl#UY5;6m?ZssF%EJO8*|Q2ry4A7ek_4#hFyep z#6dW(Xu0UON)NVN>j7{2%lI2ZH)@hfe69`CN{n#yFV3 zWfV-#Ne2IwoJ$&J-bhkqrR3Sqy(xo0E^{z!R^wO4-1I3%xU_+q)gm9hOxynMZaNf% zN0fB00J{KhCS!gHGx=Z33q1r^fq(r7Aved8i4nC}q7fU57&jM_v$bZbyAk0ayd@ig zv2>jjv-_f&KdelLf1NJ=m9InY5S+&&T=tVsfeEL!=&L^l;$@%a?%Vtack)^GomL7w zC!7um+w^19u)i$#z0ab99;~)Z7K7Mn{lE9}?I1)oIe2KSoC-x616=+qKlI}G>~~*FqIo1O(n)r8*BnSe z`OIJquuc!@2^?7-8DT!}_b&q1F16=CGVvw)(c%n}K2lQtIlv&xu z?>s)zlv&XRsxUXAoCnj6ioW(BR>lOV30WlL)&rlUa9h;=JecwZ4` z<0MDQwRmM}<3V|DH*Ham|1&E%7fb<>@f`j{67hP?!powgWmNa*mBiXu8iJn@nAX*~ z2htWiT9@WUI@fVGTUjssfP1(aX9;0j31Zh{g&v6Y*Fo=zVR3sd47_T2==A(cz%=WD zrCRw#qK-0~!KpJMZGxfr_UR0GSh=EJ26e9*c-Yypc$F*?N(@+Y-)p&LNw_Gr6niBq z9~{k9Cu(yc?Q1;cw#2^&Q6d_uqfjkaZL~j939}^r*7$)g*?96NWoYord3;r&g`>A! zGCsAt3%5m%iuCsHgZO;@zIMY>_VEN*kCv2%x<2oIt37+-{}EtdS#c^)A$n3Jbq5R( z5e;V7x(0o>%;SsCO%wm8AfJG&JnfnZ~Su^PP-_oS4_aJ_iR}Be1+R7+8Z! z4H35A*mIecyX}O@EhS_HJ?Z;nTtVY@GRu9G$XVwUMQfQ-$;dgA^tN(N4BUR`^K5-$ zj~iS6Gu<4bN$xo=5mF@ve1lJF;JqLDfKL1(Uap`)bS6ineEA+n@SwbPDgPP#i6*N; zg;qd$D>6#eWSs(Q&YNCsFsoPmw=4Gl)4Zt}17UqELqqxg;#noMn$3cv#%QIbt^Oj% zU+fcF02P}5o97xP_)V-L7Vdg_+P(2{&`-I~`@S&0Ec+nDkUVoUjt#vpH#~roj?CdF zE1CnmNicXaoi_6lYwP`A=T5zRE{H3fx6g{v@6T0-ELr$<@*9H@Bg{?9jV++P*&739 zV@yaQ@+ar7wU)?t<@^t=Z3d75^ylwF;T?o5C}Tg&Hl|7xikz#M+ zKV~N(zJ}2miN0BT_1f--SxsFhFXxCp;okUeeO>+8yuYPzSbA=5Zgq8+ z3B~H^8Ad1R=C6LE6B3EdA9^;=1yhnf$&SsA+C)nA^PDV z|dFZpu| zzP_*$tAn*KzpR~<{`>5B!tr4Wlb?j+lMAx*NsKL=Rd$_`HjHZt$MAUt{;cP_6?&m1mU>XCQ|&l?hO`;kp_+I+KA>GIvZ$q%9lQmHcQ+R#w&;xfs8c zl+?}bTvD=3SXOWSJZ{dtPDgTZe$aVduc|el9n(G3?NRnNH=e2lonFo|H6NEhT=(!a z>)_+yJKSC#6{<-g$I!P>xv_D1S~x$(#|ZpVES!q`QSQAUK=R!~obgY_of-`Xo(D<6 z+l9+T=jQw4W)BEUa6-fJnN>snScHukbhpmU^_>-Y z3qv_G5Zdp9#bP;mr#8K`eSAIF;J(v$yM^|UFCW-@yVh0G*|`VLFCMTuJjttbn*aRy zL2BtbvV3Hd$F~cjLUZ(D;#^53mv)A(R9>Uz%~;ZVV08Gzy8IwVm6OGN{N0VV2S0PR zfx5z_`dGwUud2VLO*D_~ZwEErIlZ@HcdvJ(s9tk5Fc=T>x+M1#RQ4BD(Sejj^TybJ z&W9J@p~+mxIh`h=9`qqpyjc46qEKA|$*M#WSk;CW@M5obS8hM%LT3go zj{j=LD3jAAjrGNI4N&q_rPf*6QyVj9H69W`il~!hz?M~zfl#Z8pqiBBsHEZT$g zu)5zBMk1t$$FX~lsIdP)E;;LIGjGq$cgIn3(|vYSY1MG+oqHj*_>kTZE~I%iGin%} zy?A$j(tNCaUZUf*-9agp>b2Zqoa%N!H`K7a>2zjxw5yU?>X4%yHUA<%9x^6SbO@a6 zOXy{TGXs6&VMbbk`bB31fR*o|J9u;)qndT*!VU3-k?hihek1+nvYG07#P2^zobkws z_405xum4zh3f(#{PfM~RO*a2RtM&F8RcQ0;I%5V73a2y#Larg!-bP#t0r@tUPRMXuK;}USk3tO zf&bG{N9u#3;_EYTY~x=tQ^Ov+A%T+}xd$Ueu9pk<;UU7()v<@AECkzDUb1)Of$qcW zX0x3g<{ktn8QPyS=UbW5B=|(I@Ydboi5B`!hf`}U6o}rsIO>90gzii?JZ7wN=@R!* z4?XTxr3i&+3HIc>rIHh{$C|5_Sg${cfGaTV#GQ^Mv!#kY*oBir7nUoRRwMq++EpWH zeKn3&2S4TmA&EtK$)>-wX<|%1Pkk#@>F;CZ?++2XllVz>oo98Y9f41p6l-hje6Ip9 zR@GdtOEQG47FCutR{APbb~z`an+#*B!%BWHdXtUK8a<58*tVJmxNZB+S5oH6%ovgO zCdAxa6}Jod7;e<{%hSHyczv96T=X^Uf_0audO)-GZxC7LD&n%SW8q*+ukW&ZII^na z80cY77qxq;S9>Od$4*X5MQ0XM-6z};-PGbFQeaUd#wR}np%iu9TlrvT`*r%`s8BzV z=||KuAFgjQV8Is5La6e`x&y$YA+s5nAmDhg?)`f+1my7dFu?(=YY03rO#&3JluJ|VF#iTJg<61%IKs}UMjS6=Ahz0zyp(7U?U{r8nrl&>D~;1vAi zRHME`F@YOgL-mu$xa?&xyTHFso2tw86p%tjuef_o5TN2YuBqhV95a>q)|I1* z*_#znqa8stOMb8|9LjotT{6# zsPCM$F)?K{(WEHoyxQ&1+ruFP8V#BvD^f7_cz<^FYT;DV7XebOp&GW5i%%h9t%#@_ zK4~>hyiGg)iyqQl=Dx(mqZ|^a&u5YPm{?ynlsX&g3y31>Kh@1Si3YPK z3L_f-H352<>h2eww0&GD5cWp&LQb%F&hJfk`4oHbPO%~RKnZa=odmNW(#aI!PlU!)Cnl3k^jU{kY<;}r+Y#VqstnxkcqxdSJLw2sFI}q~4 zp$^4O5%;CP3;EVE=CKw@dPHHvK9w|Oo_R-#MO^_e#w$zh0EJ2Gu0mu2X)?Ro(4V|*1~rS*RJ_%H zngiu}s~prFk6GXIgFvi7#1uU&-}9qXdHi}EYQO*7ngyNjNLLQgre;=4>leG}rm)H3 zzb#B`q>YM%8r_8sNoI(Y&C}5&^D1mK1n2Bf=;8bq&!TJtAfg*#Vk1Kkv)f?$jZ(m< zJtEm*m1yy8?qS3k>vw5vciFAyGIk*Yw>cODM)=GU%yA+=Da*O-=Lt5RPMEADv=$nE z3~=)ER}S!p=PHbr;b~_rzgzEHXui`c){vLDxzrK+7+(0bmrXx!euSB)%HHB?YIuBa zxTMqz+3zG8hW2~bs?=nU3I;vCjjc98&lO?buMHhf;`EI;S&STEzja5Cy7Z`D#(7*0 zSx>z>+2U<*Uw_4SNb(|fd(seAnn~|k%eYczt`pxibNv2}BA82+F7@AiRe{^MAJRrn zoI=;2(PvP1)oF*1A$x4a4y%3xzYoQRXP4LHx4U1R&%};^-z`J0D6Bm~6xQj+%-uGw zo4y2aB(wLADnttDt3#Vb&(e1n{u8omOAEG9_LfV<-a)J{ zb&?uxvy)#v+-9bBtB|dydR^|sRe2rbbnW~NQJHgd5vQS+XUn*zX^iX?+e-wD(lXK|(V$k-nULss z2)X62hpGx-sivKnYrCe^Lp(4G#729h5v6EM_mdjEWpe2OirkhD4BdgyZ+jLJU zUJ|t@{9L_FgMIk7>aKmkR7zX6>&E%0?=?AV5tXY&Y2oy`C+-5zBF-z7(Qa8CTMB2F zv^mfu&|Kkwx)5rDQr79HnI)zCmr~bew-Y0AITNFbkoHWY)H8?}txtWDaen8b&72$@ z*EMA@du37etdfgryi4sWCzxQP^jJKdZE3$C2m^2&JGon@S^Vhg%7Dkl^~A69NN+a> z#FWC^?vK?}4dqijY9B^=it^su6MG^ zvMtRW5?ZX_DXo?o3|ZdY-Tt_>{l11fU7DM4Kg_m|8KF|iL@}(i_sJO^A`^xBQmC!U zol%3u3lZK*D=UgROe#`%0wGY7r)*YdZG`%=z8t+=On`gKm&k0}V-MOwu6z6cR@)Od zamz8y2knoFaI=@^GR2exhQm#!3LMx~%&jV-_|&5k+oV_x%yr23T&_H$HXYdT1(@z<}B>poE&7 zF3tpEFS{|09hRX@%Y}wBo`-veT27rTo7G;`l30aPd>(TBKTL= zUQ@b!(iYXj)8KmjXs<${)f%u`^PLo~KAUWHS57Le-=>tlLW9#uaN&L&-H^!xY1U6` zkmON5NynLE!L%vkrp<1j+WUX30PtkVM~cd_{a#F@Gd-g`)wt+}|P_0Z#n zr`~aoz9f&n&n)ETegLX*7UW=>5H#M+Hf{1kkkBoGk<7iX^I&|!8{?lv8<2hPh&Wor zNyY5z8>qKE2a6gQL~k;A)~?lV;?Tx_dh{ka7D_&H+vioBih2m^Yb&q6dVucB+y&u~ zz8uPPfc-U;THkW};fEBCW^Jbd@z4U;`PyldX%muepi}3*H+A&u*A#L(-z{FwUo@S3 zMEcaHwM<^?(@b6>EEs%g^2=VH7jASWQ zyJVJMv+10YkI@3zS&95Awk35kqyAU$5gi+Ju=l4t?%tV;iX+uNDp4ogj*E$PSMNH$ zTr4b`SX%O)O?Ppj=915CWo6~u^W8(w{T*5;;nm(+&se<1w4YxGM{h5koW zawkj6MKFG!!wskK%bPWu$8G`Z{B2olDV%2UZDH6woGxnUCm2ClYY>{6=qR@%@xL_@FOw!2K$@rnZ>qd);4r(#${9lU7B^36&Sop!Z`jF4o5fLmyVWcsrISsa|H^+ zd(uD8uR(g4-q@34=D^hu>}QGlo`e|4@R=0({_--A<_tzefmaL7k|%|wGa5j8>r6&u zJO%G#S~FH6C)w)-#E=5%d4*J)%Ub_Ygx8^?Lll@zkr6WZzK&f3k8(cT!)#acCM7ME zS?tYMe5A5kJHW8V{(M!tke9L8tsD(%pcCPWJLv}1UiqC?Ljv9|~6%v=ZAbMbd1z3s!{G zTmq=QvQ3FyZaFBvzQIK1ABfscsEgizg+KNXn!d7mxB*=5(#w?GvwHo-=7^`Vfb1rM zF!Nl=!+nO%Q|KXU13QEMbXc8J`DQ4%z*qWp!Mb1==PNB zKG*+w>~?Wg62w?_Z&WbMpBY7d*N~;-5Cc-ny&!Ff0KQ2(3Acp*Ql~1C^=z&th~+u% z&S;LP8&zu{LSxvfcU%N4b7+)MX&wY~?i1np@uUu{Oh!z?@GQS}9W)uSXIXsXFgiVj zBr1oN(2&V_{HyXkuV{06X#J`FPx#?HRfU|6)%nTHs8asiy2s1?PWcM%?XE_@+}1+` zotIl_CdoJzb=~*7jq)avks)I(|If{ZrIC=@ze?siRz#-L&YHdFtCwX23J;imH{eusaiAnyR_9O5*^HHbcLkibsvq4U^mJ3G(TTf_ z4a~S#%^kZn1C#TnbQF_!z!sfYMyzW0WEWcJWn0g22$0|uuJmK`BcPwoHmfB#7|P~3 z=g%5%3~VFxTz0PceS_@UCUt?uvJE4Zm9(UON8BA&?YIX=IETUoouKkY2MUV@>xjqEiZz?3-UV}#GXViT?!?&J-;PLy#Ou98=vv ztMwlwaw?B)j)%6hwih~e!2edyxws~{UDVpc`flE!!(T}jhXW)Eln~C%A90r|@Cn4- z1>b6{z=r$vC&p*usBqB-69z%F2kTpVlM%5n1YWQc33hdx)70b+#=C}&#EL2$ z10!(px&j(olQIDgT-yP!Se0PwxcOA;>!1b1H zy7+CQaHzT{GaQ_Gt{pmPNn|?fynOom@Y6D;(w^Tguc_?A=Ofx**4oodwH7uPL zNBGGzm5^5G2l77N;b7s>5{z)NeNXu1-2ER`VA>Ef8Tj-u4=#Qq4~Pr2D+_pnK$c3& zW}iVkF!xpX59p=0G@fFA_ZGGW5(YI{>mNbxYka0#dSo*FFE4Z32>~Z{*O(|&)@l5> zb4v+;GuJDHp^e)Zu!OKKHLlnjnKn$zG{7x*Y>Z=kVPtw?dU|AfVmkY9 zbob1F(8qvKkVEfdfc=e;uLyIr~o&XX-kq1R^{X zbP&T+!&Bo^<8$M4qx8t~$7U>9Wphmkp=e!tgng!~{9_XK+>#dwx}GSL@iFcO!^J7Z0#IFxd(Kn{fjUC_PXYf$ zVD|SHrXNlQ?WqiVirBJv9zD}rCqzN5xuk7=`GNSLAfXB7ug4CQ@IY zOes+^(af#ZUuOwwA7^#gB%=8jWHh#pCahDkwrfzjDm=(8(+cR!_pWg_w!J=i{m&?`B*bFse>I(Df+x!6=00pVe5~bfI)}yS{5|#D zz7dGVQxvDu(W(n6JFQ>zx>sB1yFc4yYOFEXK4EIO+_M|NP5j8xEo&66&9M#b1UvsiinV(xQ?zf{g~1VRbd~Z2+fb9yaO!wE}979g~3yqsv zi|*63(Ip-yF<#*2^^(E02M_6$V1bA1tPeZ2^lr-{qrH)vNT_Zi^?m>@_i${#uvjvG zx)*6^fKRiQ79E}Wp!WHL=fwDgeq;$$6Y*L{PJ4Iz{Ra~Fch{~>ajx@U{8~$iZ32mM z5En08FDY;(E!x01`{fM6%;EWcue_u-?$T^=ORZhd9Tbx@WPwJ6^ zW=@lbS3RjJVYgvc;(IFf>dAd8?*f07OHpmgo2}Zyb`yqLoA#UJ@`=+w=G{|ek_F(V zG+PX!`p+DS&z{;7uQUO~i{48D(M`l$M$gAWk2P>S7wYcXYF|OKoJdJXs80tKDQ;1hoCM5ue~=v3FCwPmzN`PB`ePxmLA z1UG3K&G59K!PDW#{MR5k{DhiM&0E)QXs^9~7Gl2ArgIt)*qge^Exr(^)EO4IJ&}sB z?GwK$55{4W2v^u`WU`ngPpxq1i-iSn3q{@}X!5M@zQZ&;@)-f{wEl!MXZuZEGYN%I zzO|>W4ur98MgPs0#bRFr3*h5gtD8_v1gOyn(B^YV*lChE9Q(ys#t|4Gz2lMr(6Pjz zW_}qZ1}UOQvMiao5|hmrjR(DGJ?a@K_vvjII8KeMrt=<*3R{ki;-szhB#mqxQn-jg?Vn@CIEo(p zHeF&+o2CuZuLKC}=%U#PqOx_z?i*4#_{12GZk;xQr5IWz+Foh(^T5Kqs{V3i%97y@ zXeNHX`NG#n3lAcM#jUvTHgvnnF431OzZl)ZU$Y}2n)~WD%3@nrcIHDdS<0DSQNApM zJSNXHn-NTY;Wq(lEqsIe2{$T8!oeEWs6i;z9f^dUJ8a%JnjQLbr~e)hRE(^eQEo(c zNnZ_pXZEtk-0qlhco0vD5Mjyqp8s|GJ1Q+Y|Ao1q^v0V$bN^b(+d+P6ef*e*=zx4o z07Nb`%aEx-90|+CHG182XqKl%BK16!pF}M%+O$)?K2zV(e0%1&G(CShT}OY>k^zo% ztQ|cLLzBKSIdc2+I|vUs8MssT_=zg&ny$Y{KTqu!BIJi>d%}h*_C&SX@ZXks4oDY| z+ayBjJJX#ehXzGwY2QBAT@<92J;lD^uX=|Lu)8&_5SN)RP<|))Z4NNaJ5E~Wn2^z1 zw0?auo8tugooON%{}fL3+!dpZIl!q!{*C26f_hRr-fSDeIj>1-p<;+*ZoYp1`(JaI zrle@Gv1z{z2f*Vb+Eigc6YuRW6>S_xe^bBox0%!BN{Z+G{gs$N1QKl(c=$WPWbv@Z zBn!E(4-ZSh!HYhw%a*rsWpq4uL~h^P91EYkAp)xgBphqTU{Go?A^(z_RxAynq?^?nM{J?Ls?47>KV=g~xcZu%>qGBIxd(RocK#X^W8C zoob~*bFyxTEnbeKg76Jf#-Hkg=ikZ3uZ}$h=)Z8&(Z>*Kuj1=z{LZ9L&@QrOH?0TAV6K;P3Qzg@7R^n zxqI+6xbwL`Rilb7EzcF&(jQa1UBXF?{dja9Q7;v@U=G@nejI?>hF=T_Ov!*h@l&%gYZ9 ze+6JfwKaIOL)Pj)tr!HaQ*>L4?6Bw0ofLP6R6M7GGfz^Eq@=&d9@r|Fq2kLHQSHo8 zDSN*uq(VjhY>IZW6GyoRE*uy)l_jzeBwc8LNT2c!)#4d1v#Kr8u?;S2PyUbfc1)j8 zCak%3o4_G{(~iSx;X2vtAr?$nK7iG9GvEF!5TpW|Z5~UA86UQa1yC#Jc%27R>k->| zhJL#T6^0c$^b8Gt$emBAE2lHq)L3Wc_RJIuDYT8Vsm#nN?!BTwXca0vI{kw05x>wr zg1K$T&jn~%FmaOac=hMe(idH)4aJPE-4ACMrz`c1T|^8uRQ2aBthDp&*b$w>Z2UuE0OPE)40CHc=Q^F z(}lCMId%wuCmFPImpV|Z9krsD3cEmk3E!||q1mX!uF`*%7z35wINBTV%k^@)w_U)I zJkRdy3MC2)41|2FTX=vidK~gR98DlMtZ$ChQtpn`D9VSQq2t_dIyG05eYT#BEk-)i zcr4|#Rtp8legFKzA(6&FgSSjM&g$0=Her# z?OJ&hm7KAWAs#O7A~jt}jZ5LN>O}GEM0JqW`U}IV#XXgxr-E}I{)uFULD7jll(n;i z;m|Dc&YpV3Upn#>l!uZn*-3N3aki#r+Ma@fx;7&dP_>d6ZMsGU*UW~ZhO&m^Pun@S zQGFAsF?6(IZ!Y{Fz26E48Lz{}(e~i+dOjH#-{S^No8eF4?0|OZl?sSKPw``2gvxB*W5T7_6f-)@&(0gwH znL%c6+xP#`$N`A(_U=bIhI+%w5KwFs=UM_G`k2f@%^6rEk7w zKGyII3n89wwMSCh4I%eKH+}6ux~n)T5^Q;laa@9pixXE-HGRkR)Y}C3D3GO1prp=2 zyk9%us}a>&0zQu? zBuq&{f&`C&ED|D2Q))w=J<`~FLGS^!>xJ!>HZ4r6n8h@&{O*w{PT>niLNioYaG}~Ejyurej zu~F~~5$5@^AFA;b$)`s*(?=3HaV)If`a8DH**{Y3(XYkTD(XZCcIHZxSqPAzgb|Xt zm6g%RaNNHeh=QF;NuO zOcT?We*3@)WHb6hGU7?G|1)Qhk-z*DT;ZQGsT1&p{++=HgSU7(UGQjn9&`Qt|DH@* zj9=Jzj@Kh4dG6MbIzl2%J5zi2)wJ0>vivtB6N$xsk5^zT_X{@#vvQ8k^Xbt!z5RD> zRc}}z&7Hdc^Q&)=d8poquxh=0>zi?c;mYwR0fh+JOMTIieq15sk)5SiUmx#~f=Ky- zJz!3Xq+tHfNw3rYT{Ww3t0TJ6H8mSk(e;<(E{tiHzqH@@gFrDME4TXMMRv60 zx{R?Z+NU_#F~PJPV*8BFV>YH44l=PV!*N0vHCGbko~8)H{ApTadY<5CwYF`*6EV%H z@fIjgqh8qy;RtBXosWcO+-Yu%5Vz9(Z+ENgHK5KAM1&;{W^g#_g4AAKTfH>ftgb=DvPE)u>vc3m+40xh8fEd`;@A^0eQ(p~Q&UI7lFyaL!?P)g zC*s^9Hce&RJaP>m$;?702~xGA3F&XUwZ*qaf-Ji{VaZVY5kyw&-N<2c+$c%n{`{|> z7t25tVzeNmoR?gBXQsBkr_nRFgC`k8gr8`};s`RWVVBXTrE`ak$yDtMiX$z66lig1 zntZeHGH{!wSgqRDOQb%&P6$B5#->yhNAV6jl`*AEA`I*3wk;kQ89|+vF!!NZ&Pu90 z#`D_ot7YFSi7*;hfCh>GN(R-19I9c zDA1-W-2*%a>U&m9ztz95i|JW_vd&EN>WR~hUM2Y8ZYH_->%tD*R9)j+@|D$|i z(V&&Z^WefagG)1dj6rU*ayG9d;{834%8D0Al0Mx{*vSI=&iu>V z_{TwdA7r#a;gh_{(Y$}9eH%yz0L&-HsIfRU<(|wYZC*}%FibcmQ{6$56_7N!J%*ji zScE})(ccLdMb*wEyb^1TA;8$GzjVUR?sE2tc487@5EtLPxyotZR*p#rD|Nk4ps`a_ zVp94LxGX(jYvnkJG$l*S=_W?-QBNKwmy5|5LDKYkxh%ChUdo2g|G#aJQFnSa>3`Z3 z(SrrG3by~8^!@XtuSBGT|I=Pe^Zru)zkbYHS-3+B>a6N+I}d&|e#*?CGwaiZ8sws} z@%t_VX_iqc!!4~>I)PP6|126jpNOR+ZIBh{tl_mzA0T(r{$CFc{NRC{{3UfmL6ILK zGv&0j9%yg>hp2og4ZxJcd`c%P&rRQQd-U^=SE zfSDkR6JnSczY$}E%PX7gLAsC2Tga&mOEcXV*vu0M6< z!|x)&7aN96b&<}WMp<6V7>#gVV8@Vjue^eqW4!pU5|wfF)%CTgO%4*YSDjT1)%5M` zl%(jkbFv4F2zQoVA}PEv-v~>6gjZ=sIFbIDx6MofD$L_O(t|T-2|zZ{y9&;HE@z-K zjsUT-v$2ENK^&lJwqPU?x}s_}WQ+#bHPcf1q04rrX2`zMd3Y*p0Z>-c3Y--Z)Ixx} z4|zOu8mpRq*efkgAxS~fM1<*KV{@ZZUrj%uf!JOF$y zK{-DHO08oH8xPA}cXrn`?G6{aFfL8DTg$2Y(PHv_6M`dBA0*7o+@AA?6}TY) z&rX`3!Bw6M;KZx!3|V6Qq#faj7U0|N{wbg}l})Xje6Q;fr<&?j zRLX$;e*z58_-PTb(LbRb=y$FZLnC|YEKt7CWQ|GZv1c=9RGoEiE7ZQsohi%}oWQpS z=XA?e&O)-L>5DZK@;O&om&~Iz4wlcc zgPGG5%vIHt&qUY%bS$~+tB}bqF5s;krDOMDSD%sHH4ie|clsISBv=}}r$*~*)*W=F z?orUHTg}t-oU|$~#~!wN;80iD*;kr!m|7gyOQ)oE*=|I`Zn~fgvq(=1gj!Cp7dOtG zZCt_U>o44Q6PdL9jw`L2j>C4VZztk!o5LjBk2ag5v4#2K9w9JIjpMnKp@!?R=IOI- zos_|wo65u#NLdIyxgTM4r0wYgI%-=C(yiG8}=ZGDj7 z?~Notr93Hox`2Lq`Upakg=*9rUAi7?%B6m>$!=8T^a`*q*$&q07?* zFg--;jFAds$nQ&s9eGO4eYi3kE+7$fBaJEkv;uIgBLvT_k_vM6VP^%ng3bJg|iDn8Ml4e9p z$cD$HHt{NGze&j^I%EsyoC2EY6sH%`Dw1c{Y74(^5!O26VbeMtYg%TZKHuVPpC=Ai zr;4s|6<%lh561AW+p_xw_oAkUu!?2OnS7Gnrb*pDCZHXpW;J))M$>jE0G<1Ap02_c zZG3mztj_V*??B9Jl>ffkEi!*o$kXLM-m8>*y@dQ?gd$-%xboSMfr)Fdo6@? z%}xoLyZukai#1G!p~pn?R&+- zO?jFJ>|FHVZ1=e_2ag#07Zan7z!cJWJvV~B8R8l}!*5$I3TTiQ>GxvrJ^^-^%E zp5u6WBxT!^KLTGlUEZ=fqNRyD9%?^1nKvZ&*YWa~!zh11C;G+nUPlEnbR@Ty6=1C9 zO1Y-VU-8Vny-_)Q33)QVg6>o!f_SB`RAtw^Kz~RfXqe`A<4$O_)6-Q;=?ljGJz&sn zvaLqUZrq;hqtHy*X#mOs*C1A;W*!H_o1Omr4XD`(U#hf4+_r@_dd;|oDIdSMYZGWz zrl}5z7N}PjjCzh=xo|UD#dj>BRc$`)oJUSkTasU?)Wo>_`@KMBQTl?fGg#59#Yyak z#o&(wr6>07-C@d5DQbz+*W8o>5?~}v+PHx;j1Ix6laFMOa;!v}H+-WHOcSn!VeS@~ zY+Glc^@U;MQn*^;@%O-xtV)~#|4EZ(<|3>^d07G)JJ_wd(=qdIk;kZcVWgP>Wkqn- zi+c1{4{x%;%8F9dPdO|TLsaHErGorvzaPawhj_{Ox4L5Ln0(=}=!MTs4R3BG4WKMG~O1!IX+Q4g-@vYt8{9jj(}O zIb!C}faLX>tg3yw^MG{;hn<9~)6ahLzAjmEM%>Rckq~iJK3ok5F{i`BvV_>b;``7y zll}hFJm-p7U!;xudyIjKG$iY_UuKZK)6m6}o=$XNR*Ns~dHoa*S8=&-TO6Y zU!iBpW}6O=F+juKZ4D{Fy%#}<4m>g!HAs8aG>LA0;DGggSo8O+zO8!KRNJ|zv^x>+ zf3Ac49R#L^Dq~veRiTAYC}mL4b(9f2;2E~zxHb_~F)WJ94Lm5zVF4_!j#vru>Ou;y z<;NO~n+w8cfg<;4i`hCd$R}i==5@6|U;DemJ0Z+Mk5EmJzWy7RlB(`C8jMzGMSMRK z;Lf3O$Brjt=~Dw(D}ga8SL^n#=Zk&YK0EiEfEK~1Vy&cYq|+McOXOC|X^^;3+O(Oa zGSl>m?0}L<9QV9X&?iN_iHtXhQhs~z#LtVT((3Qj`#NGt5TNL%@QFJ#C~C9Ns&UrU z2TVXAgHwbzEL%|(H~&6aJ4Kd#%O34}s<-r{$AQJnwe#NrX68|Wt|M`|12Ej?XrSlS z)1&_Tv%+y3y($=*&X~$>gkkcr_-u|d;rBd@`(kB|kdXcwtu=6DXn35@HhI}e1z#`~ z_Ja)5)PC&|?B_EK6s~z;YYQeWs|IR5(8FD`wYjk1_pi(28bsI&b5T(Zvs&vLO}lj= zAwZ-wxgxZ}n(1Rq2tMnt!^l8)W3QFF>r#(4ophi{?sr8z*T7f6yrX{IqR3mpm|9N! z0~%wC-y0?hl<`DfgTPX`2o;#NIi%4S{WY6DwSY z_30qj7rSwy2or6ZAJIhENp1#e8^gkwQumQT^)qJlqMiEJ&S@8W%x|AvXH46iq=}sq zgXbXuf7x$GtV6L8$dNpSMdL=UR1?>FW@D73F`4GJt15VisJ%Q98b47U$ka-}$H z5b3(S7bH*2yyQp7_mxz+=^u_0U7kP1_2$ea>~0$!*&v=&R#EJVb>fo}Z`PG|5_Eh% z2jt0lh+P~Nak0%SZY}wHLp_PiS^Oz08<-=$iCLW|SvGF2O~gmo*X(}rZA|mKR*_$b z+V{1niU;kHs;*wyF0yG=a`Hu>mGv79Oi|Sm9#k!z$exBts01ke6GIM0X)boLpp(yP zq9WZnkw9bgs!kV|3N5q}oqmjjFrG+aT`T)57|+GlsF7nFQO?L~YctaO>Z_n-$7J5r z#m&!;o;p*a)91Jn9nGUq6OI02MK%@Uv-qg>&s_Cr%llqeT81l6v~MdUVQz);Ws47#F9X(YP}QRNzf<4p`B^qhO$+E@+`IYhd6KjVa1sKk?Q?;Ok!9IWuDM51spOGvW6A&TbEc?YY4LyuXrV*NH6rH|N`d%I(ROX#vzpnvJKr zI};%W{4;>_wi_%MAMcwtX#ig(=+sF=z>V+TmDesTRTojT%M!;0KkM6=*qGb+zwt6W z>X=*V?d1CJi;TPV;6y-~^v@gK&cz>5(#(l{^btoS5(fj2*5=_(wi2rg`tea$)>!EG zd>g6=gSpjT+p7dA7#N}`z*B0bZqIZvR6&xT=gHgDz(u?0zUmHA<1{X<@Wn<@3ohH@ zjQRRsBkF(=hxU1nABvMI+8(oqTD^fj{Mb<+Z+mS)@je3LSz zXm}EcfE2qwJ9_(y6<_uUnEpkr#LJd992_j>z)J!0@Efg;Q{D)Az@(c|966qjwRm>o z;G2ap&|J84T~3}~L7xo`E`mFx2Kz>9^jx+E&|_7<{VS5#zeJ4v=ZpV=zxJQS`Oo6~ zKl?{Lt8?;n_~S0CTKx&c@c#-$X}Vzt)bG~Qg>qaCCidSAHmSzoUv;_)r`@Lm(yiRe zP`)=&?i>P%_Nk^C1uP^edf>nfwtbp%sysGJIRZqG3rWg$G#6XF1EnZoc3h^vkbzp@ zDwX$Y1KRdyi#&a0lj=En-X*W5!H4(H9ovV7s1xS4i&u$6-Y`Y-&!E(E*lup4YeTNUd7frJ$}5jI&$X6VVwTMwU{Od@diEbtQU^)+yTz> zy&=cDkS6RIUj(+Tq(MtzbQ5kSe}2yNIBoyfD?vnM8+@>vrtb3-ockE7z1jCxT1CvU z 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 Fe*pk!o(); - await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", new ChatResponseModel() + var json = JsonSerializer.Serialize(new ChatResponseModel() { ConversationId = conv.ConversationId, MessageId = message.MessageId, @@ -114,7 +113,8 @@ public class ChatHubConversationHook : ConversationHookBase LastName = "Assistant", Role = AgentRole.Assistant } - }); + }, _serializerOptions); + await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", json); await base.OnResponseGenerated(message); } diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 0e9bbd5e..718ca4bc 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -52,7 +52,7 @@ "MaxRecursiveDepth": 3, "LlmConfig": { "Provider": "azure-openai", - "Model": "one" + "Model": "gpt-35-turbo" } }, diff --git a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json index a5e40a9f..af5d7e1a 100644 --- a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json +++ b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json @@ -4,9 +4,5 @@ "createdDateTime": "2023-08-18T14:39:32.2349685Z", "updatedDateTime": "2023-08-18T14:39:32.2349686Z", "id": "01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a", - "isPublic": true, - "llmConfig": { - "provider": "azure-openai", - "model": "one" - } + "isPublic": true } \ No newline at end of file diff --git a/src/web-live-chat/src/lib/helpers/typedefs.js b/src/web-live-chat/src/lib/helpers/typedefs.js index e4246b3e..1997ab14 100644 --- a/src/web-live-chat/src/lib/helpers/typedefs.js +++ b/src/web-live-chat/src/lib/helpers/typedefs.js @@ -66,8 +66,7 @@ IRichContent.prototype.rich_type; IRichContent.prototype.text; /** - * @typedef {IRichContent} TextMessage - * @implements {IRichContent} + * @typedef {Object} TextMessage * @property {string} text * @property {string} rich_type */ @@ -81,7 +80,7 @@ IRichContent.prototype.text; */ /** - * @typedef {IRichContent} QuickReplyMessage + * @typedef {Object} QuickReplyMessage * @property {string} text * @property {string} rich_type * @property {QuickReplyElement[]} quick_replies diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte index 4ce81b2c..b84ada86 100644 --- a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte +++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte @@ -176,7 +176,11 @@ {#if message.rich_content.message.rich_type == 'text'} {:else if message.rich_content.message.rich_type == 'quick_reply'} - + {/if} {/if} diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte index 45697302..d6bd4feb 100644 --- a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte +++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte @@ -1,12 +1,32 @@ {message.text}

{#each message.quick_replies as reply} - + {/each}
\ No newline at end of file